实验吧解题笔记——编程(五)

来源:互联网 发布:电脑开单软件 编辑:程序博客网 时间:2024/05/08 21:31

0.说明

每五个题目写作一篇writeup,第一行对应解题笔记(一)……
这里写图片描述

1.字典

题目描述:

包含ctf的单词的总字符有多少?
字典文件格式如下
这里写图片描述

分析

这个题目使用Python去按行读取文件,同时使用Python内置的index()方法查找字符串(通常来说Python内置的算法都经过了算法优化,运行效率高于自己编写的),如果再字符串中查找到”ctf”字符,记录其字符个数。这里有一个坑就是按行读取文件时会把换行符\n也读取进去,需要用replace方法替换再计数,代码如下:

re_str = 'ctf'num = 0with open('dictionary.txt', 'r') as f:    while True:        line = f.readline()        #print(type(line))        if not line:            break        try:            if line.index(re_str) >= 0:                num += len(line.replace('\n', ''))                print(len(line.replace('\n', '')))                print(line, end='')        except:            passprint('CTF{' + str(num) + '}')

3.速度爆破

题目描述

这里写图片描述

分析

可以看到,这个题目和“百米”属于同一类型的题目,需要编写程序自动完成抓取、计算、提交的步骤。抓取和提交的步骤在“百米”的题目中已经讲过了,这里略过,主要讲一下如何使用python计算sha1和md5值。

python内置的有一个叫hashlilb的库,里面实现了很多与密码学有关的算法,使用时十分便捷。
以md5的计算过程为例(计算sha1的方法相同),首先初始化一个hashlib.md5的对象,将以utf-8编码的字符串作为参数传入,可以得到计算结果,然后我们还需要将其转换成十六进制的形式打印出来才能便于我们阅读,代码如下:

data = ‘test’.encode(‘utf-8’)hash_md5 = hashlib.md5(data)print(hash_md5.hexdigest())

最终解题的代码如下:

import hashlibimport requestsfrom bs4 import BeautifulSoupget_url = 'http://ctf5.shiyanbar.com/ppc/sd.php'session = requests.session()html = session.get(get_url).contentsoup = BeautifulSoup(html, 'lxml')encode_str = soup.div.get_text()for i in range(0, 100000 + 1):    hash_md5 = hashlib.md5(str(i).encode('utf-8')).hexdigest()    hash_sha1 = hashlib.sha1(hash_md5.encode('utf-8')).hexdigest()    if encode_str == hash_sha1:        #提交        payload = {'inputNumber':i}        post =session.post(get_url, payload)        print(post.text)

FLAG:
这里写图片描述

原创粉丝点击