RootMe TCP返校挑战:计算结果转字节发送仍获错误结果求助
问题排查与解决方案
你的代码主要问题出在固定字节索引提取数值,以及可能的计算结果格式处理上,以下是具体分析和修正:
核心问题
- 固定切片不可靠:你用
data[171:174]这种固定字节位置提取val1和val2,服务器返回的提示文本长度可能每次都有细微变化(比如不同的提示语句),导致切片取到的不是正确数值,这是最关键的错误。 - 计算结果格式可能不符合要求:直接将浮点数转字符串可能会带多余小数位(比如
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
相关产品推荐
相关产品推荐

