ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это проблема домашних заданий, поэтому я не хочу, чтобы вы просто сказали мне ответ. Скорее мне нужна помощь, чтобы понять, как работает этот код. Если это не допустимо, тогда все в порядке, я могу взять это или все, что требуется от меня. То, что я пытаюсь сделать, это понять 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
Помните, что синтаксис AT & T является глупым и назад - 'eax' _loaded_ из стека изначально. – Notlikethat
Итак, вам нужен намек: стек используется для двух вещей: один из них (как вы говорите), хранящий автоматику (локальные переменные внутри функции), а другая линия «вызов» может вам помочь. – abligh
Я вполне уверен, что это синтаксис интеллекта, хотя –