苦逼的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...
后面会陆续更新
原文地址:https://www.cnblogs.com/semishigure/p/9066453.html