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

如何用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 > fifo
    
    使用完成后删除命名管道:rm fifo

验证步骤

客户端通过netcat连接测试:

nc <服务器IP> 8763

输入数字后应立即收到响应(如输入1返回Only one,输入5返回5)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:12:21