首页
社区
课程
招聘
自重定位代码问题
发表于: 2011-7-11 10:45 4011

自重定位代码问题

2011-7-11 10:45
4011
call    @F
@@:
       pop ebx
       sub ebx,offset @B
代码如上,这是一段获得当前基地址的代码(用于自重定位)执行完之后ebx得到的是当前的基地址,这是网上的说法。
但是有一个疑问,执行call @F时压入堆栈的eip的值是call @F这行的地址,而offset @B是获得pop ebx这行的地址偏移。如果要获得基地址,应该是由call @F这行的地址减去该行的偏移才对啊?但是这里却用call @F的地址减去pop ebx这行的偏移,这样得出的地址址应该会略大于基地址的啊?

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

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 5
活跃值: (421)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
咋没大师回答下呢?
2011-7-11 12:57
0
雪    币: 5
活跃值: (421)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
咋没大师回答下呢?
2011-7-11 18:21
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
4
说错了:"执行call @F时压入堆栈的eip的值是call @F这行的地址 "

CALL执行后 压入的是下一条指令的地址,也就是pop ebx
2011-7-11 18:28
0
雪    币: 78
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼上说的对
@@是一个标号,@F指下一个@@标号,@B指上一个@@标号
这里的pop ebx,是把ebx的值设置成pop ebx的地址(也就是call @F的返回地址)

假设代码如下:
varA dword 01234567
call @F
@@:
pop ebx
sub ebx,offset @B
mov eax,[ebx+varA]

1.如编译时预定的加载地址为0040c000
00400000  01234567
0040c004  E800000000       call 0040c009 ;这是相对跳了0字节,相当于push eip
0040c009  5B                       pop ebx    ;这里ebx就是动态的eip了
0040c00A  81EB09104000   sub ebx,0040c009  ;这里会固定为0040c009
那么sub ebx,0040c009 ;如果加载地址是0040c000,相对基址
ebx就是0

2.当我们把这段代码加载到目标进程的0080c000(shellcode注入或线程注入的情况)。
00800000  01234567                ;加载地址变了
0080c004 E800000000              call 0080c009;代码没有变化,但是eip值变了
0080c009 5B pop ebx                ;这里ebx就动态地变为0080c009
0080c00A 81EB09104000          sub ebx,0040c009    ;注意代码没有变
所以ebx就会变为 0080c009-0040c009=00400000,得到一个相对基址00400000

3.所以1中 mov eax,[ebx+varA] =mov eax,[0+00400000];eax=01234567
         2中 mov eax,[ebx+varA] =mov eax,[00400000+00400000];eax=01234567
数据的地址会变化,但是基地址ebx也随着变化,我们总能找到正确的地址
上面就是对ebx作用的一种情况分析,相信你能明白这个基地址的作用,也就理解了这个问题
2011-7-12 09:56
0
游客
登录 | 注册 方可回帖
返回
//