提问人:T. Webster 提问时间:5/1/2023 更新时间:7/18/2023 访问量:34
随机字符 libc 读取失败
Random characters failing libc read
问:
我正在编写一个 (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
答:
0赞
Scott Christensen
7/18/2023
#1
经过思考,我认为正在发生以下两件事之一:
可能性 1 -- 您只是没有在流前面加上一定数量的字节。
您链接的 C 代码查看前 4 个字节,并期望它们是一个有符号的整数,具体取决于可能意味着多个内容的系统,但在大多数情况下,它将是一个 32 位有符号整数存储类。
相反,如果它是伪随机字节,则有一个 50:50 的镜头,您的第一位将始终将其设置为负数。
可能性 2 -- 您的字节顺序在点网中转换,而您在写入流时没有意识到这一点。
函数 like 和 exists 来解决这个问题。在 C 语言中,您可以在 <arpa/inet.h> 中找到它们。htonl
ntohl
如果您确实在写入字节,请尝试在管道之前将字节数设置为网络字节顺序,然后在它们到达时将它们转换回主机字节顺序。int
评论