匯編指令之JMP,CALL,RET(修改EIP的值!!!)


  簡單介紹了,JMP指令按市面上的意思來說是跳轉到指定地址,但我這里不這么說,JMP, CALL, RET三個指令均為修改EIP值的指令,EAX, ECX, EBX, EDX, ESP, EBP, ESI, EDI,這8個寄存器的值均可以用mov指令來修改里面的值,EIP行不行呢?我們實際測試一下。

版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-09-06,20:23:27。
作者By-----溺心與沉浮----博客園

一、JMP指令

 

 

我們發現,指令違法,說明,EIP的值不允許通過MOV指令來修改, 但是可以通過什么辦法來修改呢?就是我們的標題咯,就是這三條指令,到這里,相信你明白我為什么會說JMP, CALL, RET指令是用來修改EIP的值了吧,如果不明白,請接着看我下面的演示。

 

 

 我們在0x4010000輸入如下代碼:

1 JMP 0x401052

 

在0x401052處輸入如下代碼:

1 JMP 0x401007

 

我們這兩行代碼輸入進去,OD會自動幫我們轉化成圖中左邊兩個框中的代碼,具體為什么要這樣,我們這里先不做解釋

JMP指令的作用就是無條件的修改EIP的值,我為什么不說是“跳轉”,我們熟悉的詞語呢?因為決定程序往哪跳轉,這不是JMP做的,它所做的就是無條件去修改EIP的值,我們可以去理解成“MOV EIP, 0x00401052”, "MOV EIP, 0x401007", JMP將EIP的值修改完成過后,CPU會根據EIP里面的值決定程序往哪跳轉,這件事是CPU決定的。我喜歡“庖丁解牛”,因為只有了解到了本質,我才覺得我是在學東西,就是push,pop,很多人也只是知道是壓棧,出棧,知道了這個有什么用呢?只是知道怎么去用而已,萬一如果出現

1 MOV DWORD PTR DS:[ESP-4],ESP 2 SUB ESP,4

 

版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-09-06,20:23:27。
作者By-----溺心與沉浮----博客園

 

我們還能做到認識push嗎?我相信只有“庖丁解牛”,長期這樣去認知高級指令,經過一定時間積累,我們看到變形的指令時,我們也能一眼認出它,

我們執行上面OD中寫入的兩行JMP指令,看看寄存器有哪些變化,為了方便觀察,我這里已經將EAX, ECX, EDX, EBX, ESI, EDI的值分別修改成了0x1,0x2,0x3,0x4,0x5,0x6,ESP, EBP不要動!這兩個代表這棧頂與棧底。

 

 

 經過觀察,我們發現只有EIP的值發生了改變,其他的寄存器並無發生變化,再執行第二條JMP指令

 

 

 JMP指令執行完過后,可以發現它除了EIP寄存器外,它不影響任何寄存器的值,也不影響EFLAG的值

 

二、CALL指令

  CALL指令,首先將程序運行的下一地址壓入堆棧,並修改EIP的值,我們看如下例子,首先我們將EAX, ECX, EDX, EBX, ESI, EDI的值分別修改成了0x1,0x2,0x3,0x4,0x5,0x6,ESP, EBP不要動!然后輸入下面指令

1 CALL 0040101C

 執行CALL 0x40101C

 

 CALL指令發生跳轉的時候,下一行地址,也就是要回來的地址,並不是在它原有的基礎上+4,而是看它旁邊有幾個字節

 

 

 如果是第一個紅框中所標,那就是2個字節,如果是第二個紅框所標,那他就是5個字節,這里涉及到硬編碼,大家就先知道是個什么回事就行

 根據圖中變化所示,我們可以清晰的看到,執行CALL 0x40101C指令時,0x401000下一行地址0x401005被壓入棧中,ESP的值減4,原先ESP的值是0x0018FF8C,EIP的值也變成了0x0040101C

三、RET指令

  RET指令會將ESP的值POP出來,然后修改掉EIP的值

 緊接上圖,我們執行0x40101C處的RET指令,仔細觀察ESP,EIP的值,並觀察ESP所代表的的內存編號的值得變化

版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-09-06,20:23:27。
作者By-----溺心與沉浮----博客園


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM