免責聲明:這是一個家庭作業問題,所以我不想讓你告訴我答案。相反,我需要幫助瞭解代碼的工作原理。如果這是不允許的,那很好,我可以把它或任何我需要的。 我想要做的是理解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語法,雖然 –