2019独角兽企业重金招聘Python工程师标准>>>
- 实验环境
- OS:Windows XP sp3
- 漏洞软件:Word 2003
- 工具:x32dbg+IDA 6.8+01Editor+C32ASM
- 样本生成
- 分析过程
打开Word 2003并且附加到x32dbg中,并用Word 03打开目标文件(此处是Crack.rtf),发现日志中有异常记录,异常点位于30E9KB88处(位于MSO.dll中)
此处从0x11040004处复制到0x00123DC0处,次数为0x322B次(0xACC8/4),具体情况我们回溯到0x30F4CC96处上面查看到Crack处的函数调用了来自0x30F4CC93处的Call dword ptr [eax+1C] //call sub_30E9EB62()。在IDA Pro中查看30E9EB62(),发现就是简单的调用qmemcpy(dst,src,count)
再次断点到0x30F4CC93处来查看,发现dst是0x00123DC0,src是0x1104000C([0x014D10F0+0x10]),count是0xACC8([0x014D10F0+0x8]),而sub_30F4CC5D()中只有0x14字节的空间(sub_30E9EB62()不开辟新的栈空间),0xACC8早就溢出当前函数的栈空间了,所以此处未对qmemcpy()中的count进行检查而导致栈溢出。
跟踪内存发现,我们复制的内容是Crack.rtf中acc8后的文本(此处文本转成了十六进制,即“41”=》0x41),而前面的“acc8”也刚好对应之前的qmemcpy()的count。
最后,构造POC,第一时间我想到SEH exploit,恰好通过Mona检测到MSO.dll的SafeSEH是关闭的并且找到0x30CA50A9处作为ROP链首,溢出的SEH处的内容在Crack.rtf中的0x176C0偏移处。
最终得出shellcode。
shellcode={
\xeb,\x0a,\x90,\x90,\xa9,\x50,\xca,\x30,\x90,\x90,\x90,\x90,
\x6A,\x00,\x68,\x46,\x75,\x63,\x6B,\x89,\xE0,\x6A,\x00,\x68,\x43,\x61,\x70,\x00,
\x89,\xE3,\x6A,\x00,\x53,\x50,\x6A,\x00,\xBA,\x30,\x1C,\xC9,\x30,\x8B,\x12,\xFF,\xD2,\xC3,
}
//shellcode=jmp 0A+\x90*2+ROP address+\x90*4+payload
效果如图所示:
PS:RTF文件格式说明