0.说明
每五个题目写作一篇writeup,第一行对应解题笔记(一)……
1.字典
题目描述:
包含ctf的单词的总字符有多少?
字典文件格式如下
分析
这个题目使用Python去按行读取文件,同时使用Python内置的index()方法查找字符串(通常来说Python内置的算法都经过了算法优化,运行效率高于自己编写的),如果再字符串中查找到”ctf”字符,记录其字符个数。这里有一个坑就是按行读取文件时会把换行符\n也读取进去,需要用replace方法替换再计数,代码如下:
re_str = 'ctf'
num = 0
with 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:
pass
print('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 hashlib
import requests
from bs4 import BeautifulSoup
get_url = 'http://ctf5.shiyanbar.com/ppc/sd.php'
session = requests.session()
html = session.get(get_url).content
soup = 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: