拿到程序后,首先运行一下,看看情况:
载入IDA,查看一下字符串,看到了Y0u win等字样,结合ollydbg动态分析之后,明白了程序的基本流程。
首先将获取的输入经atol()函数转为数字,并与92381221h做比较,之后对输入做md5并将结果与4850B7446BBB20AAD140E7B0A964A57D进行比较,一致则success。而经查询4850B7446BBB20AAD140E7B0A964A57D对应的明文是sakjflks。这样叫我如何是好?既要等于92381221h又要是sakjflsk,除此之外,sakjflsk经该程序md5之后有些位置为大写字母,有些为小写,要满足这些实在是不现实。
之后想对按钮下一个消息断点,从头看看是否忽略了什么东西。
结果看到了这个,原来里面有两个”输入(Input)”的button,od里ctrl+g搜索ShowWindow下断。
这里可以看到有一个按钮被hide了,把它的值00000000改成00000001即可。
这才是它正常的面貌。右边那个应该是在逗我。在GetWindowTextA处下断,od里逐步跟
发现这里是个很关键的地方,一言不合就跳到失败的地方去了,IDA里f5看看里面是什么
可以看到这是在判断输入是否满足基本格式OOCTF{里面有32位}。输入需要满足这种格式。满足这些条件后,程序运行到这里,调用函数00401860,且传入的参数正是{}里面的32位字符串。
经该函数处理后,得到另外一串字符串,并调用函数00402d06进行判断是否一致。
现在思路很清晰了,输入的字符串首先由函数00401740进行格式判断,满足格式后,再由函数00401860对{}中的32位数据进行处理,处理结果由函数00402d06判断是否等于b5h760h64R867618bBwB48BrW92H4w5r。
现在的关键就是函数00401860的过程,IDA里面看该函数的代码:
该函数对于字符串中的数字不做处理,字母转化成字母表中对应的0-25之间的数值,并由
进行处理,之后将得到的v9再转化成相应的字母,其中v5,v6的值用od跟的过程中可以看到,v6等于28,v5在之前由sub_41458e进行过处理,为3或5。
加密算法清楚了,解密即可,至于v5的值,3和5都试一下,5可以得到正确答案。

转自实验吧,原文作者实验吧ID c0smic