Hitchhiking_in_the_Galaxy
F12后有个php文件,这个就是顺风车,但是直接点是打不开的,所以我们尝试抓包改请求头
直接把请求的页面换成这个,看响应信息,所请求方法错误,那就换POST呗
发现说要什么什么引擎,我还去百度了这个鬼东西,没啥用,估计就是随便找了一个高大上的东西
后来想到引擎就想到了User-Agent,改了一下还真是
下一步就是改referer了呗
然后就是xff了,flag出现
watermelon
知乎有破解的解析
直接搜SetScoreTween后把e改成2000,但是好像不管用,没有flag出来
搜索createOneFruit,把e设置成1就会一直掉小西红柿,一直玩到2000分就会弹出flag
方法二:
直接改判断条件,导航
智商检测鸡
这题要求解100题积分,积分的格式很单一,所以可以写脚本来做
- 涉及sympy库的
integrate()
函数,解定积分的,这篇文章写了比较全的这个库的用法; - 涉及
round()
函数,四舍五入的保留小数点多少多少位
这里记录一下这个函数解定积分的的用法:
integrate(执行的表达式,(未知数,上值,下值))
第一个参数是执行的表达式,第二个参数是一个括号,里面第一个值是所代入的未知数,第二个值是下面的数字,第三个值是上面的数字
比如第一个题目的定积分:
int(d) * x + int(e)
就是表达式12x+17
int(a + b)
是-92
int(c)
是31
integrate(int(d) * x + int(e), (x, int(a + b), int(c)))
首先我们把解定积分的脚本写好
可以看到这个题目是给的一个json格式,而且是html的样子,可以树化
解定积分大概就这样就行
import requests
from sympy import *
import json
from lxml import etree
question=requests.get('http://r4u.top:5000/api/getQuestion').text
ques=json.loads(question)['question']
q=etree.HTML(ques)
a=q.xpath('//math/mrow/msubsup/mrow[1]/mo/text()')[0] #下面的数字的符号
b=q.xpath('//math/mrow/msubsup/mrow[1]/mn/text()')[0] # 下面的数字
c=q.xpath('//math/mrow/msubsup/mrow[2]/mn/text()')[0] # 上面的数字
d=q.xpath('//math/mrow/mn[1]/text()')[0] # x的系数
e=q.xpath('//math/mrow/mn[2]/text()')[0] # 后面加的常数
x = symbols('x') # 定义x变量(sympy库的规则)
y = integrate(int(d) * x + int(e), (x, int(a + b), int(c)))
ans=round(y,2)
print(a,b,c,d,e,ans)
运行结果正确
随便提交一个数据,发现会以一个这样的格式提交上去,而且方式是POST,地址也换了一个
接下来构造请求信息,注意这个回答应该是一个字符串的形式,不然会因为json把字典转成字符串时报错
data={'answer':str(ans)}
header={'Content-Type': 'application/json;charset=UTF-8'}
因为要连续的做题,所以开启session来发起请求,成功了
看到这个函数,知道解完了题目后会访问这个地址得到flag
最终的脚本
import requests
from sympy import *
import json
from lxml import etree
# 开启session会话
s = requests.session()
# 循环解题100道
for i in range(100):
question=s.get('http://r4u.top:5000/api/getQuestion').text
#题目是以json格式给出,使用loads将他转化成字典
ques=json.loads(question)['question']
# 树化这个信息
q=etree.HTML(ques)
# 把参数全部用xpath爬取出来
a=q.xpath('//math/mrow/msubsup/mrow[1]/mo/text()')[0]
b=q.xpath('//math/mrow/msubsup/mrow[1]/mn/text()')[0]
c=q.xpath('//math/mrow/msubsup/mrow[2]/mn/text()')[0]
d=q.xpath('//math/mrow/mn[1]/text()')[0]
e=q.xpath('//math/mrow/mn[2]/text()')[0]
# 定义变量x
x = symbols('x')
# 解出定积分
y = integrate(int(d) * x + int(e), (x, int(a + b), int(c)))
# 保留两位小数
ans=round(y,2)
# 构造请求信息
data={'answer':str(ans)}
header={'Content-Type': 'application/json;charset=UTF-8'}
# 发起post请求提交答案
res=s.post('http://r4u.top:5000/api/verify',data=json.dumps(data),headers=header).text
# 在解完100道题目的时候把flag打印出来
while i ==99:
flagres=s.get('http://r4u.top:5000/api/getFlag').text
print(flagres)
break
运行结果
不起眼压缩包的养成的方法
学到一个新的东西叫做已知明文攻击
我们为zip压缩文件所设定的密码,首先被转换成3个32bit的key,所以可能的key的组合是2^96,这是个天文数字,如果用暴力穷举的方式是不太可能的,除非你的密码比较短或者有个厉害的字典。
压缩软件用这3个key加密所有包中的文件,也就是说,所有文件的key是一样的,如果我们能够找到这个key,就能解开所有的文件。
如果我们找到加密压缩包中的任意一个文件,这个文件和压缩包里的文件是一样的,我们把这个文件用同样的压缩软件同样的压缩方式进行无密码的压缩,得到的文件就是我们的Known plaintext(已知明文)。用这个无密码的压缩包和有密码的压缩包进行比较,分析两个包中相同的那个文件,抽取出两个文件的不同点,就是那3个key了,如此就能得到key。两个相同文件在压缩包中的字节数应该相差12个byte,就是那3个key了。虽然我们还是无法通过这个key还原出密码,但是我们已经可以用这个key解开所有的文件,所以已经满足我们的要求了,毕竟对我们而言,得到解压后的文件比得到密码本身更重要。
看题目名字就知道应该把后缀改成zip,发现有密码,通过注释知道不仅可以爆破,也可以去搜图,p站这幅图有个id,这就是密码70415155
打开后还有一层加密的压缩包,看里面同样有一个NO PASSWORD.txt文件,看到CR32值一样的时候就知道是明文攻击
txt文件里说道了储存,所以把改txt文件已储存方式压缩一下,然后开ARCHPR进行明文攻击就可以了,拿到密码C8uvP$DP,发现还有一个加密的压缩文件,直接010editor打开,里面有一段html编码,解码就是flag