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加密,四位数还好可以碰撞,脚本跑起来:

  1. sha256enc = "087e72033b1eacecd78845563696b9a449015aeb29a12b0f49c969cafababbb2"
  2. key = "DPgOJtFiF9euj7HX"
  3. for i in strlist:
  4. code = i[0]+i[1]+i[2]+i[3]
  5. encinfo = hashlib.sha256(code+key).hexdigest()
  6. if encinfo == sha256enc:
  7. print code
  8. break

可以得到code,输入

来到正题

 

随意尝试了输入,猜测Nope的规律,大概就是Nope x,y   x表示有x个数字猜对并且位置对了,y表示有y个数字猜对了,但是位置错的

猜测机会只有6次!且每次输入值如果大于10秒左右就提示timeout了,所以人为分析是不可能了(除非你是脑王,能在10秒内见招拆招看到回馈想出下一步要猜的数的话当我在放屁)

其实这个游戏很早就有了(文曲星猜数字了解一下)

网上没有关于python的解题程式这是比较坑的,由于本人之前没有玩过猜数字游戏,迫于无奈只有先去查阅资料了解算法原理,最后自己苦逼码出了python解法

经过8回合(其实实际应该大战了一百回合Orz)的大战,搞到了flag。。。。。

下面是python猜数字解法(本算法是原创算法,不是最优算法,一次挑战可能不成功,多执行几次就可以了,大神勿喷。。。。

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. # author:401219180
  4. import time
  5. import socket
  6. import string
  7. import re
  8. import itertools
  9. import hashlib
  10. def returnmsg(data):
  11. """发送与接收,代替nc"""
  12. s.send(data)
  13. time.sleep(1.5)
  14. msg = s.recv(2048)
  15. return msg
  16. def createTree(inputstr, dictree):
  17. """对比集合列表得出a,b生成字典"""
  18. inputlist = inputstr.split(" ")
  19. newdictree = {}
  20. for x in dictree:
  21. a, b = 0, 0
  22. for i in range(4):
  23. if inputlist[i] == x[i]:
  24. a += 1
  25. continue
  26. if inputlist[i] in x:
  27. b += 1
  28. continue
  29. newdictree[x] = a, b
  30. return newdictree
  31. def createList(dic, result):
  32. """集合字典里面生成有效集合列表"""
  33. numlist = []
  34. for k, v in dic.iteritems():
  35. if v == result:
  36. numlist.append(k)
  37. return numlist
  38. def listvalueTostr(listindex):
  39. """生成要猜的值"""
  40. inputstr = listindex[0] + " " + listindex[1] + " " + listindex[2] + " " + listindex[3]
  41. return inputstr
  42. # 建立nc连接
  43. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  44. s.connect(("149.28.139.172", 10002))
  45. time.sleep(1)
  46. firstinfo = s.recv(1024)
  47. r = r'\+(.*?)\)'
  48. key = re.findall(r, firstinfo)[0]
  49. sha256enc = firstinfo[-78:-14]
  50. print key
  51. print sha256enc
  52. # sha256碰撞,得出xxxx的值
  53. code = ''
  54. strlist = itertools.product(string.letters + string.digits, repeat=4)
  55. for i in strlist:
  56. code = i[0] + i[1] + i[2] + i[3]
  57. encinfo = hashlib.sha256(code + key).hexdigest()
  58. if encinfo == sha256enc:
  59. print code
  60. break
  61.  
  62. print returnmsg(code)
  63. r1 = r'Nope. (.*?)\n' # 正则用于匹配Nope的值
  64.  
  65.  
  66. def startgame():
  67. # 初始化列表
  68. while 1: # 打通关了才知道连续大战8回合,所以干脆写个无限循环
  69. numlist = []
  70. for i in itertools.permutations(string.digits, 4):
  71. numlist.append(i)
  72. input1 = "2 3 4 5" # 根据本人多次测试,首轮猜2 3 4 5比猜1 2 3 4赢得几率大些Orz....
  73. while 1:
  74. dictree1 = createTree(input1, numlist)
  75. print "guess: " + input1
  76. recvdata = returnmsg(input1)
  77. print recvdata
  78. if "You got it!" in recvdata:
  79. break
  80. ab = re.findall(r1, recvdata)[0]
  81. numlist = createList(dictree1, eval(ab))
  82. try:
  83. input1 = listvalueTostr(numlist[0])
  84. except IndexError, msg:
  85. print msg
  86. if "Flag" in recvdata: # 如果返回的信息里面有Flag,终止while循环
  87. break
  88. startgame()

 未待完续

To be continued…

后面会陆续更新

版权声明:本文为semishigure原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/semishigure/p/9066453.html