能力值:
( LV3,RANK:20 )
|
-
-
2 楼
咋没大师回答下呢?
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
咋没大师回答下呢?
|
能力值:
( LV12,RANK:360 )
|
-
-
4 楼
说错了:"执行call @F时压入堆栈的eip的值是call @F这行的地址 "
CALL执行后 压入的是下一条指令的地址,也就是pop ebx
|
能力值:
( 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作用的一种情况分析,相信你能明白这个基地址的作用,也就理解了这个问题
|
|
|