本道提示让我们通过nc命令链接,所以直接连上去看看:
![](https://cdn.jsdelivr.net/gh/hskull00/Images/pwn/cve_shellshock20210915100528.png)
题目大概意思是:现在手里拿着一些金币,其中一个是假币,假币和真币外观一摸一样,但是重量不同,真币重10假币重9,然后我们找到100枚假币才会得到flag。我们会获得一些硬币(N),然后设定规则对某一组硬币称重,在有限的C次机会内找到假币。最终需要在60s内完成游戏100次,即找到100枚假币来完成游戏。
分析:
题目是一个和漏洞关系不大的coding题目,主要是二分法查找,还是做一下吧,这里记得先随便用个之前的题目ssh登录到服务器在解题比较好,因为这玩意儿要完成100次,网速不稳定就会在中间某次请求超时失败,所以登录服务器本地做题。比如使用前面的inpu2题目登录,在/tmp/下新建coin目录(得新建目录才可以),然后再coin/下写代码并执行即可。
写好的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| import socket import re
s=socket.socket()
s.connect(("127.0.0.1",9007))
def GetNumbers(begin,end): numList=[] for i in range(begin,end): numList.append(str(i)) return " ".join(numList)
def StartGame(num,count): fr=(0,num/2) sr=(num/2,num) for i in range(count+1): s.send(GetNumbers(fr[0],fr[1])+"\n") data=s.recv(1024) print "[Server] "+data if(re.match(r"^\d+$",str(data))): weigh=int(data) if(weigh%10==0): fr=(sr[0],(sr[0]+sr[1])/2+(sr[0]+sr[1])%2) sr=(fr[1],sr[1]) else: fr=(fr[0],(fr[0]+fr[1])/2+(fr[0]+fr[1])%2) sr=(fr[1],sr[0])
if __name__ == "__main__": print s.recv(1024*2) while True: data=s.recv(1024) if(re.match(r"^N=(\d+) C=(\d+)$",str(data))): print "[Server] "+data num=int(data.split(" ")[0].split("=")[1]) count=int(data.split(" ")[1].split("=")[1]) StartGame(num,count) elif(re.match(r"^Correct!$",str(data))): print "[Server] "+data continue elif("format error" in str(data) or "time expired! bye!" in str(data)): break else: print "[Server] "+data break
s.close()
|
执行后,成功得到flag:
![](https://cdn.jsdelivr.net/gh/hskull00/Images/pwn/cve_shellshock20210915194900.png)