幾種跳轉指令和對應的機器碼
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寫進去就可以了