- 论坛徽章:
- 0
|
- 123: d=fun(s,strlen(s)+1);
- 004010AF mov eax,dword ptr [ebp-8]
- 004010B2 push eax
- 004010B3 call strlen (004027d0)
- 004010B8 add esp,4
- 004010BB add eax,1
- 004010BE push eax
- 004010BF mov ecx,dword ptr [ebp-8]
- 004010C2 push ecx
- 004010C3 call @ILT+5(_fun) (0040100a)
- [b]004010C8 add esp,8
- 004010CB mov dword ptr [ebp-4],eax[/b]
- 124: printf("%s",d);
- 004010CE mov edx,dword ptr [ebp-4]
- 004010D1 push edx
- 004010D2 push offset string "%s" (004208b0)
- 004010D7 call printf (0040c290)
- 004010DC add esp,8
- 125: return 0;
- 004010DF xor eax,eax
- 126: }
- 004010E1 pop edi
- 004010E2 pop esi
- 004010E3 pop ebx
- 004010E4 add esp,48h
- 004010E7 cmp ebp,esp
- 004010E9 call __chkesp (004018f0)
- 004010EE mov esp,ebp
- 004010F0 pop ebp
- 004010F1 ret
- 112: void *fun(char *src,int len)
- 113: {
- 0040C240 push ebp
- 0040C241 mov ebp,esp
- 0040C243 sub esp,440h
- 0040C249 push ebx
- 0040C24A push esi
- 0040C24B push edi
- 0040C24C lea edi,[ebp-440h]
- 0040C252 mov ecx,110h
- 0040C257 mov eax,0CCCCCCCCh
- 0040C25C rep stos dword ptr [edi]
- 114: char dest[1024];
- 115: memcpy(dest,src,len);
- 0040C25E mov eax,dword ptr [ebp+0Ch]
- 0040C261 push eax
- 0040C262 mov ecx,dword ptr [ebp+8]
- 0040C265 push ecx
- 0040C266 lea edx,[ebp-400h]
- 0040C26C push edx
- 0040C26D call memcpy (0040a6b0)
- 0040C272 add esp,0Ch
- 116: //return dest;
- 117: }
- 0040C275 pop edi
- 0040C276 pop esi
- 0040C277 pop ebx
- 0040C278 add esp,440h
- 0040C27E cmp ebp,esp
- 0040C280 call __chkesp (004018f0)
- 0040C285 mov esp,ebp
- 0040C287 pop ebp
- 0040C288 ret
复制代码 上述代码为本人通过VC6单步调试,跟踪代码可以看出fun函数返回后,将eax设置给了d,通过汇编可以看到,在函数fun中,eax最后一次修改是由memcpy调用后变的,这个是因为这个函数是有返回值的,它指向的就是拷贝dst的地址,所以最终将d赋值成栈上一个地址,打印可以成功。后面我们修改一下源码再次进行打印。- void *fun(char *src,int len)
- {
- char bb[1024];
- char *cc="Golden Global View--2";
- char dest[1024];
- memcpy(dest,src,len);
- memcpy(bb,cc,strlen(cc)+1);
- //return dest;
- }
- int main()
- {
- char *d;
- char *s="Golden Global View";
- d=fun(s,strlen(s)+1);
- printf("%s",d);
- return 0;
- }
复制代码 上述代码的输出就是.........Golden Global View--2, 就是说最后一次修改eax的第二次调用memcpy的地址。想要了解这一部分需要研究对应硬件平台的ABI(应用二进制接口),就是函数调用相关约定。 |
|