西普学院CTF编程题之百米
site:http://www.simplexue.com/ctf/examctfdetail/31
题目要求:
嗯,三秒时间内计算题目并提交正确的结果,我陷入了思考。。。这又不是最强大脑题目组,但是我们有最强工具–计算机的说。
基本思路就是网络编程get到题目并POST提交计算结果。
程序如下,亲测有效lol
# -*- coding: cp936 -*- import urllib import urllib2 from bs4 import BeautifulSoup # 需要用到BeautifulSoup模块 # 初始化,设置常量 #设置cookie cookie = "__guid=78867218.2533551382962505700.1436858134904.6907; " \ "Hm_lvt_1f960d9c1005acc770c545889855ce76=1436857309,1436858552,1436859335,1437120172;" \ " PHPSESSID=eb429e1c1f6c31fecdf1fae189706af9" #设置HTTP头,请求页面时的关键语句 headers = {'Cookie': cookie} url = "http://ctf8.simplexue.com/jia/" urlcheck = "http://ctf8.simplexue.com/jia/index.php?action=check_pass" data = None #请求算式页面 r1 = urllib2.Request(url, data, headers) resp = urllib2.urlopen(r1) html = resp.read() #利用BeautifulSoup找到算式 soup = BeautifulSoup(html) content = soup.findAll(attrs={"name": "my_expr"}) s = str(str(content).split('>')[1]).split('<')[0] print s #计算结果 for i in ('(', ')', '+', '-', 'x'): s = s.replace(i, '') ls = s.split() a = [] for i in range(len(ls)): a.append(int(ls[i])) result = (a[0] + a[1]) * (a[2] - a[3]) - (a[4] + a[5] - a[6]) * a[7] print result #post提交结果 data = urllib.urlencode({'pass_key': result}) r = urllib2.Request(urlcheck, data, headers) resp2 = urllib2.urlopen(r) print resp2.read()
运行后再打印的Response中找到key值
KEY:S33h4Yu
总结:主要是基于cookie的数据请求,然后是利用BeautifulSoup进行数据提取,当然也可以用正则,然后是本题目中给出的算式是有特点存在的,运算符号位置都没变,只是每次变换生成的数值,数值的位数还是一定的,所以这个是个专有算法,但是类似的题目思路都是一样的。最后是个带data数据的POST提交。
主要技能点:urllib,urllib2包的使用,带cookie的Request,BeautifulSoup数据提取,带data的POST提交
———————————分割线———————
现在看以前的程序感觉真的是太蠢了。。。
完全可以用更少的代码实现同样的功能,最主要的是用requests这个包,这个可以说是对urllib和urllib2包的简化,功能强大而且编程实现简单。加上合理使用re正则表达式,算式直接eval出结果,几行代码就可以完成。
python果然是越学越好用。
import re import requests url = 'http://ctf8.shiyanbar.com/jia/' session = requests.session() r = session.get(url).content p = re.search(r"'my_expr'>(.*?)</div>", r) s = eval(p.group(1).replace('x', '*')) data = {'pass_key': s} print session.post(url, data).content
在输出的返回数据中找到key.