免责声明:这是一个家庭作业问题,所以我不想让你告诉我答案。相反,我需要帮助了解代码的工作原理。如果这是不允许的,那很好,我可以把它或任何我需要的。 我想要做的是理解x86(Intel)。我只是在学习它,而且发生了很多事情,我经常发现自己盯着没有进步的屏幕。有什么能帮助我的是问我导致答案的问题,而不是给我答案。我知道这不是一个讨论论坛,所以也许有人可以指出我的位置,很高兴帮助我解决这个问题。分析gdb拆卸
我到目前为止所了解的是,空间是通过子指令在堆栈上分配的。 然后无论在eax中移动到堆栈。那么mov和lea的组合会让我困惑。我的直觉告诉我,指针将被存储在堆栈中以备后用。或者说它可能是某种数字函数,正在我提供的数字上执行。在函数开始时,我发现eax有我输入的数字。 我发现的另一件事是做x/s 0x804a819给了我“%d%d%d%d%d%d”。这是否将六个数字移动到0x4(%esp)?我从movl指令中找到地址0x804a819。 就在调用sscanf之前,有mov%eax,(%esp) 我假定程序正在保存堆栈指针的位置供以后使用?我曾尝试过的一件事是在调用0x80488d0 < __isoc99_sscanf @ plt>执行后,我做了p $ eax = 0x7,以便指令cmp $ 0x5,%eax设置正确的标志,以便指令jg 0x80495b5跳过调用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'最初是_load_堆栈。 – Notlikethat
所以你需要一个提示:堆栈被用于两件事,一个是(如你所说)存储自动(局部变量在一个函数内),另一个是'call'行可以帮助你。 – abligh
我很确定这是intel语法,虽然 –