SICNU-CTF逆向 Sign

Author Avatar
kabeor 7月 26, 2019

SICNU2018-CTF逆向 Sign

2018年五月川师的比赛题,一直放着没有看,今天清理文件拿出来看一下

x86,入口jmp一看就是VS编译,无壳无花

之前一直好奇大佬们是怎样做到秒题的,做完这道才题知道,只有敏锐的洞察力快速定位核心代码才是王道

main函数

很显然有两个判断点
第一个直接看赋值v5的函数sub_401186,这道题有意思的点在于每个函数都会有一个二次跳转,因此如果不能及时定位到关键点,在限定的时间内很难分析出来

非常无用的跳转,一直想拿IDC脚本剔除,但可惜没什么思路
进入之后

v8限定字符串长度,开头必须是 ‘SICNU{’ ,算上最后一个一定是‘}’,因此我们还要输入16个字符。
动态调试发现下面的判断也只判断了输入前6个字符,然后截断,并没有做其他操作

回到主函数看到第二个判定在v3,直接进入

如图,动态调试发现,v1是对{后的输入每次取一字符,然后和key1密钥表异或,共操作六次
v2是剩余字符长度,其中除去反括号还有10个字符,这里sub_401230的功能F5识别出错,直接看汇编

rep stosd循环,ecx,11h为循环次数,eax初始0CCCCCCCCh,最后v2为固定值11

接下来判断是否是数字,是则+17,不是则与key2密钥表异或

接下来验证答案,要求C1等于key3-v20,C2等于key4-v13,所以写脚本直接反求即可

python脚本

a0 = [0xE5, 0xA6, 0xE4, 0xE2, 0xD4, 0x95, 0xEC]
a1 = [ 0xFC, 0x11, 0x41, 0xC7, 0x66, 0x42, 0x5D, 0x68, 0x28, 0x3B]
key1 = [0xB2, 0xC3, 0xD5, 0xA1, 0xE4, 0xF8, 0xA9]
key2 = [0xA3, 0x45, 0xEA, 0x35, 0x3E, 0x26, 0x5D, 0x46]

C1 = [0,0,0,0,0,0,0]
for i in range(6):
C1[i]=chr(key1[i]^a0[i])

print("flag: SICNU{", end = '')
for a in range(6):
print(C1[a], end = '')

i = 0
k = 0
C2 = [0,0,0,0,0,0,0,0,0,0]
for j in range(10):
C2[i] = a1[j] - 17
if(C2[i]>=48 and C2[i]<=57):
C2[i] = chr(C2[i])
i=i+1
j=j+1
continue
else:
C2[i] = chr(key2[k] ^ a1[j])
i=i+1
j=j+1
k=k+1

for a in range(10):
print(C2[a], end = '')

flag

From https://kabeor.github.io/SICNU-CTF逆向 Sign/ bye

This blog is under a CC BY-NC-SA 4.0 Unported License
本文链接:https://kabeor.github.io/SICNU-CTF逆向 Sign/