CVE-2009-1492成因分析
linux下的cve漏洞分析,跟windows有什么区别呢?一样的!
1.溢出点
1.1函数原型:
extern char *strncat(char *dest,char *src,int n)
1.2参数说明:
src为源字符串,dest为目的字符串,n为指定的src中的前n个字符。
1.3漏洞成因:
dest值为-0x0000100C,所以只要dest字符串长度超过0x100c+4就会覆盖到函数的返回地址。虽然参数中有限定最多拼接字符串长度为0x1000,但是由于dest字符串已经有一定长度的字符串,所以再与src字符串拼接以后,dest字符串长度超过0x100c。
1.4调试过程:
在b*0x087b28ea下断点,可以观察其参数。(样本poc_rand.pdf)
第一次断下时,堆栈情况如下:(gdb使用peda插件)
第二次断下时,堆栈情况如下:
可以看到dest字符串已经为"/home/liu/.adobe/Acrobat/8.0/Dictionaries/",src字符串为”abcd....abcd”。
call _strncat指令执行前ebp处的内存为:
call _strncat指令执行后ebp处的内存为:
可以看到返回地址被覆盖为0x62616463.
Dest字符串为:
可以看到已经拼接完成。
在函数返回时下断点:b*0x087b2967
可以看到,此时返回地址已经被篡改。下一步就会跳转到0x62616463去运行。
2.Utf-8编码问题
在拼接之前,会对传入的字符串进行utf-8编码转换。
使用样本poc_rand_90.pdf,也是在b*0x087b28ea下断点,观察结果如下:
可以看到%u9090经过utf-8编码转换为0xe9 0x82 0x90。
具体实现,可以看下面这个函数。
3.堆喷射问题
使用韩哥给的样本,发现没有堆喷射。
gdb-peda$ find "\x2b\xc9\x83\xe9" 0x80022000 0x8122e000
Searching for '+\xc9\x83\xe9' in range: 0x80022000 - 0x8122e000
Found 2 results, display max 2 items:
[heap] : 0x81055460 --> 0xe983c92b
[heap] : 0x810f3a60 --> 0xe983c92b
后来我将样本做如下修改:
即在每个块头加上一个不同的索引。发现,堆喷射成功。
查找命令为find "\x2b\xc9\x83\xe9" heap(为shellcode的头四个字节)
可以看到黄色框,框出区域比较规律,相差0x10000.
4.下一步工作:
已经可以控制栈,堆也可以稳定喷射。
那么下一步工作,就是将返回地址改写为堆内shellcode的地址即可。
注意的问题就是要先将地址从utf-8转换为unicode。
5.控制eip跳转至shellcode(poc为poc_rand_8181e081.pdf)
返回地址,选定0x81c281c2。可以从该位置的nop指令滑入shellcode。
但是不能够直接用0x81c281c2,需要将其转换为unicode编码。转换格式如下:
在call _strncat指令后下断点,b*0x087b28ef,观察覆盖后的栈情况。可以看到返回地址已经被覆盖为了0x81c281c2,因此可以跳转至shellcode处运行。
具体的unicode与utf-8的编码转换如下:
6.在ubuntu9.04下测试(没有nx保护)
6.1测试前先关闭aslr,关闭方法:
Add a file /etc/sysctl.d/01-disable-aslr.conf containing:
kernel.randomize_va_space = 0
然后重启。
查看是否关闭:
cat /proc/sys/kernel/randomize_va_space
若为0则关闭成功。
6.2 dump出堆内存,查看堆喷射结果。(poc为poc_rand_b9c2b9c2.pdf)
下断点b*0x087b28ea
第二次断下后,先查看进程内存空间:
cat /proc/15879/maps
其中进程pid可以通过以下命令获得:
ps aux|grep acroread
获得heap的起始地址为:
b8002000-bffb7000 rw-p b8002000 00:00 0 [heap]
然后dump出堆内存:
dump binary memory heap.txt 0xb8002000 0xbffb7000
然后用010editor打开heap.txt
查找shellcode:
可以看到堆喷射结果。
6.3 utf-8编码,将返回地址覆盖,劫持控制流。
选定的堆地址为0xb9c2b9c2.
将其utf-8编码:
编码为¹
6.4 调试截图
在ret处下断点:b *0x087B2967
可以看到返回地址已经被覆盖。
可以看到单步调试,没有问题。没有nx保护。
Adobe下载地址.txt
poc_rand.pdf
poc_rand_90.pdf
poc_rand_8181e081.pdf
poc_rand_b9c2b9c2.pdf
分析报告.doc
[课程]Android-CTF解题方法汇总!
上传的附件: