免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 25447 | 回复: 34

Linux堆栈溢出的经典问题,欢迎围观!大牛前进 [复制链接]

论坛徽章:
0
发表于 2009-11-25 18:33 |显示全部楼层
原帖请见:http://blog.chinaunix.net/u/26166/showart.php?id=198375

我的环境是redhant 9 ,2.4的核。由于对Linux环境下堆栈的不熟悉,所以就这个例子,做了一些哦测试。
我的代码:
  1. #include<stdio.h>

  2. void attack()
  3. {
  4. int attack=1;
  5. printf("hi,attacked!\n");
  6. }
  7. void yaya()
  8. {
  9. int yaya=1;
  10. printf("hi,yaya is my wife\n");
  11. }
  12. void foo()
  13. {
  14. int c_foo=1;
  15.   *(& c_foo +2)=(int)attack;
  16. }

  17. void main(){
  18. int a_main=1;
  19. a_main=(int)yaya;
  20. foo();
  21. }
复制代码


然后,gdb下观察结果:
main函数的反汇编:
1.JPG

yaya函数的反汇编
2.JPG

attack函数的反汇编:
3.JPG

foo函数的反汇编:
4.JPG

在main的堆栈中,a_main的值从1变为yaya函数的入口地址0x08048347,而进入foo函数之后,本来0xbfffe2cc存放的是main返回的地址0x0804839f,但是改为attack函数的入口地址0x08048328。
这样就会导致main函数无法正常返回。
5.JPG

下面是我画的堆栈示意图,请指教:
6.JPG

从函数foo返回后,就进入了attack函数了。
7.JPG
打印“hi,attacked!”成功!
接着,返回段错误。

我的问题:为什么yaya函数没有执行,就出现了段错误?
照文章中所述的,yaya函数的入口地址0x08048347已经放在了0xbfffe2d4,为什么eip会访问不到么?


[ 本帖最后由 GoldenSoldier 于 2009-11-26 09:17 编辑 ]

论坛徽章:
0
发表于 2009-11-25 19:10 |显示全部楼层
上面有个图发冲了
在下面修正一下:
1.jpg

论坛徽章:
0
发表于 2009-11-25 20:49 |显示全部楼层
你cat /proc/$(pid)/maps看下0x08048347是属于哪个段的

论坛徽章:
0
发表于 2009-11-25 21:07 |显示全部楼层

回复 #3 fox144215 的帖子

>>你cat /proc/$(pid)/maps看下0x08048347是属于哪个段的

不懂你的意思。
0x08048347是属于代码段啊

论坛徽章:
0
发表于 2009-11-25 21:56 |显示全部楼层
原帖由 GoldenSoldier 于 2009-11-25 18:33 发表
原帖请见:http://blog.chinaunix.net/u/26166/showart.php?id=198375

我的环境是redhant 9 ,2.4的核。由于对Linux环境下堆栈的不熟悉,所以就这个例子,做了一些哦测试。
我的代码:
#include

void a ...


围观

你没看懂 dump 出来的 main() 代码吗?

已经很清楚了。

论坛徽章:
0
发表于 2009-11-25 22:03 |显示全部楼层
原帖由 mik 于 2009-11-25 21:56 发表


围观

你没看懂 dump 出来的 main() 代码吗?

已经很清楚了。


本人菜鸟一个
请指教,我想知道为什么yaya函数没有执行

论坛徽章:
0
发表于 2009-11-25 22:20 |显示全部楼层

回复 #6 GoldenSoldier 的帖子

你这个 yaya() 地址并没有接着 attack() 后面

论坛徽章:
0
发表于 2009-11-25 22:26 |显示全部楼层
没看明白0xbfffe2d0上面存放的0x42130a14是怎么来的, 从attack函数返回后应该是跳到这个地址上了...
LZ代码中, main函数里面的那句i=(int)yaya是怎么回事? 代码还有蹊跷?

[ 本帖最后由 kouu 于 2009-11-25 22:47 编辑 ]

论坛徽章:
0
发表于 2009-11-26 08:42 |显示全部楼层
原帖由 mik 于 2009-11-25 22:20 发表
你这个 yaya() 地址并没有接着 attack() 后面


谢谢你的关注!
你的意思是不是0xbfffe2d0地址里面不是yaya函数的入口地址?

论坛徽章:
0
发表于 2009-11-26 08:47 |显示全部楼层
原帖由 kouu 于 2009-11-25 22:26 发表
没看明白0xbfffe2d0上面存放的0x42130a14是怎么来的, 从attack函数返回后应该是跳到这个地址上了...
LZ代码中, main函数里面的那句i=(int)yaya是怎么回事? 代码还有蹊跷?


我也是初学者,我也不知道为什么0xbfffe2d0上面存放的0x42130a14,这是gdb你看到的。
从字面上来看,没有和我函数的任何的局部变量产生关系(即 非任何局部变量的值),我怀疑是和printf有关的,猜得。

main函数里面的那句i=(int)yaya是笔误,应该是a_main= (int)yaya,不好意思。源代码已经修正过。惭愧
a_main= (int)yaya是为了让yaya函数执行而已。
但是没想到中间还有个0xbfffe2d0(0x42130a14),不解。

[ 本帖最后由 GoldenSoldier 于 2009-11-26 09:19 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP