网络攻防之——Linux缓冲区溢出过ASLR地址随机化防护
上次我们学习了缓冲区溢出基础,这次我们来个更高级的,漏洞程序源码如下:
1 |
|
编译方式:gcc -fno-stack-protector -o vuln vuln.c -g
开启ASLR地址随机化(系统默认是开启的)sudo echo 2 > /proc/sys/kernel/randomize_va_space
一、找溢出点
配合python脚本可以让我们更好的找溢出点:python -c 'python("A" * 140)'
找溢出点的过程就不详细的说了,用GDB打开目标程序,运行,输入测试字符串自己慢慢试,可以使用二分法来试,效果不错哦!
最后我找到的溢出点为:140字节
二、分析拿shell思路
因为我们的目的是拿到shell,也就是控制程序让程序执行system("/bin/sh");
所以,我们需要找到system函数的地址,然后我们还要输入一个/bin/sh
给程序,用作system的参数。
ps:本方法需要程序自带有write函数才可实现
程序执行步骤如下
- 接收用户输入(
/bin/sh
) - 调用
system("/bin/sh");
三、找需要用到的地址
main函数入口地址
漏洞触发点地址,也就是漏洞所在的函数地址,在这里我们就直接用main方法了
它其实就是给DynELF初始化时用作泄露地址用的
GDB中控制台输入p main
我们得到地址为:0x8048460
bss段地址
bss段是用来保存全局变量值的,地址固定,并且可读可写,我们就把读取到的/bin/sh
保存在bss段中
在控制台输入:readelf -s 文件名
找到bss那一行,我这里是这样的:70: 0804a020 0 NOTYPE GLOBAL DEFAULT 26 __bss_start
得到地址:0x0804a020
然后我们需要一些pop ret的地址
pop ret其实就是用来连续调用函数时平衡栈用的,调用的函数有几个参数就需要几个连续的pop后接ret
在控制台输入:objdump -d 文件名
第一列是地址,第二列是16进制代码,第三列是汇编语言,我们需要看的就是第三列
在找pop的时候尽量用__libc_csu_init
里面的pop
我找到的pop如下:
1 | 80484f8: 5b pop %ebx |
在调用函数时,参数4个就用0x080484f8
地址,参数3个就用0x080484f9
地址,其他同理
到这里我们需要用到的固定地址就找完啦
四、编写攻击的Python脚本
1 | #!/usr/bin/python |