标签:
来源: 360 CTF 2014
题目:找到程序中的flag
类型: Reverse
分数: 160
难度:难(难中易三个级别)
描述:
提示:请先搭建该EXE的执行环境
1. 在本地安装appserv[如果不知道appserv是啥,请自行so.com一下],配置HTTP端口为80
2. 将您修改后的Exploit.html以及压缩包中的shell.dat复制到www目录下
3. 运行MFC_ASM.exe,如果您成功修复了该Exploit.html,会弹出key,否则,崩溃
?
?
?
解题思路:
用od加载程序,根据提示程序会从本地服务器下载Exploit.html文件,谷歌后我们可以知道MFC程序通常会使用InternetReadFile函数读取网页数据,因此我们可以给该函数下个断点
按下button1,程序断在了下面这个地方,因为这里对时间有要求,所以我们可以设定一个条件断点记录下buffer地址,并在下面设一个断点,这样就可以通过F9来 运行程序
我们可以看到网页数据放到了0012d5d8
单步往下跟
这里将数据移动到了0140000,在调用这个函数之前下个条件断点
重新运行程序,我们可以从log里面看到
在数据窗口里面看不了这个地址,暂时不管,继续单步往下跟
这里有个leave指令,F8
可以看到返回地址已经被覆盖,因此可以判断这里存在缓冲区溢出漏洞
看来shellcode是要通过这里来执行,在leave指令这里下个断点后重新运行程序,修改EBP到shellcode的上面
F8到return指令,这里我们分析一下shellcode
我们用IDA6.6打开Exploit.html,按F5可以将每一个函数编译成C语言,我们可以分析出图中标出的几个比较重要的函数
Shellcode通常会以GetKernel32Addr模块开始,我们在GetKernel32Addr函数处按X可以找到引用的函数
我们跳转到了init函数,我们再按C看看还有没有别的函数,提示失败,那就先尝试一下从init处执行shellcode,我们将ESP处的值设置为0012de84+778 = 12E5FC 运行,但是并没有弹出flag,看来光有init函数是不够的,往下找找,CDD处有一段未定义的代码,按C
看来这里极有可能是入口点,我们在上一步中将返回地址调整为0012de84+CDD = 12EB69,运行
弹出了flag
最后的入口点按照这个第二次复现的时候就没能正确工作,所以这里可能要在最后的leave处做多次尝试才可以。
@Reference:bluecake
标签:
原文地址:http://www.cnblogs.com/windcarp/p/4437686.html