-
-
[原创]WHCTF2017-CRACKME
-
发表于: 2017-10-19 23:31 3715
-
假装大学生水一下CTF题目,常规思路。程序没有加壳,是VC写的MFC程序。
PEID查询无壳,进IDA查看字符串。
得到这个字符串的一个存放地址,向上跟踪到有这个字符串的地方,依稀可以看到加密后的Flag轮廓。
当即想到有字符串就会有弹框的地方,查找所有模块后,在MessageBox断点。
运行-输入Flag的地方输入【ABCDEFG1234567】,然后通过堆栈窗口跟踪到调用弹窗的地方。
拿到弹窗地址00401759,到IDA里的窗口查看对比得到调用Flag输入错误提示信息的地址。
sub_401720 调用提示错误字符串的函数B
在sub_401720处断点,截获到存着flag的寄存器。说明计算离计算flag的距离已经不远了。
继续通过堆栈窗口跳到调用401720这个函数的地方,也就是00401621这个地址
00401621 调用提示字符串B - 错误
调用00401621地址也就是错误提示的地方来自以上的一个判断,这里应该有一个判断。但是IDA识别不出来,自己手动创建函数后程序结构判断一目了然。
依赖IDA向上追溯已经没法子了,那么通过程序中可以看到会对比一个33的字符,那么这个判断里非常有可能就是计算flag的地方。计算要求必须要33个字符,那么我们就整个33字符输入进去即可!输入构造好的33个字符的字符串【ABCDEFG123456789qwertyuiopzxcvbnm】
反汇编的注释如下:
反汇编代码中首先对比了一个输入的字符串是否有33个字符,如果没有就调用提示错误的弹窗函数。计算Flag通常会有两次判断,一次是判断字符串长度是否正确,然后判断输入的字符串是否正确。以上汇编中从00401630这个函数出来后会进行结果的判断然后根据结果是否跳转到调用提示错误弹窗函数的地方。
跟进00401630函数,OD反汇编代码如下:
Flag出现的地方,就是0040165F这里。
思路小结:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!