一开始中规中矩的分析,发现很不顺利,main函数是很多奇怪的重复指令组成,不知道是解释执行器还是纯干扰,程序中还带了base64之类的编码算法。中间还带了一个加密的文件叫KCTF_ENC_FILE,貌似是整个程序的执行流程控制脚本的加密文件。
用户输入的用户名和序列号使用硬件断点后发现被sub_41EC4A和sub_41EDAB两个函数反复加密和解密,导致浪费了大量时间。用户名在若干次加密的时候会带上KCTF2023的后缀再次加密,貌似加密解密只是字符串传递的手段。但是后面发现一血和二血都出来的时候,就发现自己研究的方向不对了。
重新确定分析方法,这次把分析的重点放在
'Success, GoodJob!'
和
'error'
字符串的输出上,却发现一直断不下来,因为前面的判断条件一直恒不成立。但是这次分析的过程中却发现程序额外调用了memcmp这个函数,比较的内容居然就是输入的序列号。
于是重新修改输入用户名为KCTF,在memcmp的父函数sub_469F92的调用处设置断点,由于程序没有任何反调试,因此程序很快就被断住并显示以下内容。
0045257E
|
8BD6
| mov edx,esi | esi:&
"47a62c6eb8a72031a27b89abc3d976f7"
00452580
8BC8
| mov ecx,eax | eax:&
"35090e1336f1d1e872ba798256db1bfb"
00452582
| E8
0B7A0100
| call crakeme_kctf2023.
469F92
| 关键比较
稍微有点经验的一看就知道这个比较代表了什么。第一次在KCTF上看到这种比较,实在是浪费了我之前分析的几个小时。这个程序里面应该还有很多很精彩的设计,因为这个结果的出现也没有分析的动力了。因为中秋的原因,就不在继续研究了,坐等作者的设计思路,并祝所有选手和出题人双节快乐。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!