无法读取libc的随机字符

qqrboqgw  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(86)

我正在写一个向stdout输出随机字节的(dotnet)程序。
然后,这些字符将通过管道输入到另一个使用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块。

gwbalxhn

gwbalxhn1#

在思考了这一点之后,我认为有两件事正在发生:

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

您链接的C代码查看前4个字节,并期望它们是一个 *signed int *,这取决于系统,它可能意味着多种情况,但在大多数情况下,它将是一个32位signed integer存储类。
如果它是伪随机字节,则有50:50的可能性,您的第一位将始终将其设置为负值。

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

htonlntohl这样的函数可以解决这个问题。“在C语言中,您可以在<arpa/inet.h>中找到它们。
如果您确实正在写入字节,请尝试在进行管道传输之前将字节的int数量设置为网络字节顺序,然后在它们到达时将其转换回主机字节顺序。

相关问题