Arhn - архитектура программирования

Чтение ассемблерного кода x86

Я работаю в лаборатории, где мне нужно обезвредить «бомбу», предоставляя правильный ввод для каждой фазы. У меня нет доступа к исходному коду, поэтому мне нужно выполнить код сборки с помощью GDB. Сейчас я застрял на фазе 2 и был бы очень признателен за помощь. Вот ассемблерный код x86 — я добавил несколько комментариев, которые описывают, что, по моему мнению, происходит, но они могут быть ужасно неправильными, потому что мы только начали изучать ассемблерный код несколько дней назад, и я все еще не совсем уверен. Насколько я могу судить прямо сейчас, эта фаза считывает 6 чисел от пользователя (это то, что делает read_six_numbers) и, кажется, проходит какой-то цикл.

0000000000400f03 <phase_2>:
400f03: 41 55                   push   %r13                         // save values
400f05: 41 54                   push   %r12
400f07: 55                      push   %rbp
400f08: 53                      push   %rbx
400f09: 48 83 ec 28             sub    $0x28,%rsp                  // decrease stack pointer
400f0d: 48 89 e6                mov    %rsp,%rsi                   // move rsp to rsi
400f10: e8 5a 07 00 00          callq  40166f <read_six_numbers>   // read in six numbers from the user
400f15: 48 89 e3                mov    %rsp,%rbx                   // move rsp to rbx
400f18: 4c 8d 64 24 0c          lea    0xc(%rsp),%r12              // ?
400f1d: bd 00 00 00 00          mov    $0x0,%ebp                   // set ebp to 0?
400f22: 49 89 dd                mov    %rbx,%r13                   // move rbx to r13
400f25: 8b 43 0c                mov    0xc(%rbx),%eax              // ?
400f28: 39 03                   cmp    %eax,(%rbx)                 // compare eax and rbx
400f2a: 74 05                   je     400f31 <phase_2+0x2e>       // if equal, skip explode 
400f2c: e8 1c 07 00 00          callq  40164d <explode_bomb>       // bomb detonates (fail)
400f31: 41 03 6d 00             add    0x0(%r13),%ebp              // add r13 and ebp (?)
400f35: 48 83 c3 04             add    $0x4,%rbx                   // add 4 to rbx
400f39: 4c 39 e3                cmp    %r12,%rbx                   // compare r12 and rbx
400f3c: 75 e4                   jne    400f22 <phase_2+0x1f>       // loop? if not equal, jump to 400f22 
400f3e: 85 ed                   test   %ebp,%ebp                   // compare ebp with itself?
400f40: 75 05                   jne    400f47 <phase_2+0x44>       // skip explosion if not equal 
400f42: e8 06 07 00 00          callq  40164d <explode_bomb>       // bomb detonates (fail)
400f47: 48 83 c4 28             add    $0x28,%rsp
400f4b: 5b                      pop    %rbx
400f4c: 5d                      pop    %rbp
400f4d: 41 5c                   pop    %r12
400f4f: 41 5d                   pop    %r13
400f51: c3                      retq  

Любая помощь очень ценится - особенно совет о том, как я буду переводить что-то подобное в код C. Заранее спасибо!

16.04.2016

  • Какой у Вас вопрос? 16.04.2016
  • Не переводите это буквально на C. Научитесь мыслить с точки зрения реализации алгоритмов с точки зрения изменений в регистрах и памяти. C и asm — это просто разные способы выражения того, что вы на самом деле хотите, чтобы машина делала. Каждая инструкция вносит четко определенные изменения в архитектурное состояние машины, так что просто следуйте этой цепочке шагов и смотрите на результат. 16.04.2016
  • Извините, если я был неясен. Мне просто нужна помощь в понимании того, что делает ассемблерный код. 16.04.2016
  • «Мне просто нужна помощь в понимании того, что делает ассемблерный код» — просто? Вот примерно все упражнение. 16.04.2016

Ответы:


1

особенно совет о том, как я буду переводить что-то подобное в код C

Не переводите его буквально на C.

Научитесь мыслить с точки зрения реализации алгоритмов с точки зрения изменений в регистрах и памяти. C и asm — это просто разные способы выражения того, что вы на самом деле хотите, чтобы машина делала.

Каждая инструкция вносит четко определенные изменения в архитектурное состояние машины, так что просто следуйте этой цепочке шагов и смотрите на результат. Любой хороший отладчик (например, gdb в режиме layout reg) может показать вам, какой регистр был изменен при выполнении одного шага. Руководство insn ref (ссылки в x86 tag wiki ) имеет полную документацию о том, что именно делает каждая инструкция.

Если вас когда-нибудь что-то удивило, поищите. Есть много ТАКИХ вопросов от людей, которые этого не сделали, а затем отправили глупые вопросы о результатах div, когда они сначала не установили rdx.


Вам нужно найти связь между insns, которые изменяют или перезаписывают регистр или ячейку памяти, и более поздними инструкциями, которые считывают из этого регистра или ячейки памяти.


Вы часто можете получить подсказки из того, как используется регистр, например. add $0x4,%rbx, вероятно, является приращением указателя к int *. Редко увеличивается 64-битное целое число на 4, если оно не является указателем или каким-то образом участвует в адресации памяти.

Если вы посмотрите на окружающий код и обнаружите mov 0xc(%rbx),%eax (загрузка 4B со смещения от %rbx), это подтвердит теорию о том, что это указатель.

cmp %r12,%rbx / jcc говорит вам, что это также часть условия цикла, и что %r12 является конечным указателем. Вы проверяете, что это всего лишь простой цикл do{}while(p < end), проверяя, что %r12 не изменяется в цикле и что он инициализируется чем-то разумным перед циклом.


mov $0x0,%ebp говорит вам, что это вывод компилятора из -O0 или -O1, потому что каждый компилятор x86 знает оптимизацию "глазка", которая xor %ebp,%ebp лучший способ обнулить регистры. К счастью, это похоже на вывод компилятора -O1, поэтому он не сохраняет все в память после каждого оператора C и перезагружает после этого. Это делает код трудным для понимания, потому что значение не остается в одном и том же регистре долго.


Если у вас есть какие-либо конкретные вопросы об этом двоичном коде бомбы, вы должны задать их. Я только что ответил на часть «как читать asm».

16.04.2016
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..