LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: kj501

一次缓冲区溢出攻击试验

[复制链接]
发表于 2005-3-16 22:20:14 | 显示全部楼层
Post by kj501
你没有理解我说的“代码运行时的地址在连接时已经确定”是什么意思。我的意思是说只要一个程序已经被编译链接好了,每次运行时,它的地址都不会改变。

我明白你的意思,我上面显示的是同一程序的两次运行,其间并没有重新编译。
而且我认为程序每次运行的地址是变化的,因为系统每次给进程分配的地址空间并不一定一样,起码起始地址不一定相同。
回复 支持 反对

使用道具 举报

发表于 2005-6-4 17:36:01 | 显示全部楼层
Post by spaced
我明白你的意思,我上面显示的是同一程序的两次运行,其间并没有重新编译。
而且我认为程序每次运行的地址是变化的,因为系统每次给进程分配的地址空间并不一定一样,起码起始地址不一定相同。

理论上用户进程只能的到虚拟地址,物理地址都给os屏蔽了
所以每次运行都应该是一样的
我也试过多次,确实是一样的。
看代码:
  1. #include <stdio.h>

  2.         int
  3. main(int argc, char **argv)
  4. {
  5.         int value;
  6.         char buf[80];

  7.         printf ("%p\t%p\n", &value, buf);
  8.         return 0;
  9. }
复制代码

我的运行结果
  1. [leo@leo ~]$ gcc x.c     [color=DarkOrange]#第一次编译[/color]
  2. [leo@leo ~]$ ./a.out
  3. 0xbffff40c      0xbffff3b0
  4. [leo@leo ~]$ ./a.out
  5. 0xbffff40c      0xbffff3b0
  6. [leo@leo ~]$ gcc x.c -O3     [color=DarkOrange] #加优化参数编译[/color]
  7. [leo@leo ~]$ ./a.out
  8. 0xbffff3bc      0xbffff3c0
  9. [leo@leo ~]$ ./a.out
  10. 0xbffff3bc      0xbffff3c0
  11. [leo@leo ~]$ ./a.out
  12. 0xbffff3bc      0xbffff3c0
复制代码

正如斑竹所讲“一个程序已经被编译链接好了,每次运行时,它的地址都不会改变。”
但我加了优化参数后,地址就变了,但同是优化后的程序,运行多次结果还是不会变的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-4 17:54:39 | 显示全部楼层
现代计算机一般都有虚拟内存管理。所以一般情况下,在链接时就已经把地址固定下来了。没有虚拟内存的计算机就不一定了。
回复 支持 反对

使用道具 举报

发表于 2005-6-4 18:39:51 | 显示全部楼层
难道现在还有谁用单用户单任务os吗?
那也太利害了   
回复 支持 反对

使用道具 举报

发表于 2005-6-4 19:01:14 | 显示全部楼层
楼主真神人也!
回复 支持 反对

使用道具 举报

发表于 2005-6-4 19:08:14 | 显示全部楼层
嗯,是我的偶像

这篇文章还不能完全看懂,先收藏,看懂了再来冒个泡
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-4 19:52:42 | 显示全部楼层
Post by nait
难道现在还有谁用单用户单任务os吗?
那也太利害了   

嵌入式系统中很常见。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-4 19:54:43 | 显示全部楼层
Post by nait
嗯,是我的偶像

这篇文章还不能完全看懂,先收藏,看懂了再来冒个泡

不敢当。我只是多看了几本书而已,而且还经常出昏招!!!
回复 支持 反对

使用道具 举报

发表于 2005-6-4 19:56:11 | 显示全部楼层
可以跟我说这个贴子在讨论什么吗?我怎么一点都看不懂啊……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-4 20:20:31 | 显示全部楼层
原来的题目被人给删掉了。我整理一下,供大家参考:

  1. #include <stdio.h>

  2. int main(int argc, char **argv)
  3. {
  4.      int value;
  5.      char buf[80];
  6.      gets(buf);
  7.      if (value == 0x0a0a0a0a)
  8.           printf("ok\n");
  9. }
复制代码

这是一个缓冲溢出攻击的习题。读入一串字符溢出buf,并使得value的值变成0x0a0a0a0a。如果溢出攻击成功,会打印出ok。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表