免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: GoldenSoldier

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

论坛徽章:
0
发表于 2009-11-26 09:23 |显示全部楼层
void main(){
int a_main=1;
i=(int)yaya;
foo();
}

楼主代码有问题哈~ i 和 a_main??

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

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

void a ...


谢谢mik的提醒:“你这个 yaya() 地址并没有接着 attack() 后面


刚改了一下代码:
  1. a_main=(int)yaya;
  2. 改为:*(& a_main -1)=(int)yaya;
复制代码

现在可以成功的运行yaya函数了,但是最后还是返回段错误。

最后还是不明白,为什么在main函数的反汇编中,esp为什么减去0x8?
main只有一个局部变量a_main啊,而且看后面的汇编,也没有用到0xbfffe2d0啊。(esp减去0x4就够用了么:em11: )
请教!



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

论坛徽章:
0
发表于 2009-11-26 09:32 |显示全部楼层
原帖由 ljk19841115 于 2009-11-26 09:23 发表
void main(){
int a_main=1;
i=(int)yaya;
foo();
}

楼主代码有问题哈~ i 和 a_main??

已经修正过了,贴出的代码是错了。但在gcc编译的代码还是对的。谢谢!

论坛徽章:
0
发表于 2009-11-26 13:56 |显示全部楼层
这里假设在进入函数之前,栈是16字节对齐的话,那么,进入函数后,EIP和EBP被压入堆栈后,栈地址最末4位二进制位必定是1000,esp -8则恰好使后4位地址二进制位为0000。看来,这也是为保证栈16字节对齐的

http://blog.csdn.net/yayong/archive/2004/11/07/170842.aspx

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

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

void a ...


如图,该地址属于代码段,权限r_xp,你应该知道是什么原因了
1.jpg

论坛徽章:
0
发表于 2009-11-26 15:44 |显示全部楼层

回复 #15 fox144215 的帖子

“该地址”指的是前面说的yaya函数的入口地址0x08048347吧? 然后呢? 恕本人愚顿,没能领悟……

论坛徽章:
0
发表于 2009-11-26 16:51 |显示全部楼层
*(& c_foo +2),是这个地址

论坛徽章:
0
发表于 2009-11-26 20:15 |显示全部楼层
原帖由 ljk19841115 于 2009-11-26 13:56 发表
这里假设在进入函数之前,栈是16字节对齐的话,那么,进入函数后,EIP和EBP被压入堆栈后,栈地址最末4位二进制位必定是1000,esp -8则恰好使后4位地址二进制位为0000。看来,这也是为保证栈16字节对齐的

htt ...

非常感谢你的帮助,看了这篇文章,获益匪浅啊。

文章提到,为了保证16字节的对齐,EBP最后一位(16进制)必须是8,所以ESP(ESP-8)就为0了。
我很希望这是对的,但是我所看到的却不是啊。
比如下图中:(注意下面的图标注都是原来的,将就看一下吧啊

ESP的尾数为0100(二进制),4(16进制)。
这又如何解释呢?

另外:
下图中ESP减去0x4,又作何解释么?


还有,在Linux一站式学习中的图http://learn.akae.cn/media/ch19s01.html

ESP和EBP的尾数也并为有上面提到的规律啊?(“16字节对齐”)

最后,我知道GCC是4字节对齐的(sizeof结构体可知),和这个“16字节对齐”,二者有什么关系么?

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

论坛徽章:
0
发表于 2009-11-26 20:53 |显示全部楼层
原帖由 fox144215 于 2009-11-26 14:49 发表


如图,该地址属于代码段,权限r_xp,你应该知道是什么原因了
237447



这和 LZ 的错误有什么关系呢?

论坛徽章:
0
发表于 2009-11-26 21:00 |显示全部楼层
原帖由 GoldenSoldier 于 2009-11-26 20:15 发表

非常感谢你的帮助,看了这篇文章,获益匪浅啊。

文章提到,为了保证16字节的对齐,EBP最后一位(16进制)必须是8,所以ESP(ESP-8)就为0了。
我很希望这是对的,但是我所看到的却不是啊。
比如下图中: ...


对于用户程序的入口函数,即:main(), gcc 一般作 16 bytes 对齐。其它函数,不作 16 bytes 对齐
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP