彙編語言中call和ret指令必須成對出現嗎?
01-21
此題中next過程沒有ret,那執行完pc怎麼知道下一步幹什麼,還有第一問的答案說eax中存的是pop這條指令的地址,不是上文中call指令的下一條指令的地址么,怎麼成了next過程pop指令的地址,答案里是這麼說的
http://x86.renejeschke.de/html/file_module_x86_id_26.html
好好看文檔。call addr = push eip + jmp addr
看的是 CSAPP 吧。ret 的作用是棧頂元素(程序斷點地址/返回地址,即 call 指令之後那條指令的地址)彈出賦給 eip,相當於返回斷點繼續執行。此處沒有 ret ,就是接著順序執行程序(因為沒有需要返回的斷點)。call 的下一條指令就是 pop,所以說 eax 中存的是 pop 這條指令的地址。你需要理解 next 只是個標號,彙編之後標號被刪除,call 後的 next 被替換成相應的地址。這裡看不懂可以去複習一下彙編。
不必,我們寫殼經常用來混淆視聽,call 過去了之後把esp提高就ok了,反正方法很多,不必墨守成規
這個應該是獲取eip的地址,就是獲得當前執行的彙編碼的地址
其實,call處理一下是可以當成jmp來用的。有的殼會故意搞這種幺蛾子,以擾亂調試器,迷惑破解者。
這段代碼的作用就是把pop eax這句指令的地址交給eax,看似沒什麼用處,其實是shellcode編碼的慣用代碼,因為shellcode的載入位置不定,但是很多時候還需要知道它到底跑在哪個地址了,因為某些指令或者函數調用時需要提供絕對地址,這樣一來就能從EAX里里獲得代碼的載入地址了。回到題主的問題,CALL和RET未必要成對出現,只要你確信知道你的代碼到底在幹啥,保證代碼能正確運行,就不必拘泥固定的套路。
推薦閱讀:
※關於CSAPP第12章並發編程的一個例子的疑惑?
※做CSAPP遇到點問題,希望能指點一番?
※如何取得32位無符號數二進位表示是否含有奇數個1?