KCTF-末日邀请
0x0 前言
做题果然还是要坚持,害,爆破用的idalazydump的crc32table爆不出来,用shift-12 dump了十进制才爆出来了。
0x1 静态分析
这里第一步运算会得出来一个两位数的值,动调的时候可以发现。详细后面会说
40106c里面就是计算405b20里的值,直接动调就可以得到,坑的地方就是这里
4010b7里面就是判断一下然后减48或者55
然后就是这里v17的值要等于v15这里计算出来三个值的与,动调的时候随便输入发现这里不是7就是0很奇怪那时候不知道为啥。v17又要等于前3个输入的异或出来。然后这里就是思路关键点没想到,那时候只觉得每次都是两位十六进制数。看了wp发现这里就可以0xff爆破每次v66后面3个的与
v33 = [0]*200
for i in range(0xff):
v13 = i
v15 = v13
for j in range(200):
if v15 & 1 !=0:
v15 = 3 * v15 +1
else:
v15 >>= 1
v33[j] = v15
v17 = v33[198] | v33[197] | v33[196]
print(v17)
#7
会发现爆破出来第一个是0后面都是7,才明白难怪动调的时候,对比的不是7就是0
这里就是判断一下4-7是KCTF 加回去那个55
这里v74判断的就是长度16
这里v19是上面爆破出来的7,前面有加2 就是9 ,然后9次循环,取第n位整除n位可以整除。
条件限制在下面,会把9位进行一个从小到大排序
然后对比9位,那就是123456789 说明9位每位都不能相同,1-9全有
for i in range(100000000,1000000000):
if i//10000000 %2 == 0 and i//1000000%3 == 0 and i//100000%4 == 0 and i//10000%5 == 0 and i//1000 %6 == 0 and i//100 % 7 == 0 and i//10 % 8 == 0 and i%9 == 0:
num_all = str(i)
if "1" in num_all and "2" in num_all and "3" in num_all and "4" in num_all and "5" in num_all and "6" in num_all and "7" in num_all and "8" in num_all and "9" in num_all :
print(i)
#381654729
爆破出来只有一个结果
最后的比对,前面那个算出来的v11的值 反转后 要等于 0xf52e0765
因为我们只不知道前面3位,直接爆破
这里我提了idaLazy的数据,就是爆不出来,然后用了十进制爆出来了
def crc32(data: bytes) -> int:
v11 = -1
for b in data:
v11 = (table[(v11 ^ b) & 0xff] ^ (v11 >> 8))
return ~v11 & 0xffffffff
cs = string.printable
for i in itertools.product(cs, repeat=3):
part1 = "".join(i)
sn = part1 + "KCTF381654729"
if crc32(sn.encode()) == 0xF52E0765:
print(sn)
break
table放入提出来的,就可以了,代码是学风间仁wp里的,学到了