我一年以前去某公司面试的时候出的这道题,题做出来了但是后来没去这家公司,当时解题的过程写了博客的,现在把EXE文件也发出来和大家分享下吧。
首先运行这个程序,观察它的行为。

用exeinfo打开,发现没有加壳。

用IDA打开,查看F5反编译之后的代码。

MSDN上查阅相关函数可以得知WinMain中是一个消息循环,LoadString函数从资源里加载字符串资源到CString对象里。用Resource Hacker打开它。

这里的快捷键是?或/+ALT,按下快捷键就会弹出About窗口。在WinMain中没有看到有关flag的内容,于是在ollydbg中尝试设置消息断点。

当在程序窗口中按下ALT+?之后ollydbg断在这里。

跟进0x00401640,同时在IDA中查看。

可以看到在IDA中这一部分代码左边都是红色的,这是因为IDA没有正确识别它们。

问题出在这里,有两条重复的指令。用16进制编辑器把下面那条指令替换成nop,再在IDA中打开。

这次正常了,但是在按下F5时又出现了如图所示的提示。

依次勾选Options->General->Disassembly->Stack pointer,按下ALT+K调整堆栈。

查看F5反编译之后的结果。

0x40101E调用了0x4013A0,从0x4013A0调用的函数和0kk`d1a`55k222k 2a776jbfgd`06cjjb刚好是32位来看,这里应该是MD5加密。

跟进后面调用的0x401005,0x401005又调用了0x401590。

这里把0kk`d1a`55k222k2a776jbfgd`06cjjb和SS做了一个异或操作,编写程序来得到异或运算的结果。

对得到的结果进行MD5解密。

这个值应该被写到00428C54也就是pbData处。

但是WinMain会先对这里做一个memset操作,所以在LoadString函数下断点,断在这里之后memset已经执行完了,这时再在内存中写入123321。


为了能让程序顺利执行到弹出flag的地方,还需要修改前面几处跳转条件。

运行到这里,找到了flag{n0_Zu0_n0_die}。
