retn 4
是個函數返回指令。
以前一直糾結這個retn的寄存器操作順序,手頭正好在調試,詳細跟了一下,豁然開朗,特分享。
先假設個環境:
retn 4未執行時,ESP=0013feb8;EIP=5d1d8b97;而[0013feb8]=7c974a19
執行retn 4之后:
首先
EIP=[0013feb8]
:即此時cpu先指揮EIP獲取到棧中0013feb8起4個字節的值7c974a19,作為retn跳轉的目標,然后cpu跳過去等着執行7c974a19地址下的命令。
此時,EIP=7c974a19
然后
因為retn 4里面有個4,此時cpu才讓ESP棧+4+4,使得ESP=0013fec0。
為啥出現兩個+4?另一個+4的原因在於:如果命令是retn,而不是retn 4,那ESP將當前值(0013feb8)給了EIP之后,自動會來一個+4,即ESP會為0013febc。
總結下來:
retn操作:先eip=esp,然后esp=esp+4
retn N操作:先eip=esp,然后esp=esp+4+N