看雪CTF2019 Q2神秘来信

CTF题目解析思路

Posted by JovenHe on June 28, 2019

最近迷上逆向的感觉了,根据汇编码逆向推出序列号,看清出题人的思路是一件很有成就的事。下面这道题就是在Q2晋级赛最简单的一道题,我只得出部分答案,并没有推出完整答案,还是自己太菜,而且思维不够活跃,这道题,有很多人都是通过穷举的方式,直接一次次尝试得到了序列号。

双击运行exe文件

运行界面.png

随便输入后,错误则显示“error!”,紧接着就退出了

IDA打开exe

直接来到主方法。

主方法.png

F5查看伪代码

f5main.png

可以看到

v9存储地址->ebp-3Ch

v10存储地址->ebp-3Bh

v11存储地址->ebp-3Ah

v12存储地址->ebp-39h

v13存储地址->ebp-38h

v14存储地址->ebp-37h

初步判断如下:

初级判断.png

可以看到序列号共6位,后三位是353,前三位ASCII码加起来为149,但其中并没有走success的分支。

需要接着查看,上面判断完后直接走了以下汇编逻辑:

异常判断.png

可以看到进来后直接是走try catch语句,没有异常会最终执行到error所在方法,有异常则会走到success分支,下面来看try中的代码

除法文本视图位置.png

关键是esi=esi-eax;然后计算除法,只有除数为0会导致除0异常,所以esi必须等于eax,动态调试一波:

动态调试.png

得到eax值为401353,而esi计算如下:

十六进制相加.png

是6位数字转化为16进制数,所以6位数就是401353,也恰恰验证了之前的判断。

验证

success.png

总结

本题关键还是多看汇编,我在这方面是菜鸟,有些指令还要现查,只能多学多看了。