免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: ruanke77
打印 上一主题 下一主题

[C] 最这个问题有点疑问,求高手看看 [复制链接]

haiber0702 该用户已被删除
21 [报告]
发表于 2012-11-01 09:13 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
22 [报告]
发表于 2012-11-01 09:16 |只看该作者
  1. 123:      d=fun(s,strlen(s)+1);
  2. 004010AF   mov         eax,dword ptr [ebp-8]
  3. 004010B2   push        eax
  4. 004010B3   call        strlen (004027d0)
  5. 004010B8   add         esp,4
  6. 004010BB   add         eax,1
  7. 004010BE   push        eax
  8. 004010BF   mov         ecx,dword ptr [ebp-8]
  9. 004010C2   push        ecx
  10. 004010C3   call        @ILT+5(_fun) (0040100a)
  11. [b]004010C8   add         esp,8
  12. 004010CB   mov         dword ptr [ebp-4],eax[/b]
  13. 124:      printf("%s",d);
  14. 004010CE   mov         edx,dword ptr [ebp-4]
  15. 004010D1   push        edx
  16. 004010D2   push        offset string "%s" (004208b0)
  17. 004010D7   call        printf (0040c290)
  18. 004010DC   add         esp,8
  19. 125:      return 0;
  20. 004010DF   xor         eax,eax
  21. 126:  }
  22. 004010E1   pop         edi
  23. 004010E2   pop         esi
  24. 004010E3   pop         ebx
  25. 004010E4   add         esp,48h
  26. 004010E7   cmp         ebp,esp
  27. 004010E9   call        __chkesp (004018f0)
  28. 004010EE   mov         esp,ebp
  29. 004010F0   pop         ebp
  30. 004010F1   ret


  31. 112:  void *fun(char *src,int len)
  32. 113:  {
  33. 0040C240   push        ebp
  34. 0040C241   mov         ebp,esp
  35. 0040C243   sub         esp,440h
  36. 0040C249   push        ebx
  37. 0040C24A   push        esi
  38. 0040C24B   push        edi
  39. 0040C24C   lea         edi,[ebp-440h]
  40. 0040C252   mov         ecx,110h
  41. 0040C257   mov         eax,0CCCCCCCCh
  42. 0040C25C   rep stos    dword ptr [edi]
  43. 114:      char dest[1024];
  44. 115:      memcpy(dest,src,len);
  45. 0040C25E   mov         eax,dword ptr [ebp+0Ch]
  46. 0040C261   push        eax
  47. 0040C262   mov         ecx,dword ptr [ebp+8]
  48. 0040C265   push        ecx
  49. 0040C266   lea         edx,[ebp-400h]
  50. 0040C26C   push        edx
  51. 0040C26D   call        memcpy (0040a6b0)
  52. 0040C272   add         esp,0Ch
  53. 116:      //return dest;
  54. 117:  }
  55. 0040C275   pop         edi
  56. 0040C276   pop         esi
  57. 0040C277   pop         ebx
  58. 0040C278   add         esp,440h
  59. 0040C27E   cmp         ebp,esp
  60. 0040C280   call        __chkesp (004018f0)
  61. 0040C285   mov         esp,ebp
  62. 0040C287   pop         ebp
  63. 0040C288   ret
复制代码
上述代码为本人通过VC6单步调试,跟踪代码可以看出fun函数返回后,将eax设置给了d,通过汇编可以看到,在函数fun中,eax最后一次修改是由memcpy调用后变的,这个是因为这个函数是有返回值的,它指向的就是拷贝dst的地址,所以最终将d赋值成栈上一个地址,打印可以成功。后面我们修改一下源码再次进行打印。
  1. void *fun(char *src,int len)
  2. {
  3.     char bb[1024];
  4.     char *cc="Golden Global View--2";
  5.     char dest[1024];
  6.     memcpy(dest,src,len);
  7.     memcpy(bb,cc,strlen(cc)+1);
  8.     //return dest;
  9. }

  10. int main()
  11. {
  12.     char *d;
  13.     char *s="Golden Global View";
  14.     d=fun(s,strlen(s)+1);
  15.     printf("%s",d);
  16.     return 0;
  17. }
复制代码
上述代码的输出就是.........Golden Global View--2, 就是说最后一次修改eax的第二次调用memcpy的地址。想要了解这一部分需要研究对应硬件平台的ABI(应用二进制接口),就是函数调用相关约定。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
23 [报告]
发表于 2012-11-01 10:25 |只看该作者
ruanke77 发表于 2012-10-30 21:58
fun函数中已经把return dest注释掉了,并且这个函数开头以void定义,表示无返回值,为什么主函数中还可以正 ...

一个很有意思但错误百出的题目
呵呵,如果拿这个做面试试探一下分析问题的能力有点意思

论坛徽章:
0
24 [报告]
发表于 2012-11-01 22:15 |只看该作者
谢谢大家的指导和批评,真心感谢,真个问题我终于弄明白了,很感激
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP