简单尝试了一下表单提交,发现抽卡x次即生成x个随机数,再加上上面表情包的提示,初步判断题目应该是想让做题的人在cdkey处提交随机数种子。
还是常规操作,看看网页源码,找找线索。
发现JS代码
<script>
function random() {
var times = $("input[name='times']").val();
$.get("random.php?times="+times,
function(data) {
if(data) {
var show = $("div[name='show']")
show.empty()
show.append(data)
}
})
}
function verify() {
var verify = $("input[name='verify']").val();
$.post("verify.php", {
"ans": verify
},
function(data) {
if(data) {
alert(data)
}
})
}
</script>
知道了随机数是在random.php
下生成的,种子的校验应该是在verify.php
下校验的。同时也知道了参数的传递方式是get
还是post
。
刚开始觉得和祈福赛第一题很像,考虑是不是要爆破随机数种子,但是随机数取值范围不明了,而且随意提交一个值以后发现弹框
必须在两秒之内解决,显然是不能采取爆破种子的手段了。
这里参考国外大佬的一篇文章[传送门],通过第n
个值和第n+227
个值可以计算出种子的值。
构建python脚本如下:
import requests
import os
url = r"https://twoshot.hgame.n3ko.co/random.php?times=228"
session = requests.session()
response = session.get(url)
# print(response.text)
list = response.text.replace('[','').replace(']','').split(',')
# print(list)
cmd =os.popen("python reverse_mt_rand.py "+list[0]+" "+list[227]+" 0 0")
seed = cmd.read().strip()
print(seed)
cmd.close()
urlv = r"https://twoshot.hgame.n3ko.co/verify.php"
response2 = session.post(urlv,data={'ans':seed})
print(response2.text)
打开页面,如下:
简单测试一下,表面上的逻辑很简单,购买/出售,会消耗/获得相应的金额,但是出售的价格是比购买的价格低的,所以通过正常的页面操作是无法“赚取一个亿”的。
这道题其实我没做出来,最后有师傅提示说是条件竞争,才知道怎么做。
那这样就很简单了,懒得写脚本,burpsuite
直接发数据包,高线程卖出,低线程买入,摸了几分钟鱼,余额已经刷到8个亿了:
直接getflag即可。
(个人整理,如有错误欢迎指正)