Chinaunix首页 | 论坛 | 博客
  • 博客访问: 118217
  • 博文数量: 28
  • 博客积分: 66
  • 博客等级: 民兵
  • 技术积分: 143
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-19 08:28
文章分类
文章存档

2016年(4)

2012年(24)

我的朋友

分类:

2012-09-27 13:13:51

linux:

记得上个学期的CSAAP中有一个缓冲区溢出的例子,里面每一次程序运行的时候,
虚拟内存的地址都是变化的,导致溢出变得非常困难。
昨天在做一个缓冲区溢出的演示程序,hacking了一个上午和晚上,终于找到问题
的所在。
因为高版本内核(至少是>2.6.9,具体那个版本没有考证)中开启了
randomize_va_space,导致用户空间栈的位置是变化的,增加了缓冲区溢出的难度。
(gdb) x/20x 0xbfffffe0
0xbfffffe0: Cannot access memory at address 0xbfffffe0
fisherman:/home/wangyao/Exp/IDS/exp3/v2# echo "0" >
/proc/sys/kernel/randomize_va_space
这样就可以访问0xc0000000左面的内存了。
(gdb) x/20x 0xbfffffe0
0xbfffffe0: 0x452f6f61 0x492f7078 0x652f5344 0x2f337078
0xbffffff0: 0x6f2f3276 0x66726576 0x00776f6c 0x00000000
0xc0000000: Cannot access memory at address 0xc0000000
如果看一下/proc/pid/maps文件的话,就会发现问题:
bff37000-bff4d000 rw-p bff37000 00:00 0 [stack]
fisherman:/home/wangyao/Exp/IDS/exp3/v2# echo "0" >
/proc/sys/kernel/randomize_va_space
bffeb000-c0000000 rwxp bffeb000 00:00 0 [stack]
栈的虚拟存储器的地址是变化的。

所以,在学习溢出的时候,记得使用gcc-3.x(gcc4也可以,需要加上-fno-stack-protector编译选项),并且关闭randomize_va_space :-)

找到了randomize_va_space的代码了
linux/arch/i386/kernel/process.c
unsigned long arch_align_stack(unsigned long sp)
{
    if (randomize_va_space)
        sp -= get_random_int() % 8192;
    return sp & ~0xf;
}


Best Regards! :-)
--------------
Wang Yao(王耀),
HomePage: http://cudev.cublog.cn
IBM Club Harbin Institute Of Technology
Address:NO.92 West Da-Zhi Street,NanGang District,Harbin,Heilongjiang


_______________________________________________
Linux mailing list

阅读(1196) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~