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

RootMe TCP返校挑战:计算结果转字节发送仍获错误结果求助

问题排查与解决方案

你的代码主要问题出在固定字节索引提取数值,以及可能的计算结果格式处理上,以下是具体分析和修正:

核心问题

  1. 固定切片不可靠:你用data[171:174]这种固定字节位置提取val1和val2,服务器返回的提示文本长度可能每次都有细微变化(比如不同的提示语句),导致切片取到的不是正确数值,这是最关键的错误。
  2. 计算结果格式可能不符合要求:直接将浮点数转字符串可能会带多余小数位(比如10.0而非10),服务器可能期望整数或特定精度的小数格式。

修正后的代码

import math
import socket
import re

HOST = "challenge01.root-me.org"
PORT = 52002

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    # 循环接收完整响应,避免单次recv截断数据
    data = b""
    while True:
        chunk = s.recv(1024)
        if not chunk:
            break
        data += chunk
        # 检测到挑战提示结尾,停止接收
        if b"Give me the result:" in chunk:
            break
    
    # 转字符串并提取两个目标整数
    data_str = data.decode('utf-8')
    nums = re.findall(r'\d+', data_str)
    if len(nums) >= 2:
        val1 = int(nums[-2])
        val2 = int(nums[-1])
    else:
        print("Failed to extract values")
        exit()
    
    # 计算结果并优化格式
    sqrt_val1 = math.sqrt(val1)
    result = sqrt_val1 * val2
    
    # 自动处理整数/小数格式,去掉多余末尾0
    if result.is_integer():
        result_str = str(int(result))
    else:
        result_str = f"{result:.10f}".rstrip('0').rstrip('.') if '.' in f"{result:.10f}" else f"{result:.10f}"
    
    # 发送带换行的结果
    send_data = f"{result_str}\n".encode('utf-8')
    s.sendall(send_data)
    
    # 接收服务器反馈
    response = s.recv(1024)
    print(f"Received: {response.decode('utf-8')}")

关键改进点

  • 正则提取数值:用re.findall(r'\d+', data_str)匹配所有数字,取最后两个对应val1和val2,彻底规避固定索引的风险。
  • 完整接收响应:循环接收直到拿到完整的挑战提示,防止数据截断。
  • 结果格式优化:自动判断结果是否为整数,去掉冗余小数位,确保格式符合服务器要求。
  • 使用sendall:替代send确保所有数据发送完成,避免部分发送的问题。

内容的提问来源于stack exchange,提问作者achraf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:37:24