随机字符 libc 读取失败

Random characters failing libc read

提问人:T. Webster 提问时间:5/1/2023 更新时间:7/18/2023 访问量:34

问:

我正在编写一个 (dotnet) 程序,将随机字节输出到 stdout。

然后,这些字符通过管道传递到另一个使用 libc 函数的程序中。read

{
  char v4[76]; // [rsp+0h] [rbp-50h] BYREF
  int buf; // [rsp+4Ch] [rbp-4h] BYREF

  read(0, &buf, 4uLL);
  if ( buf >= 0 )
  {
    read(0, v4, buf);
    return 0LL;
  }
  else
  {
    fwrite("Size must be greater than zero.\n", 1uLL, 0x20uLL, stderr);
    return 0xFFFFFFFFLL;
  }
}

随机字符(如下所示)导致始终小于零。buf

�0�S�󈻌52$N�CJ�p�7r�]�-?���1}n" ��

任何对原因的解释都是值得赞赏的。目标是进入区块。if

c .net ubuntu io libc

评论

0赞 user3840170 5/1/2023
我建议将输入粘贴为 hexdump(或 base64)而不是原始。
0赞 Scott Christensen 7/16/2023
尝试将区域设置设置为 C.UTF-8 或 en_US。UTF-8 格式。如果 locale 没有更改任何内容,那么您可能会看到使用有符号的字符读取并将其提升为 int 而不先将其转换为无符号字符的效果

答:

0赞 Scott Christensen 7/18/2023 #1

经过思考,我认为正在发生以下两件事之一:

可能性 1 -- 您只是没有在流前面加上一定数量的字节。

您链接的 C 代码查看前 4 个字节,并期望它们是一个有符号的整数,具体取决于可能意味着多个内容的系统,但在大多数情况下,它将是一个 32 位有符号整数存储类。

相反,如果它是伪随机字节,则有一个 50:50 的镜头,您的第一位将始终将其设置为负数。

可能性 2 -- 您的字节顺序在点网中转换,而您在写入流时没有意识到这一点。

函数 like 和 exists 来解决这个问题。在 C 语言中,您可以在 <arpa/inet.h> 中找到它们。htonlntohl

如果您确实在写入字节,请尝试在管道之前将字节数设置为网络字节顺序,然后在它们到达时将它们转换回主机字节顺序。int