0%

KCTF-婉若游龙

婉若游龙

这题挺简单的,算法也不难。很快就写出了KeyGen,不过有一点需要注意的事,程序似乎没有控制好缓冲区的长度,导致serial处输入32个任意字符后会直接弹出正确的提示信息,会给新手很迷惑的感觉。

分析

HardCoded硬编码很简单,在IDA中跟一下字符串就可以找到,就是“HardCoded”。然后输入name: CTFHUB.和serial:XXXXXX...

对name的处理是每个字符先对0xA取余,然后与在整个字符串中的位置相异或,再加2,最后再对0xA取余得到6个字节的checksum。

对serial的处理就是对每个字符0xA取余,得到对应的checksum。

最后两个checksum比较,相同则成功。

KeyGen

菜鸡花了点时间写了个脚本,有错误请指出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/python2
# coding: utf-8
"""
KCTF-婉若游龙
"""
name = "CTFHUB"
serial = ""

def serial_proc(serial):
checksum = []
for ch in serial:
checksum.append(str(ord(ch)%10))
return "".join(checksum)

def re_proc_serial(checksum, offset):
serial = ""
for i in checksum:
serial += chr(int(i) + offset) # 这里加offset是为了保证字符可见且正常
return serial

if __name__ == "__main__":
i = 0
checksum_name = []
offsets = [30, 40, 50, 60, 70, 80, 90, 100, 110]
for ch in name:
tmp = (i ^ (ord(ch)%10)) + 2 # 先取余,再异或
tmp = tmp % 10
checksum_name.append(str(tmp))
i += 1
c = "".join(checksum_name)
print "CTFHUB checksum:" + c
for offset in offsets:
print "KeyGen Serials:" + re_proc_serial(c, offset)
'''output
CTFHUB checksum:974335
KeyGen Serials:'%"!!#
KeyGen Serials:1/,++-
KeyGen Serials:;96557
KeyGen Serials:EC@??A
KeyGen Serials:OMJIIK
KeyGen Serials:YWTSSU
KeyGen Serials:ca^]]_
KeyGen Serials:mkhggi
KeyGen Serials:wurqqs
'''