Python Socket模块请求发送异常:CTF场景下无响应问题排查
问题原因
- 协议格式完全错误:你错误地给每个指令套上了HTTP POST请求的框架,但这个CTF服务器是基于纯文本指令的,根本不识别HTTP格式,所以服务器没有任何响应。
- 字符串格式化语法错误:代码里的
\{}是多余的转义,应该直接用{},同时换行符的写法混乱,导致发送的指令格式完全不符合服务器预期。 - 指令结构不符合要求:题目要求发送的是
USER aliensignal这类完整指令,但原代码的指令拼接逻辑完全偏离了服务器的预期格式。
解决方法
直接发送纯文本指令,每个指令结尾加上换行符(\r\n),确保服务器能识别指令结束。修正后的代码如下:
from signal import signal, SIGPIPE, SIG_DFL signal(SIGPIPE, SIG_DFL) import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('localhost', 10000)) # 定义要发送的指令列表,完全匹配题目要求 commands = [ "USER aliensignal", "PASS unlockserver", "SEND moonbase", "END" ] for cmd in commands: # 发送指令,加上换行符作为协议结束标记 sock.sendall(f"{cmd}\r\n".encode('utf-8')) # 接收响应并解码为可读字符串打印 response = sock.recv(2048) if response: print(f"Response: {response.decode('utf-8').strip()}") else: print("No response received") sock.close()
关键说明
- 移除了多余的HTTP请求框架,直接发送题目要求的纯文本指令。
- 使用
sendall替代send,确保指令完整发送,避免因TCP流特性导致的部分发送问题。 - 每个指令结尾添加
\r\n,这是多数文本协议的指令结束标记,让服务器明确知道当前指令已发送完成。 - 对接收的字节响应进行解码,转换成可读字符串输出,避免打印原始字节内容。
如果注释里的要求是每个字段单独发送(即先发USER、接收响应,再发aliensignal、接收响应,以此类推),则修改指令列表为:
commands = [ "USER", "aliensignal", "PASS", "unlockserver", "SEND", "moonbase", "END" ]
其他代码逻辑保持不变即可。
内容的提问来源于stack exchange,提问作者netcat420
相关产品推荐
相关产品推荐

