首页
社区
课程
招聘
[求助]请教如何动态的写汇编jmp指令
发表于: 2009-4-12 10:16 5428

[求助]请教如何动态的写汇编jmp指令

2009-4-12 10:16
5428
在目标进程里用VirtualAllocEx申请一段空间,原程序通过jmp 到申请的空间执行新代码,执行完后jmp源程序。

现在有个问题,因为申请空间地址是不定的,从原程序跳到新空间的这个 jmp 操作码如何写?
同样,新空间跳回原程序的这个jmp操作码如何写?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
eax:= new()
call eax

-----------------
...
...
ret
2009-4-12 10:21
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
3
楼上兄弟的意思是,在原程序中 吧eax初始化成新申请的地址,然后call eax,把jmp指令改成call
2009-4-12 10:25
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
是这样的,这个用法就是将新申请的内存代码作为一个子程序来调用使用,这样的话新申请的内存代码最后只须一个ret而不用另外计算返回地址就可以返回到原来的地方继续执行。
2009-4-12 10:31
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
5
jmp  call 后面的偏移如何计算。

jmp 地址 + 指令长度 + 偏移 =目标地址

但是怎么我算的不是这样,比如说下面这个call,结果不是目标地址

10015CC2      E8 D9DAFEFF   CALL    100037A0   

10015cc2 + 5 + FFFEDAD9 =  1100037A0         

该如何计算偏移呢?
2009-4-12 10:36
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
6
应该是
15CC2 + 5 + FFFEDAD9 = 1000037A0

jmp call 地址取RAV 而不是取VA.
2009-4-12 10:39
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
7
delta = 目标 - 来源
        = 100037A0-(10015CC2+5) = FFFEDAD9

所以是 10015CC2      E8 D9DAFEFF   CALL    100037A0
没错
2009-4-12 10:43
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
8
就是你算得结果没错,1100037A0最后一位"1"超过32溢出的部份会被计算机丢弃的。
2009-4-12 10:44
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
9
再请教下比如下面这个CALL
10015CC2      E8 D9DAFEFF       CALL   100037A0   

我要吧这个call 的地址该成我新分配的内存地址。

程序里如何写?
分配新地址,里面是修改代码
LPVOID lpBuf = VirtualAllocEx( hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE );

如何把call lpBuf ,写成代码?我用的C
2009-4-12 12:59
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
如果你分配好的空间里面所写入的代码的最后确实是用ret返回的,而不是jmp返回的,并且那里的汇编代码是不需要重定位的,那么你根本不需要去计算偏移量。
你可以将你的lpBuf转换成函数指针,再调用之就可以了:
((void (*)())lpBuf)();
2009-4-12 13:24
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
11
我需要吧原程序的10015CC2      E8 D9DAFEFF       CALL   100037A0   

改成call我新分配的地址,现在问题是,操作码我如何算出来。要算出5字节的操作码,写原来call地址。
2009-4-12 13:33
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
12
// 大概就像下面的写法(注:下面的写法要注入到要写的进程内部和去除了写保护才有效)
*(ULONG*)0x10015cc3 = (ULONG)lpBuf-(0x10015cc2+5) ; 这里计算偏移。
2009-4-12 13:44
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
13
已经实现,多谢楼上个为兄弟帮助。特别是小虾版主
2009-4-12 18:00
0
游客
登录 | 注册 方可回帖
返回
//