我用的是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
本人是新手,百思不得其解.
看哪位大虾能指点迷津!
ubuntu下缓冲区溢出无效?[已解决]
- qlhn
- 帖子: 736
- 注册时间: 2006-08-25 10:37
- 联系:
ubuntu下缓冲区溢出无效?[已解决]
上次由 qlhn 在 2007-07-19 15:17,总共编辑 1 次。
- qlhn
- 帖子: 736
- 注册时间: 2006-08-25 10:37
- 联系:
- qlhn
- 帖子: 736
- 注册时间: 2006-08-25 10:37
- 联系:
通过几天的摸索,终于解决了!
原来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相比会有些差异吧!
看来编程也需与时俱进喽!
原来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相比会有些差异吧!
看来编程也需与时俱进喽!