一不小心,拿了一血,也因这个开场坐了“跛豪”【英译:To be NO. 1】的位置半天。
直到大人们看不过眼,给他打上【签到题】,才有后来的群起攻之。
如果真的是看重比赛得分的话,一般都会忽略签到题,因为最终得分太低。
做题的顺序一般也是先攻没人攻破的,这样得分率较高。
一个残酷的事实是,某场公安部、信息部有涉及的CTF赛事中,
一些团队攻破赛题数量上颇为可观,可最终却被一些只攻破一个赛题的团队甩几条街,这就是核心决胜策略。
乱世鬼雄,在人生前进的路上,不要给自己设限,尤其是新手,闻道有先后,术业有专攻,管它是人是鬼还是神,搞搞不就知了,开卷有益。
这有点凑字嫌疑,强扯抒情。
言归正传
全部攻击记录如下,回头写WriteUp,差点自己都没看明白:-)
请输入用户名:5D78C3FDF21998AC 请输入序列号:F3A0FD8D8DE1FEB889808A8FF2D7FDA2 C6 E4 CA B5 CE D2 B8 FC CF B2 BB B6 CB EF BC E1 C6 E4 CA B5 CE D2 B8 FC CF B2 BB B6 CB EF BC E1 其 实 我 更 喜 欢 孙 坚 80 00 00 00 00 00 00 00 DA E5 23 10 06 71 95 71 4B A2 CE E2 33 2B B8 66 >>> u = 'KCTF'+'\x00'*12 >>> u 'KCTF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> x = 'C6 E4 CA B5 CE D2 B8 FC CF B2 BB B6 CB EF BC E1' >>> x.replace(' ','').decode('hex') '\xc6\xe4\xca\xb5\xce\xd2\xb8\xfc\xcf\xb2\xbb\xb6\xcb\xef\xbc\xe1' >>> xb = x.replace(' ','').decode('hex') >>> ''.join([chr(ord(u[i])^ord(xb[i])) for i in range(0x10)]).encode('hex') '8da79ef3ced2b8fccfb2bbb6cbefbce1' >>> ''.join([chr(ord(u[i])^ord(xb[i])) for i in range(0x10)]).encode('hex').upper() '8DA79EF3CED2B8FCCFB2BBB6CBEFBCE1'
(1)全局变量数组记录输出的用户名,
应当注意到,用户名信息长度是16字节
对于不够的长的用户名,通过memset补足零
(2)接着就是全局变量Hi_keybin记录序列号信息,32字节长度
如下左图,keyhex会先进行十六进制解码得到keybin,然后接着是右图keybin再十六进制编码得到keybinhex,然后与keyhex比对自校验。
(3)用户名信息(16字节)与keybin(32字节解码得到16字节)异或得到user_xor_key,
然后计算user_xor_key的哈希值,hash_of_userXORkey,
(4) 最后hash_of_userXORkey与参考ref_hash比对
(5)抓住主要矛盾
看到那几个常量,知道是hash就行,不需要知道是SM*还是MD*,这里只需要知道是哈希函数就行。
由于参考hash不变,所以hash的输入内容也不会变(当然,这是个有条件的真理,在王小云教授面前不一定成立)
由题目提供的用户名和key,我们得到hash的输入内容为
user_xor_key:=C6 E4 CA B5 CE D2 B8 FC CF B2 BB B6 CB EF BC E1 其 实 我 更 喜 欢 孙 坚
因为 user_xor_key = userhex ^ keybin,所以user = KCTF时(补足16字节为:'KCTF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
对应的keybin = user_xor_key ^ userhex
key = keybin.encode('hex')
这就是为何KCTF的key为8DA79EF3CED2B8FCCFB2BBB6CBEFBCE1
>>> u = 'KCTF'+'\x00'*12 >>> u 'KCTF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> x = 'C6 E4 CA B5 CE D2 B8 FC CF B2 BB B6 CB EF BC E1' >>> x.replace(' ','').decode('hex') '\xc6\xe4\xca\xb5\xce\xd2\xb8\xfc\xcf\xb2\xbb\xb6\xcb\xef\xbc\xe1' >>> xb = x.replace(' ','').decode('hex') >>> ''.join([chr(ord(u[i])^ord(xb[i])) for i in range(0x10)]).encode('hex') '8da79ef3ced2b8fccfb2bbb6cbefbce1' >>> ''.join([chr(ord(u[i])^ord(xb[i])) for i in range(0x10)]).encode('hex').upper() '8DA79EF3CED2B8FCCFB2BBB6CBEFBCE1'
[培训]《安卓高级研修班》彻底搞定函数抽取型壳!现在报名得源码和安卓8.1脱壳机!10月20日深圳专场不见不散!
最后于 13小时前 被HHHso编辑 ,原因: