分析:
给了一份报文:
c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2
这是DDCTF2018,不会太简单,看着上面像16进制转ASCII一下:
利用base全家桶解密一下:
都没有得到有效的信息,没有任何思路。
=================
参考别人的writeup
思路:分析字符串的频率
import string
total = 0
cipertext = "c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2"
for i in string.printable:
if i in cipertext:
print(i)
total = total + 1
print("总共有字符:",total,"个")
all = 0
for i in cipertext:
all = all + 1
print("所有字符有:",all)
(对这个脚本还有一点想说的是,空格是可打印的字符,也就是说如果我们的字符串很多时,使用“”“存在的空格也会计算,利用防斜杆\处理,计算总共字符没问题,但计算所有字符会出现问题,但可以利用读取文件的方式进行解决,需要修改代码)
从脚本你的结果上看我们的进攻方向是在16进制上
实际上我们大致看也能看出来,知道方向后,我们让其16进制转ASCII码,发现一堆乱七八糟的字符,那么如何去解,字符是16进制,且118是2的倍数,我们可以两个两个拆分出来:
再回去观察一下这段十六进制字符,每两位一组,(注:这里的字符串与攻防世界提供的字符串不一样,理解原理即可)
发现都很大 ,都是以字母开头的十六进制。有多大呢,把它转换成十进制,更加直观地体会一下:
[212, 232, 225, 244, 160, 247, 225, 243, 160, 230, 225, 243, 244, 161, 160, 212, 232, 229, 160, 230, 236, 225, 231, 160, 233, 243, 186, 160, 196, 196, 195, 212, 198, 251, 185, 178, 178, 225, 226, 185, 185, 183, 180, 225, 180, 183, 227, 228, 179, 178, 178, 227, 230, 180, 179, 226, 181, 176, 182, 177, 176, 230, 225, 229, 225, 181, 253]
那为什么说它大呢,因为ASCII可见字符的十进制取值范围为32—126 ,所以上面的字符串转换成ASCII字符以后,出现的都是些非可见字符,也就是刚刚所提到的奇奇怪怪的字符。
那么要得到可见字符,就要把它们的值限制在[32,126] 之内,所以我们对其取128的余数 (为什么是128而不是127呢,这是习惯性选择2的8次方的结果吧),结果:
[84, 104, 97, 116, 32, 119, 97, 115, 32, 102, 97, 115, 116, 33, 32, 84, 104, 101, 32, 102, 108, 97, 103, 32, 105, 115, 58, 32, 68, 68, 67, 84, 70, 123, 57, 50, 50, 97, 98, 57, 57, 55, 52, 97, 52, 55, 99, 100, 51, 50, 50, 99, 102, 52, 51, 98, 53, 48, 54, 49, 48, 102, 97, 101, 97, 53, 125]
好,终于可以尝试转换为ASCII字符了:
['T', 'h', 'a', 't', ' ', 'w', 'a', 's', ' ', 'f', 'a', 's', 't', '!', ' ', 'T', 'h', 'e', ' ', 'f', 'l', 'a', 'g', ' ', 'i', 's', ':', ' ', 'D', 'D', 'C', 'T', 'F', '{', '9', '2', '2', 'a', 'b', '9', '9', '7', '4', 'a', '4', '7', 'c', 'd', '3', '2', '2', 'c', 'f', '4', '3', 'b', '5', '0', '6', '1', '0', 'f', 'a', 'e', 'a', '5', '}']
得到flag
利用脚本:
key = 'd4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c' \
'6fbb9b2b2e1e2b9b9b7b4e1b4b7e3e4b3b2b2e3e6b4b3e2b5b0b6b1b0e6e1e5e1b5fd'
list1 = []
for x in range(0,len(key),2):
k = key[x:x+2]
list1.append(k)
print(list1)
list2 = []
for x in range(0,len(list1)):
list2.append(int(list1[x],16))
print(list2)
list3 = map(lambda x:x%128,list2)
list33 = list(list3)
print(list33)
list4 = map(chr,list33)
list44 = list(list4)
print(list44)
flag = ''.join(list44)
print(flag)
===============
其他思路(没有了)及其脚本:
简单脚本(前提都是知道思路的)
1.
2.
3.
4.