如何用netcat或socat代理运行C编译的ELF程序(CTF场景)
解决方案
1. 修复C程序的输出缓冲问题
你的C程序使用printf输出时,默认在非终端环境(如TCP套接字)下为全缓冲模式,导致输出不会立即发送到客户端。需强制刷新输出缓冲区或关闭缓冲:
修改后的代码:
// test.c #include <stdio.h> int main(void){ // 关闭标准输出缓冲,确保输出立即发送到客户端 setvbuf(stdout, NULL, _IONBF, 0); int n; while (scanf("%d", &n) != EOF){ if (n == 1) { printf("Only one\n"); } else { printf("%d\n", n); } // 也可选择每次printf后手动刷新:fflush(stdout); } return 0; }
重新编译:
gcc -o test test.c
2. 使用socat的正确启动命令
之前的命令缺少fork选项(无法同时处理多连接),且未确保双向流绑定。正确命令:
socat tcp4-listen:8763,fork exec:./test
fork:为每个客户端连接创建独立子进程,避免单连接阻塞整个服务exec:./test:将TCP套接字直接绑定到程序的标准输入/输出/错误流
3. 替代方案:适配不同版本的netcat
- GNU netcat:用
-c替代缺失的-e选项:nc -lp 8763 -c "./test" - BSD netcat(无
-e/-c):通过命名管道实现双向通信:
使用完成后删除命名管道:mkfifo fifo nc -lp 8763 < fifo | ./test > fiform fifo
验证步骤
客户端通过netcat连接测试:
nc <服务器IP> 8763
输入数字后应立即收到响应(如输入1返回Only one,输入5返回5)。
内容的提问来源于stack exchange,提问作者Miyago9267
相关产品推荐
相关产品推荐

