几种跳转指令和对应的机器码
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写进去就可以了