本道提示让我们通过nc命令链接,所以直接连上去看看:

题目大概意思是:现在手里拿着一些金币,其中一个是假币,假币和真币外观一摸一样,但是重量不同,真币重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(("pwnable.kr",9007))
s.connect(("127.0.0.1",9007))

def GetNumbers(begin,end):
numList=[]
for i in range(begin,end):
numList.append(str(i))
#print " ".join(numList)
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: