最近迷上逆向的感觉了,根据汇编码逆向推出序列号,看清出题人的思路是一件很有成就的事。下面这道题就是在Q2晋级赛最简单的一道题,我只得出部分答案,并没有推出完整答案,还是自己太菜,而且思维不够活跃,这道题,有很多人都是通过穷举的方式,直接一次次尝试得到了序列号。
双击运行exe文件
随便输入后,错误则显示“error!”,紧接着就退出了
IDA打开exe
直接来到主方法。
F5查看伪代码
可以看到
v9存储地址->ebp-3Ch
v10存储地址->ebp-3Bh
v11存储地址->ebp-3Ah
v12存储地址->ebp-39h
v13存储地址->ebp-38h
v14存储地址->ebp-37h
初步判断如下:
可以看到序列号共6位,后三位是353,前三位ASCII码加起来为149,但其中并没有走success的分支。
需要接着查看,上面判断完后直接走了以下汇编逻辑:
可以看到进来后直接是走try catch语句,没有异常会最终执行到error所在方法,有异常则会走到success分支,下面来看try中的代码
关键是esi=esi-eax;然后计算除法,只有除数为0会导致除0异常,所以esi必须等于eax,动态调试一波:
得到eax值为401353,而esi计算如下:
是6位数字转化为16进制数,所以6位数就是401353,也恰恰验证了之前的判断。
验证
总结
本题关键还是多看汇编,我在这方面是菜鸟,有些指令还要现查,只能多学多看了。