ubuntu下缓冲区溢出无效?[已解决]

软件和网站开发以及相关技术探讨
回复
头像
qlhn
帖子: 736
注册时间: 2006-08-25 10:37
联系:

ubuntu下缓冲区溢出无效?[已解决]

#1

帖子 qlhn » 2007-07-13 15:12

我用的是u6.06.
最近看了Aleph One 的那篇著名文章 SMASHING THE STACK FOR FUN AND PROFIT ,也想在自己的机器上试试.就用了下面的程序:

void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
int *ret;

ret = buffer1 + 12;
(*ret) += 8;
}

void main() {
int x;

x = 0;
function(1,2,3);
x = 1;
printf("%d\n",x);
}

编译.执行,结果总是1,不是0.
用gdb查看,发现 (*ret)+=8 那一句 *ret 的值在执行前和执行后是一样的,根本没有加上那个8

本人是新手,百思不得其解.

看哪位大虾能指点迷津!
上次由 qlhn 在 2007-07-19 15:17,总共编辑 1 次。
头像
qlhn
帖子: 736
注册时间: 2006-08-25 10:37
联系:

#2

帖子 qlhn » 2007-07-14 10:14

对不起,我自己出了点错误.又用gdb看了看,8是加上了,(*ret)的值改变了,
不过程序执行结果还是1,
不是我们期望的0.

到底是为什么呢?
头像
qlhn
帖子: 736
注册时间: 2006-08-25 10:37
联系:

#3

帖子 qlhn » 2007-07-19 15:32

通过几天的摸索,终于解决了!

原来buffer1和buffer2的在内存中的位置并不是象原文介绍的那样,而是更加靠前
在(*ret)的基础上+7而不是+8

有兴趣的朋友用gdb好好看看吧!

正确的代码如下:

void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
int *ret;

ret = buffer1 + 28; //+28而不是+12

(*ret) =(*ret) + 7; //+7而不是+8
}

void main() {
int x;

x = 0;
function(1,2,3);
x = 1;
printf("%d\n",x);
}


这样运行的结果就是我们期待的0了!

究其原因应该是编译器的变化吧!
Aleph One 那篇文章发表在1996年,那时的gcc跟现在的gcc相比会有些差异吧!

看来编程也需与时俱进喽! :lol:
rem1x
帖子: 29
注册时间: 2007-02-01 13:18

#4

帖子 rem1x » 2007-07-26 1:22

为楼主鼓掌,呵呵。
回复