几种跳转指令和对应的机器码

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写进去就可以了