JMP rel16(而不是JMP rel32)

问题描述 投票:2回答:2

我需要为一个漏洞利用演示制作一个跳转操作码。

我需要在跳转指令后跳转到大约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

assembly x86 exploit opcode
2个回答
6
投票

你不能。

当处理器在32位模式下运行时,0xE9操作码使用32位偏移,而当处理器处于16位模式时,0xE9操作码使用16位偏移。


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)的差异包含零,解密指令也可能包含00s,更可能的是如果生成的指令是子[r32 + imm32],imm8的长格式,那么也要手动检查它。

© www.soinside.com 2019 - 2024. All rights reserved.