这道题对我这种python编程基础薄弱的人真的太耗费心力了,写个循环用了一个小时,改错改了六七个小时。。。最后的成果还是有出错的可能
from pwn import *
import re
def sendab(a,b)://sendab函数专门用来构建一个a到b的字符串,然后发送出去
send_str=""
for i in range(a,b+1):
send_str=send_str+str(i)+" "
s.sendline(send_str)
print "send="+send_str+'\n'
print "a="+str(a)+' '+"b="+str(b)
result=s.recvline()
print "result="+result
if len(result)>=10:
return 9
else:
return int(result)
def loop(a,b,c)://a,b是要检测的数字范围,c则是剩余的次数,因为题目要求次数为0时发送正确的数
//字,所以需要加入c
print "c="+str(c)+'\n'
if ((b-a)==1) and (c>=1)://这个超长的if elif结构完全是我暂时没有能力构建出良好代码弄出来的
//笨东西,这东西就是最后调错一点点垒起来的。。。
if sendab(a,a)==9:
for i in range(0,c):
sendab(a,a)
return 0
elif sendab(a+1,a+1)==9:
for i in range(0,c-1):
sendab(a+1,a+1)
return 0
elif ((b-a)==1) and (c==0):
sendab(a,a)
return 0
elif ((b-a)==2) and (c>2):
if sendab(a,a)==9:
for i in range(0,c):
sendab(a,a)
return 0
elif sendab(a+1,a+1)==9:
for i in range(0,c-1):
sendab(a+1,a+1)
return 0
else:
for i in range(0,c-2):
sendab(b,b)
return 0
elif ((b-a)==2) and (c==2):
if sendab(a,a)==9:
for i in range(0,c):
sendab(a,a)
return 0
elif sendab(a+1,a+1)==9:
for i in range(0,c-1):
sendab(a+1,a+1)
return 0
else:
sendab(b,b)
return 0
middle=(b+a)/2 //实际上loop()的主体就这7行。。。
if sendab(a,middle)!=(middle-a+1)*10:
print "left="+str(a)+' '+"right="+str(middle)+' ' +"choice left\n"
loop(a,middle,c-1)
else:
print "left="+str(middle+1)+' '+"right="+str(b)+' ' +"choice right\n"
loop(middle+1,b,c-1)
s = remote('127.0.0.1',9007)//因为要放到官网上运行,所以选用本地IP
print s.recv()
for i in range(0,100)://总共要收集100个正确的答案,所以循环100次
recvword = s.recvline() //这6行就是为了截取N和C的值
print "[+]server: ",recvword//这6行就是为了截取N和C的值
p = re.compile(r'\d+') //这6行就是为了截取N和C的值
data = p.findall(recvword) //这6行就是为了截取N和C的值
n=int(data[0]) //这6行就是为了截取N和C的值
c=int(data[1]) //这6行就是为了截取N和C的值
loop(0,n-1,c)
print s.recv(1024)//最后得到答案
其中六行如何获取N和C的值,参考https://www.cnblogs.com/p4nda/p/7144704.html 正则学了就忘。。。
最后这个程序要放到服务器上,不然以我的网速运行到三十多就不行了,
命令如下 scp -P 2222 coin.py input2@pwnable.kr:/tmp/input2
input2账号之前的其它账号似乎没有权限运行python程序
最后,这个程序还是有出错的可能的。。。