题目给了一串神秘字符串:
d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd
用如下Python代码分析了一下这串字符的组成:
#!/usr/bin/python3
string01 = 'd4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd'
newls = list(set([letter for letter in string01]))
newls.sort()
print(newls,len(newls))
结果显示:
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'] 16
可以得出这大概率是用16进制编码的,于是尝试使用 CyberChef 解答,拖拽 From Hex 模块,
结果出现一堆乱码...到此处就不知道如何处理了!
经过查找资料,发现了解题的关键!
题目给出的字符串确实是16进制的,但每个16进制都是大于 7F 的,换算成10进制就是都大于 127 的,于是我们让每个16进制 都减去128 再用ASCII解密。
这里主要是对 ASCII 编码不够熟悉,要记住,ASCII 的 10进制数范围是:
0 ~ 127
下面是自己写的Python解密脚本:
#!/usr/bin/python3
s = 'd4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd'
ls = [ chr(int(f"{s[i]}{s[i+1]}",16)-128) for i in range(0,len(s),2) ]
print(''.join(ls))
flag:
DDCTF{9af3c9d377b61d269b11337f330c935f}
总结:
对于每一种编码的格式特点要熟练掌握,并会灵活的互相转换,想办法把加密的字符往自己认为对的方向上靠拢。