RCTF 2018线上赛 writeup
RCTF 2018线上赛 writeup
2018-05-21 12:59 by 蝉时雨, … 阅读, … 评论, 收藏, 编辑
苦逼的RCTF,只进行了两天,刚好第二天是5.20,出去xxx了,没法打比赛,难受。比赛结束了,还不准继续提交flag进行正确校验了,更难受。
下面是本次ctf解题思路流程
后面我解出的题会陆续更新上来
MISC
sign
下载附件,发现打不开,以兼容性、管理员权限等还是打不开
丢进winhex初步审视一下16进制没啥发现
用binwalk扫描一下,发现一张png
提取,但是提取不出来,转手动提取,得到图片
本子,铅笔,红酒杯。
通过红酒杯联想到linux wine,用wine打开,得到flag
git
打开下载的附件,里面有个helloword.txt。打开里面没啥发现。。
进.git里面去看看,在COMMIT_EDITMSG处看到
发现flag被删掉了,题目也说file lost了
在ORIG_HEAD
尝试pull,失败,再尝试一下revert呢,得到flag XD
Number Game
直接nc过去看题
sha256加密,四位数还好可以碰撞,脚本跑起来:
- sha256enc = "087e72033b1eacecd78845563696b9a449015aeb29a12b0f49c969cafababbb2"
- key = "DPgOJtFiF9euj7HX"
- for i in strlist:
- code = i[0]+i[1]+i[2]+i[3]
- encinfo = hashlib.sha256(code+key).hexdigest()
- if encinfo == sha256enc:
- print code
- break
可以得到code,输入
来到正题
随意尝试了输入,猜测Nope的规律,大概就是Nope x,y x表示有x个数字猜对并且位置对了,y表示有y个数字猜对了,但是位置错的
猜测机会只有6次!且每次输入值如果大于10秒左右就提示timeout了,所以人为分析是不可能了(除非你是脑王,能在10秒内见招拆招看到回馈想出下一步要猜的数的话当我在放屁)
其实这个游戏很早就有了(文曲星猜数字了解一下)
网上没有关于python的解题程式这是比较坑的,由于本人之前没有玩过猜数字游戏,迫于无奈只有先去查阅资料了解算法原理,最后自己苦逼码出了python解法
经过8回合(其实实际应该大战了一百回合Orz)的大战,搞到了flag。。。。。
下面是python猜数字解法(本算法是原创算法,不是最优算法,一次挑战可能不成功,多执行几次就可以了,大神勿喷。。。。)
- #!/usr/bin/env python
- # coding=utf-8
- # author:401219180
- import time
- import socket
- import string
- import re
- import itertools
- import hashlib
- def returnmsg(data):
- """发送与接收,代替nc"""
- s.send(data)
- time.sleep(1.5)
- msg = s.recv(2048)
- return msg
- def createTree(inputstr, dictree):
- """对比集合列表得出a,b生成字典"""
- inputlist = inputstr.split(" ")
- newdictree = {}
- for x in dictree:
- a, b = 0, 0
- for i in range(4):
- if inputlist[i] == x[i]:
- a += 1
- continue
- if inputlist[i] in x:
- b += 1
- continue
- newdictree[x] = a, b
- return newdictree
- def createList(dic, result):
- """集合字典里面生成有效集合列表"""
- numlist = []
- for k, v in dic.iteritems():
- if v == result:
- numlist.append(k)
- return numlist
- def listvalueTostr(listindex):
- """生成要猜的值"""
- inputstr = listindex[0] + " " + listindex[1] + " " + listindex[2] + " " + listindex[3]
- return inputstr
- # 建立nc连接
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect(("149.28.139.172", 10002))
- time.sleep(1)
- firstinfo = s.recv(1024)
- r = r'\+(.*?)\)'
- key = re.findall(r, firstinfo)[0]
- sha256enc = firstinfo[-78:-14]
- print key
- print sha256enc
- # sha256碰撞,得出xxxx的值
- code = ''
- strlist = itertools.product(string.letters + string.digits, repeat=4)
- for i in strlist:
- code = i[0] + i[1] + i[2] + i[3]
- encinfo = hashlib.sha256(code + key).hexdigest()
- if encinfo == sha256enc:
- print code
- break
- print returnmsg(code)
- r1 = r'Nope. (.*?)\n' # 正则用于匹配Nope的值
- def startgame():
- # 初始化列表
- while 1: # 打通关了才知道连续大战8回合,所以干脆写个无限循环
- numlist = []
- for i in itertools.permutations(string.digits, 4):
- numlist.append(i)
- input1 = "2 3 4 5" # 根据本人多次测试,首轮猜2 3 4 5比猜1 2 3 4赢得几率大些Orz....
- while 1:
- dictree1 = createTree(input1, numlist)
- print "guess: " + input1
- recvdata = returnmsg(input1)
- print recvdata
- if "You got it!" in recvdata:
- break
- ab = re.findall(r1, recvdata)[0]
- numlist = createList(dictree1, eval(ab))
- try:
- input1 = listvalueTostr(numlist[0])
- except IndexError, msg:
- print msg
- if "Flag" in recvdata: # 如果返回的信息里面有Flag,终止while循环
- break
- startgame()
未待完续
To be continued…
后面会陆续更新