首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JMP rel16 (而不是JMP rel32)

JMP rel16 (而不是JMP rel32)
EN

Stack Overflow用户
提问于 2015-01-22 22:29:39
回答 2查看 2.4K关注 0票数 2

我需要做一个跳转操作代码的利用演示。

在跳转指令之后,我需要跳到大约200个字节。这对jmp short来说太大了。

如果我生成一个具有规则跳转的操作码,jmp $200将得到以下内容:

代码语言:javascript
复制
e9 fb 01 00 00

这里的问题是,操作码包含00,当将字符串传递给程序时,它被解释为字符串的结尾(因此,我不能传递包含这个字符串的完整外壳代码)。

我以为我的方法失败了,但是我查了手册,在第二行中,显然有一个“近跳”,它需要2个字节(还有另一个要花费4个字节,我在上面展示了一个)。这两个跳转都是以相同的字节e9开始的。

如何将e9 fb 01传递为只使用两个字节参数的近跳?如何防止操作系统在e9之后查找四个字节,即:e9 fb 01 90 90

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-22 23:00:18

你不能。

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

票数 6
EN

Stack Overflow用户

发布于 2015-01-23 00:09:04

如果您可以访问外壳代码中的当前EIP地址,并且内存区域是可写的,那么您可以这样做:

代码语言:javascript
复制
; 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指令中编码的相对地址不包含00s,但是在运行时,这些字节将被恢复。

请记住,如果与计算(_fix1-_start)的差异包含0,则解密指令也可能包含00s,如果生成的指令是长形式的子r32 + imm32,imm8),则更可能如此,所以也手动检查它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28099835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档