2014-02-15 64 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

*編輯 沒關係..... –