我需要为一个漏洞演示制作一个跳转操作码。
我需要在跳转指令后跳转到大约200个字节。这对jmp short
来说太过分了。
如果我使用常规跳转生成操作码,jmp $200
我得到了这个:
e9 fb 01 00 00
这里的问题是操作码包含00,当将字符串传递给程序时,它被解释为字符串的结尾(因此我无法将完整的shellcode传递给它)。
我认为我的方法被搞砸但是I checked the manual然后在第二行显然有一个"接近跳跃"这需要2个字节(还有另外一个需要4个字节的字节,我上面显示的那个字节)。这两个跳转都以相同的字节e9
开始。
如何将e9 fb 01
作为仅接受两个字节参数的近跳转传递?如何防止操作系统在e9
之后查找四个字节,即:e9 fb 01 90 90
?
答案 0 :(得分:6)
你不能。
当处理器在32位模式下运行时,0xE9操作码使用32位偏移量,而当处理器处于16位模式时,则使用16位偏移量。
答案 1 :(得分:2)
如果你有权访问shellcode中的当前EIP地址,并且内存区域是可写的,你可以这样做:
; say in ECX you have shellcode start address
; (calculated with delta offset etc.)
_start:
...
; ECX = offset _start
; decrypt zero bytes in jmp instruction relative address
; 80 69 xx AB
sub byte ptr[ecx+(_fix1-_start)], 0ABh
; 80 69 xx+1 BA
sub byte ptr[ecx+(_fix2-_start) + 1], 0BAh
; jmp instruction with those 00s encrypted
_jmp db 0E9h, 0FBh, 01h ; first 3 bytes of jmp near instruction
_fix1 db 0 + 0ABh ; encrypted displacement (last 2 bytes)
_fix2 db 0 + 0BAh
因此jmp near
指令中编码的相对地址不包含00,但在运行时会恢复这些字节。
请记住,如果与计算(_fix1-_start)
的差异包含零,则解密指令也可能包含00,如果生成的指令是sub [r32 + imm32],imm8的长格式,则更可能是这样,所以也可以手动检查。