KCTF_末日邀请


KCTF-末日邀请

0x0 前言

做题果然还是要坚持,害,爆破用的idalazydump的crc32table爆不出来,用shift-12 dump了十进制才爆出来了。

0x1 静态分析

1

这里第一步运算会得出来一个两位数的值,动调的时候可以发现。详细后面会说

2

40106c里面就是计算405b20里的值,直接动调就可以得到,坑的地方就是这里

3

4010b7里面就是判断一下然后减48或者55

4

然后就是这里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

5

这里就是判断一下4-7是KCTF 加回去那个55

6

这里v74判断的就是长度16

7

这里v19是上面爆破出来的7,前面有加2 就是9 ,然后9次循环,取第n位整除n位可以整除。

8

条件限制在下面,会把9位进行一个从小到大排序

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

爆破出来只有一个结果

10

最后的比对,前面那个算出来的v11的值 反转后 要等于 0xf52e0765

因为我们只不知道前面3位,直接爆破

11

这里我提了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里的,学到了


文章作者: Blue
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Blue !
评论
  目录