Python Socket连接服务器收发数据:CTF任务回传数字失败求助
嘿,我帮你看看这个CTF脚本的问题,你遇到的两个核心问题——服务器不认回传的数据、循环只跑一轮,其实都是socket交互里的常见小坑,咱们一步步来解决:
问题根源分析
1. 字节与字符串的类型搞错了
在Python3里,socket.recv() 返回的是字节对象(bytes),而你直接把它丢给re.sub处理(正则只认字符串),还直接用str(data)转成字符串后传给send()——但send()要求传入字节,这就导致服务器收到的格式完全不对,自然识别不了。
2. 没给服务器输入结束的信号
很多CTF的这类交互服务器,都期望你回传数据后加个换行符(\n)来告诉它“我输入完了”。如果没这个标记,服务器会一直等你继续输入,你的脚本也会卡在下一次recv(),看起来就像循环只跑了一轮就停了。
3. 循环终止的隐性问题
你的if not data: break逻辑没问题,但如果因为前面的格式错误导致服务器直接断开连接,recv()就会返回空字节串,触发break,循环直接终止。
修复后的完整代码
import socket import re # 初始化TCP socket(IPv4) clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接目标服务器 clientsocket.connect(('35.157.111.68', 10172)) try: while True: # 接收数据并转成字符串 raw_data = clientsocket.recv(1024) if not raw_data: print("服务器关闭了连接") break # 把字节转成UTF-8字符串,同时去掉首尾空白(比如多余的换行) received_str = raw_data.decode('utf-8').strip() print(f"收到服务器消息: {received_str}") # 提取所有数字 extracted_numbers = re.sub(r'\D', '', received_str) print(f"提取到的数字: {extracted_numbers}") # 把数字转成字节,加上换行符后发送(告诉服务器输入结束) response = extracted_numbers.encode('utf-8') + b'\n' clientsocket.send(response) finally: # 不管脚本怎么结束,都确保socket被关闭 clientsocket.close()
关键修改点说明
- 字节↔字符串转换:先把收到的字节用
decode('utf-8')转成字符串再处理正则,发送前再用encode('utf-8')转回字节,符合socket的要求。 - 添加换行符:给回传的内容加上
b'\n',让服务器知道你已经完成了一次输入,不会一直等待。 - 调试打印:加了print语句,方便你实时看到收发的内容,万一还有问题也能快速排查。
- 资源清理:用
try...finally确保socket一定会被关闭,避免残留连接。
内容的提问来源于stack exchange,提问作者MatanyaP
相关产品推荐
相关产品推荐

