站在小白的视角上,写了在写题目的wp方面更多是想体现题目思考的逻辑和细节,更多是写给同样新手小白的内容,解题方面为什么从这一步到下一步的,很助于培养思考题目的逻辑思,payload细节理解方面参考过很多篇wp。尽我所能把细节阐释到位。
如果存在理解说辞不是特别清晰了然的话,就麻烦各位大佬师傅指点啦~
这次写题的感悟是,其实写过的题再写一遍未必能写出来,适时反过去去写旧题,也许有新的感悟?这次题解是七夕节特别编辑0v0呀~
其他刷题记录可以在博客主页上看到。主方向是web。
目录
[HUBUCTF 2022 新生赛]Calculate
开题。
大意就是。计算给出的等式。计算完20个就给FLAG。
但是为了避免被爬虫【大概?】需要你回答问题时长>=1秒。
但是为了获取FLAG。你需要回答每个问题时长<=3秒。
综上回答每个问题时长在1-3秒之间。
超时也不行。时间太短也不行。手动操作计算肯定是来不及的。这个时候写个py脚本或许是个不错的选择。
在写脚本之前。我们来确定一下答案处的参数【写脚本发包时需要知道参数名。】
具体做法:【BP拦截一下流量包看看】
获取成功。
传参方式为POST。参数名为ans。
写代码的时候配合一些解释显得更通俗易懂。
#calculate.py【re】
import requests
import time
'''用到time是因为我们要满足题目1~3内答题时间需要用到time模块下的方法'''
url="http://node5.anna.nssctf.cn:20291/"
res=requests.session() #创建session对象,接收流量包的一方通过sessionid知道我们是谁,方便对于答对次数计数,如果没有的话其实也可以发包,但无法计数。
#每次提交
for i in range(1,30): #这里其实写21就ok了。
math ="" #设置math,每次计算完math都为空。用处:用来计算每次post提交的值。
response =res.get(url) #GET形式发包。获取题目内容。
time.sleep(1.1) #停1.1s来满足题目中1~3秒的限制。
responsetext=response.text #返回包的内容
#根据网页源码内容在每个数字前后都有【<div>5</div>】来正则过滤【re】获取目标数字
for j in range(0,len(responsetext)):
if responsetext[j-1]==">" and responsetext[j+1]=="<" and responsetext[j]!="\n" :
math = math +responsetext[j]
math = math.strip('=') #根据上述添加方法必然会把 "=" 囊括进。我们需要将'=去掉。
final=eval(math) #就像实际将字符串当作代码执行【245*292】但我们如果没有去除【=】就无法执行,会报错,因为eval本身就可以进行式子运算。不再需要等号了。
#计算工作做好之后,准备发包内容。
data={
'ans':final #ans即是我们拦截流量包获取的参数名。final则是计算得到的结果。
}
response =res.post(url=url,data=data) #发包内容。
print(response.text) #打印返回的内容
time.sleep(1)
#检测FLAG。
if "NSSCTF{" in response:
print("Got it:---【",response.text,"】")
exit() #结束本程序。
正则匹配中这行代码是根据实际参与运算的字符来看的。
#正则匹配。
if responsetext[j-1]==">" and responsetext[j+1]=="<" and responsetext[j]!="\n" :
math = math +responsetext[j] #这里实际上是对字符的加和。
例如:
页面式子是:【242*29=】
math的加和方式是 “2”
再“24”
再“242”
再“242*”<