DbAPPSec CTF一道题的分析

来源:互联网 发布:淘宝代运营收费标准 编辑:程序博客网 时间:2024/06/03 21:55

首先运行这个程序,观察它的行为。
这里写图片描述
用exeinfo打开,发现没有加壳。
这里写图片描述
用IDA打开,查看F5反编译之后的代码。
这里写图片描述
MSDN上查阅相关函数可以得知WinMain中是一个消息循环,LoadString函数从资源里加载字符串资源到CString对象里。用Resource Hacker打开它。
这里写图片描述
这里的快捷键是?或/+ALT,按下快捷键就会弹出About窗口。在WinMain中没有看到有关flag的内容,于是在ollydbg中尝试设置消息断点。
这里写图片描述
当在程序窗口中按下ALT+?之后ollydbg断在这里。
这里写图片描述
跟进00401640,同时在IDA中查看。
这里写图片描述
可以看到在IDA中这一部分代码左边都是红色的,这是因为IDA没有正确识别它们。
这里写图片描述
问题出在这里,有两条重复的指令。用16进制编辑器把下面那条指令替换成nop,再在IDA中打开。
这里写图片描述
这次正常了,但是在按下F5时又出现了如图所示的提示。
这里写图片描述
依次勾选Options->General->Disassembly->Stack pointer,按下ALT+K调整堆栈。
这里写图片描述
查看F5反编译之后的结果。
这里写图片描述
sub40101E调用了sub4013A0,从sub4013A0调用的函数和那一串字符串刚好是32位来看,这里应该是MD5加密。
这里写图片描述
跟进后面调用的sub401005函数,sub401005又调用了sub401590。
这里写图片描述
这里做了一个异或操作,编写程序来得到运算的结果。
这里写图片描述
对得到的结果进行MD5解密。
这里写图片描述
这个值应该被写到00428C54也就是pbData处。
这里写图片描述
但是WinMain会先对这里做一个memset操作,所以在LoadString函数下断点,断在这里之后memset已经执行完了,这时再在内存中写入123321。
这里写图片描述
这里写图片描述
为了能让程序顺利执行到弹出flag的地方,还需要修改前面几处跳转条件。
这里写图片描述
运行到这里,找到了flag{n0_Zu0_n0_die}。
这里写图片描述

0 0
原创粉丝点击