2014-02-15 63 views
0

免责声明:这是一个家庭作业问题,所以我不想让你告诉我答案。相反,我需要帮助了解代码的工作原理。如果这是不允许的,那很好,我可以把它或任何我需要的。 我想要做的是理解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 
+0

记住AT&T的语法是愚蠢的和倒退 - 'eax'最初是_load_堆栈。 – Notlikethat

+0

所以你需要一个提示:堆栈被用于两件事,一个是(如你所说)存储自动(局部变量在一个函数内),另一个是'call'行可以帮助你。 – abligh

+0

我很确定这是intel语法,虽然 –

回答

0

记住在i386上,函数参数在堆栈上传递可能会有帮助。在函数入口处,如果你在堆栈指针的地址处读取内存字,你会发现调用者的返回地址。

看起来你的神秘功能在这里有两个参数。所以,当它说

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

一旦0x2c上已经从堆栈指针中减去,我们可以在*(esp + 0x2c)找到来电者的保存EIP,我们可以在*(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

*编辑 没关系..... –