能力值:
( LV2,RANK:10 )
|
-
-
2 楼
还存在缓冲区安全检查~
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
两个函数之间的偏移量
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
可否详细讲下~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
因为你这个例子里面是jmp的label,这时候jmp的地址以立即数的方式出现。
所以是跳转到相对的地址,即将jmp(E9)指令后跟着的立即数加到EIP寄存器里面去。
修改前
printf("%.8x\n",pf1);
printf("%.8x\n",pf2);
printf("%.8x\n",*((int*)pf1));
printf("%.8x\n",*((int*)pf2));
00411186
00411096
0003d5e9
000445e9
修改后
printf("%.8x\n",pf1);
printf("%.8x\n",pf2);
printf("%.8x\n",*((int*)pf1));
printf("%.8x\n",*((int*)pf2));
00411186
00411096
000355e9
000445e9
看清楚了吧,起跳的位置不一样,一个是从00411186,一个是从00411096
如果都改成e9 45 04,显然就不对了
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
谢谢回复,还想请教您 (int)pf2-(int)pf1;是什么意思?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
pf_fun=*(int*)((unsigned char*)pf2+1)+(int)pf2+5 ->pf2函数体地址
从pf1跳到pf2(函数体)的偏移为pf_fun-((int)pf1+5)=*(int*)((unsigned char*)pf2+1)+(int)pf2-(int)pf1;
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
(int)pf2-(int)pf1 是pf2到pf1之间的偏移
|
|
|