幾種跳轉指令和對應的機器碼
0xE8 CALL 後面的四個字節是地址
0xE9 JMP 後面的四個字節是偏移
0xEB JMP 後面的二個字節是偏移
0xFF15 CALL 後面的四個字節是存放地址的地址
0xFF25 JMP 後面的四個字節是存放地址的地址
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寫進去就能夠了shell