You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:22:43