LinuxSir.cn,穿越时空的Linuxsir!

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

一次缓冲区溢出攻击试验

[复制链接]
发表于 2005-6-4 20:35:23 | 显示全部楼层
要打印ok不难,但不能保证程序正常退出,难非main的返回地址最低字节全0,因为gets会自动补上一个'\0'。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-4 22:23:10 | 显示全部楼层
我已经做到了在gdb中实现打印 ok之后 正常退出。不用gdb的情况下没有成功过。Tetris兄能不能完善一下。搞个不用gdb也能正常退出的shellcode来。
回复 支持 反对

使用道具 举报

发表于 2005-6-4 23:44:35 | 显示全部楼层
我不知道shellcode是什么啊,呵呵,所以你写的那些我都看不懂。
想到一个问题,要是value被优化了放在一个寄存器里岂不是没搞头?
回复 支持 反对

使用道具 举报

发表于 2005-6-5 10:32:10 | 显示全部楼层
我也不懂shellcode
我搜了一下,发现网上好多写shellcode时,会加-static编译,这样想puts函数也可以disas出来了
回复 支持 反对

使用道具 举报

发表于 2005-6-5 10:49:46 | 显示全部楼层
Post by kj501

但是,如果不在gdb中执行,会出现非法指令的提示,估计可能是指令对齐造成的。
需要注意的是,每个机器的情况不一样,需要自己根据实际情况进行相应的修正,仅仅靠碰运气是很难成功的。

我在网上看到这样一段话“而大部分操作系统都将代码段设为只读,为了绕过这个限制,我们必须将我们希望执行的代码放到堆栈或数据段中,并且转向执行它,可以将代码放到数据段的一个全局数组中。”,不知道是否可以解决这个问题?

反正那篇文章没用gdb执行
原文在这:http://www.77169.net/Article/Class13/Class17/200307/232.html
回复 支持 反对

使用道具 举报

发表于 2005-6-5 16:27:35 | 显示全部楼层
呵呵,看我的运行结果

  1. [root@localhost ccode]# gcc linkaddr.c
  2. [root@localhost ccode]# ./a.out
  3. 0xbfffdb9c      0xbfffdb40
  4. [root@localhost ccode]# ./a.out
  5. 0xbfffda1c      0xbfffd9c0
  6. [root@localhost ccode]# ./a.out
  7. 0xbffff89c      0xbffff840
  8. [root@localhost ccode]# ./a.out
  9. 0xbffff81c      0xbffff7c0
  10. [root@localhost ccode]# ./a.out
  11. 0xbffff79c      0xbffff740
复制代码
Post by nait
理论上用户进程只能的到虚拟地址,物理地址都给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-5 16:44:15 | 显示全部楼层
问题可能出在内核上,我是在smp内核上运行这个程序的。我换了个普通的内核,地址就不变化了。
哪位可以解释一下原因么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-6 16:51:28 | 显示全部楼层
Post by Tetris
我不知道shellcode是什么啊,呵呵,所以你写的那些我都看不懂。
想到一个问题,要是value被优化了放在一个寄存器里岂不是没搞头?

shellcode是一个专有名词。指用来溢出缓冲区的二进制代码。
如果value被编译器优化,这个题目的难度就会大大增加。但一样可以实现缓冲溢出,毕竟编译器再怎么优化,在寄存器有限的x86架构上恐怕也不会把函数的返回地址放到寄存器中去。
ps:编译溢出的程序时最好不要加优化。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-6 16:53:57 | 显示全部楼层
Post by nait
我在网上看到这样一段话“而大部分操作系统都将代码段设为只读,为了绕过这个限制,我们必须将我们希望执行的代码放到堆栈或数据段中,并且转向执行它,可以将代码放到数据段的一个全局数组中。”,不知道是否可以解决这个问题?

反正那篇文章没用gdb执行
原文在这:http://www.77169.net/Article/Class13/Class17/200307/232.html

为什么不在gdb中执行就不能成功的原因? 这个原因我还没有想清楚。但我想不是仅仅把代码放到数据段就能解决了。可能和gdb对程序运行环境的影响有一定的关系。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-6 16:56:05 | 显示全部楼层
Post by spaced
问题可能出在内核上,我是在smp内核上运行这个程序的。我换了个普通的内核,地址就不变化了。
哪位可以解释一下原因么?

呵呵,第一次听说有这种现象。原因我也解释不了。原来我也发现过程序在gdb中调试时地址会改变,但smp内核会改变地址确实是第一次听说。
回复 支持 反对

使用道具 举报

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

本版积分规则

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