-
-
[原创]2016看雪CrackMe攻防大赛第一题WP
-
发表于:
2016-11-2 20:07
5568
-
[原创]2016看雪CrackMe攻防大赛第一题WP
先运行了下程序,如图1,随便输入,点“OK”,提示“some thing you lost!”,并且左下侧数字随按钮点击次数自加。

直接拖进IDA,搜索字串“lost",没有找到。直接搜索text"lost"。将附近的data转成unicode。看到有"oh,good,congratulations!",查看引用位置。

调用位置在sub_402120中,如果Msg为0x111,WPara为1035则正确。简单看下,不难发现此call为重载的消息预处理函数。当Msg为111,WPara不为1035时就弹出不同提示的弹窗。
那就找消息发送函数的调用了。发现SendMessageW有5个地方call,但是参数WPara都不为1035。PostMessageW有两个call,发现1035的遗迹。一切看图,其中含有的字符”PB“和最后一位的比较是动态跟出来的,因为在比较"PB"时已经对输入进行了大写转换,所以此处不能判定两字符的大小写。原始输入的处理在sub_401A60中。此处伪代码并没有得出全部限制条件,还要往上看。

最后通过在SendMessageW的call附近分别找出,字串长度为7,包含”pb“。

现在条件已经足够了:长度7位,含有"pb”,3-6位含有"15PB"(不考虑大小写),字母只有两位,前两位为12,第1+点击数处为2,最后一位为7+点击数。
综合以上条件,只有“1215pb8”符合条件。

下面说说动态调试,没有动态此处结果还不是很好得的,特别是坑人的点击数参与了验证。
OD载入,计算好动态地址,下断,f9,直接退出。从堆栈找返回地址,最终找到offset 2BC9处的call,直接nop掉,重载继续。发现不断进消息处理,查找发现在offset 227B处的定时器,NOP掉。其它不在话下。
本人渣渣。不知所云,见笑。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课