分类: C/C++
2007-11-07 11:05:48
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