SICNU2018-CTF逆向 Sign
2018年五月川师的比赛题,一直放着没有看,今天清理文件拿出来看一下
x86,入口jmp一看就是VS编译,无壳无花
之前一直好奇大佬们是怎样做到秒题的,做完这道才题知道,只有敏锐的洞察力快速定位核心代码才是王道
很显然有两个判断点
第一个直接看赋值v5的函数sub_401186,这道题有意思的点在于每个函数都会有一个二次跳转,因此如果不能及时定位到关键点,在限定的时间内很难分析出来
非常无用的跳转,一直想拿IDC脚本剔除,但可惜没什么思路
进入之后
v8限定字符串长度,开头必须是 ‘SICNU{’ ,算上最后一个一定是‘}’,因此我们还要输入16个字符。
动态调试发现下面的判断也只判断了输入前6个字符,然后截断,并没有做其他操作
如图,动态调试发现,v1是对{后的输入每次取一字符,然后和key1密钥表异或,共操作六次
v2是剩余字符长度,其中除去反括号还有10个字符,这里sub_401230的功能F5识别出错,直接看汇编
rep stosd循环,ecx,11h为循环次数,eax初始0CCCCCCCCh,最后v2为固定值11
接下来判断是否是数字,是则+17,不是则与key2密钥表异或
接下来验证答案,要求C1等于key3-v20,C2等于key4-v13,所以写脚本直接反求即可
python脚本
python
a0 = [0xE5, 0xA6, 0xE4, 0xE2, 0xD4, 0x95, 0xEC] |