intel彙編幾種跳轉的區別

幾種跳轉指令和對應的機器碼

0xE8    CALL    後面的四個字節是地址

0xE9    JMP    後面的四個字節是偏移

0xEB    JMP    後面的二個字節是偏移

0xFF15    CALL    後面的四個字節是存放地址的地址

0xFF25    JMP    後面的四個字節是存放地址的地址
比如想實現循環跳轉當前指令,就可以是eb fe,或者e8 fb ff ff ff

0x68    PUSH    後面的四個字節入棧

0x6A    PUSH    後面的一個字節入棧

shellcode跳轉回原始OEP方法一

大部分人比較喜歡直接jmp跳轉到原始oep,這時候一般都用e9跳轉,e9後面的四個字節是一個偏移地址。
計算公式: 偏移地址 = 目的地址 - 跳轉基地址(jmp的下一條指令的地址)
也就是 原始OEP - jmp的下一條指令的地址

db    0e9h        ;這是jmp
OEPOffs:
dd    ?        ;這裏是4個字節 未初始化


偏移地址 = 原始OEP - (offset OEPOffs + 4)  爲什麼+4 因爲OEPOffs標號向後偏移4個字節 纔是jmp的下一條指令地址  也就是跳轉基地址

shellcode跳轉回原始OEP方法二

有些人用 push oep然後jmp dword ptr [esp]的方法跳回原始oep,這時候shellcode要這樣寫:

db    68h
OEP:
dd    ?
jmp dword ptr [esp]


68h是 push後面四個字節的意思  dd ? 聲明瞭四個字節,然後通過OEP標號,定位到這個位置,然後把原始OEP寫進去就可以了

參考資料https://blog.csdn.net/wzsy/article/details/17163589 

發佈了168 篇原創文章 · 獲贊 17 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章