Socat在末尾发送响应,但顺序不正确

Socat在末尾发送响应,但顺序不正确,c,debugging,socat,C,Debugging,Socat,我试图用socat作为服务器运行一个程序,这是一个非常简单的程序,但我没有按正确的顺序接收数据。我只在发送数据且顺序不正确时才收到服务器响应 节目: #include <stdio.h> int main(int argc, char *argv[]){ char buff[64]; char t[10]; printf("Welcome\n"); gets(t); printf(t); printf("\n"); gets(

我试图用socat作为服务器运行一个程序,这是一个非常简单的程序,但我没有按正确的顺序接收数据。我只在发送数据且顺序不正确时才收到服务器响应

节目:

#include <stdio.h>

int main(int argc, char *argv[]){
    char buff[64];
    char t[10];
    printf("Welcome\n");
    gets(t);
    printf(t);
    printf("\n");
    gets(buff);
    return 0;
}
显然,当我作为程序运行时,它工作正常

$ ./test 
Welcome
FOOBAR
FOOBAR
:)
会发生什么?我错过了任何争论吗

解决方案

添加
setbuf(标准输出,0)
;第一次打印前

#include <stdio.h>

int main(int argc, char *argv[]){
    setbuf(stdout, 0);
    char buff[64];
    char t[10];
    printf("Welcome\n");
    gets(t);
    printf(t);
    printf("\n");
    gets(buff);
    return 0;
}
#包括
int main(int argc,char*argv[]){
setbuf(标准差,0);
字符buff[64];
chart[10];
printf(“欢迎\n”);
获取(t);
printf(t);
printf(“\n”);
获得(buff);
返回0;
}

旁注1:
get(t)由于潜在的缓冲区溢出而不安全;使用
fgets(t,sizeof(t),stdin)取而代之<代码>获取(buff)也不安全。旁注2:
printf(t)
由于数据内容不可信而不安全;使用
printf(“%s”,t)替代,或使用
printf(“%s\n”,t)
将其与
printf(“\n”)组合呵呵,这就是这个例子的目的。泄漏金丝雀和libc思想格式字符串漏洞,然后利用缓冲区溢出进行攻击。我的问题是另一个。试着调用
fflush(stdout)printf
调用后,或调用
setlinebuf(stdout)
在第一个
printf
之前设置
stdout
流到行缓冲模式。添加setbuf(stdout,0);在第一次prinf之前,它工作正常。谢谢
$ ./test 
Welcome
FOOBAR
FOOBAR
:)
#include <stdio.h>

int main(int argc, char *argv[]){
    setbuf(stdout, 0);
    char buff[64];
    char t[10];
    printf("Welcome\n");
    gets(t);
    printf(t);
    printf("\n");
    gets(buff);
    return 0;
}