在“实验吧”的做CTF题时遇到的一道题,地址在这里:http://ctf5.shiyanbar.com/misc/cidai.html
因为正在学python,做这道题的时候正好用python写个简单程序辅助做题,将学到的知识用入实战,巩固一下python知识
感觉收获挺大,故此写下这篇随笔记录下。
----------------------------------------------------------华丽的分割线--------------------------------------------------------------------------
1.看题
首先题目给出的编码只有字符 'o' 和下划线 '_' ,可以很容易联想到二进制
接着观察样码,共有8行刚好对应 'Beijing' 有8个字符,并且每行只有7个字符,若表示成二进制刚好符合ASCII编码。
于是可以确定每一行可以转成一个二进制再通过ASCII编码转成字符
那么问题就来了是o代表0,_代表1呢?
还是o代表1,_代表0呢?
所以我们需要通过样码来确定
2.敲代码
这么多的符号,要是手动一个一个改成0,1再查ASCII码改成字符肯定不现实
而最近正好在学python,于是正好用python写一个小程序来实现这些功能 来练练手
我敲的代码如下:
1 #coding=UTF-8 2 filename='2.txt' 3 with open(filename,'r') as file: 4 lines=file.readlines() 5 n=len(lines) 6 i=0 7 8 # 将o_码转为二进制码并写入文档 9 for i in range(0,n): 10 lines[i].rstrip('\n') 11 lines[i]=lines[i].replace('o','0') 12 lines[i]=lines[i].replace('_','1') 13 with open(filename,'a') as file: 14 file.write('\n\n') 15 for line in lines: 16 file.write(line) 17 18 # 网上扒的一个将二进制串转为字符串的函数 19 def decode(s): 20 return ''.join([chr(m) for m in [int(b, 2) for b in s.split(' ')]]) 21 22 for i in range(0,n): 23 lines[i]=decode(lines[i]) 24 25 # 将解码后的字符串写入文档 26 with open(filename,'a') as file: 27 file.write('\n\n') 28 for line in lines: 29 file.write(line)
(如果对于代码有更好的建议可以告诉我)
这里先假设 'o'-->0,'_'-->1
3.解码
将样码放进2.txt文档里,执行后
打开2.txt,结果最后一行乱码了,说明假设错误,应当是'0'-->1,'_'-->0
修改代码后
成功了,得到了我们想要的结果
然后将需要解码的那一段放进1.txt里,执行就能得到结果
4.总结:
虽然这个题本身是很简单的,解题过程也是很简单的,对于一些大佬来说是完全不起眼的小题。但是对于小菜鸟的我来说,通过最近正学的python辅助解题的这个过程很有意义的。在写python代码的过程中,遇到的一些坎,在百度的过程中,一方面了解了很多还不知道的知识,另一方面还熟悉了一些代码,比如数据类型的转换,文件操作等。
总之,学习需要一点一点地积累。
Where there is a will,there is a way!