2014-02-15 3 views
0

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это проблема домашних заданий, поэтому я не хочу, чтобы вы просто сказали мне ответ. Скорее мне нужна помощь, чтобы понять, как работает этот код. Если это не допустимо, тогда все в порядке, я могу взять это или все, что требуется от меня. То, что я пытаюсь сделать, это понять x86 (Intel). Я просто изучаю его, и происходит так много, что я часто вижу, что смотрю на экран, не добиваясь прогресса. Что мне поможет, я задаю МЭ вопросы, которые приводят к ответу, а не дают мне ответ. Я знаю, что это не дискуссионный форум, поэтому, возможно, кто-то может указать мне на место, которое было бы рад помочь мне с такой проблемой.Анализ gdb разборка

То, что я понимаю до сих пор, состоит в том, что пространство выделяется в стек инструкцией sub. , то все, что находится в eax, перемещается в стек. то комбинации mov и lea меня смущают. Моя интуиция подсказывает мне, что указатели хранятся в стеке, которые будут использоваться позже. Или что это может быть какая-то математическая функция, выполняемая по числу, которое я предоставил. В начале функции я обнаружил, что eax имеет номер, который я вводил. Еще одна вещь, которую я обнаружил, - то, что x/s 0x804a819 дал мне «% d% d% d% d% d% d». Перемещает ли это шесть чисел в 0x4 (% esp)? Я нашел адрес 0x804a819 из инструкции movl. Как раз перед вызовом sscanf есть mov% eax, (% esp) Я предполагаю, что программа сохраняет положение указателя стека для последующего использования? Одна вещь, которую я пробовал, - после выполнения вызова 0x80488d0 < __isoc99_sscanf @ plt>, я выполнил p $ eax = 0x7, чтобы команда cmp $ 0x5,% eax установила правильные флаги так, чтобы команда jg 0x80495b5 пропустила вызов explode_bomb , Но независимо от того, какой вызов вызывается explode_bomb. Поэтому я уверен, что чего-то не хватает, и, возможно, даже не в этой функции.

Другие вопросы. Функции локальных переменных хранятся в стеке правильно?

sub $0x2c,%esp 
mov 0x34(%esp),%eax 
lea 0x14(%eax),%edx 
mov %edx,0x1c(%esp) 
lea 0x10(%eax),%edx 
mov %edx,0x18(%esp) 
lea 0xc(%eax),%edx 
mov %edx,0x14(%esp) 
lea 0x8(%eax),%edx 
mov %edx,0x10(%esp) 
lea 0x4(%eax),%edx 
mov %edx,0xc(%esp) 
mov %eax,0x8(%esp) 
movl $0x804a819,0x4(%esp) 
mov 0x30(%esp),%eax 
mov %eax,(%esp) 
call 0x80488d0 <[email protected]> 
cmp $0x5,%eax 
jg  0x80495b5 <read_six_numbers+76> 
call 0x804941c <explode_bomb> 
add $0x2c,%esp 
ret 
+0

Помните, что синтаксис AT & T является глупым и назад - 'eax' _loaded_ из стека изначально. – Notlikethat

+0

Итак, вам нужен намек: стек используется для двух вещей: один из них (как вы говорите), хранящий автоматику (локальные переменные внутри функции), а другая линия «вызов» может вам помочь. – abligh

+0

Я вполне уверен, что это синтаксис интеллекта, хотя –

ответ

0

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

Похоже, что ваша функция тайны здесь принимает два аргумента. Поэтому, когда он говорит

sub $0x2c,%esp 
mov 0x34(%esp),%eax 

После 0x2c был вычтен из указателя стека, мы можем найти сохраненное EIP звонившего в *(esp + 0x2c), мы можем найти первый аргумент в *(esp + 0x30) и мы можем найти второй аргумент в *(esp + 0x34). Вы можете увидеть ссылку на этот второй аргумент здесь,

movl $0x804a819,0x4(%esp) 
mov 0x30(%esp),%eax 
mov %eax,(%esp) 
call 0x80488d0 <[email protected]> 

Это хранит адрес вашей форматной строки в адресе (0x804a819) при * (ESP + 4) - так, что собирается быть вторым аргументом sscanf() , Затем он загружает первый аргумент вашей тайной функции (в *(esp + 0x30)) и сохраняет его на *(esp) - так что это будет первый аргумент sscanf().

Надеюсь, этого достаточно, чтобы понять функцию, не будучи слишком полезной. :)

+0

* изменить неважно ..... –

Смежные вопросы