_昏鸦

导航

 

           在“实验吧”的做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!

posted on 2017-07-14 15:53  _昏鸦  阅读(1044)  评论(0编辑  收藏  举报