pwnable.kr-coin

本文分享了一段Python编程经历,作者面对复杂的循环编程任务,从基础薄弱到逐步解决问题的过程。文章详细记录了从构建循环到调试错误的艰辛旅程,并探讨了如何在限制条件下寻找正确的数字。虽然程序仍有出错可能,但此过程展示了编程中的耐心与技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题对我这种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程序

最后,这个程序还是有出错的可能的。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值