【问题标题】:What format is this string representing serv_addr buffer?这个字符串代表 serv_addr 缓冲区的格式是什么?
【发布时间】:2019-03-22 13:47:09
【问题描述】:

所以我一直在阅读有关如何使用 Frida 的教程:https://www.frida.re/docs/functions/,我遇到了以下问题:

$ ./client 127.0.0.1
connect() is at: 0x400780

Here's the serv_addr buffer:
02 00 13 88 7f 00 00 01 30 30 30 30 30 30 30 30
Press ENTER key to Continue

本教程指出 字节 表示 0x1388 或 5000,因此很明显它不是十六进制或十进制。我尝试使用 base64 转换器转换字符串以查看是否出现 0x1388 或 5000 但没有运气。

这究竟是什么格式?我最近没有进行低级编程,如果我记得,字节是 8 位 1 和 0 的组。

编辑: 是的,教程指出这代表一个结构。但是他怎么知道它代表的是0x1388呢?如果我收到这样的字符串,有没有办法让我理解它代表一个特定的值,而不是发送消息的代码的作者?

【问题讨论】:

  • 根据你的链接页面是struct sockaddr_in
  • 字节 1388 在该输出中,因此可以猜到 0x1388 的来源。也可以猜测它是二进制结构的原始字节输出,如果您查看代码就可以确认。
  • @EugeneSh。但是struct是什么格式的,他是怎么从这个字符串中取出0x1388的呢?
  • 对我来说看起来像原始二进制文件。第 3 和第 4 个字节是 0x13 和 0x88。 sockaddr_in 中的 sin_port 处于网络顺序。根据文档。
  • 数字似乎采用大端格式 - 在网络相关数据中并不少见。

标签: c networking format byte


【解决方案1】:

代码的相关部分是这样的:

printf ("\nHere's the serv_addr buffer:\n");
b = (unsigned char *) &serv_addr;
for (i = 0; i != sizeof (serv_addr); i++)
  printf ("%s%02x", (i != 0) ? " " : "", b[i]);

它所做的只是从结构serv_addr(类型为struct sockaddr_in)中打印原始数据。

这里没有“字符串”(在 C 以 null 结尾的字节字符串的意义上)。

0x1388serv_addr.sin_port 的值,打印为第三个和第四个字节(1388,在网络(big endian)字节顺序中)。


知道输出是sockaddr_in结构的原始数据,我们可以很容易地破译数据

  • 02 00 这是sin_family 成员,其值为2(十进制)。此值对应于AF_INET。这是按主机字节顺序排列的。

  • 13 88 这是(如前所述)sin_port 中端口的网络字节顺序。

  • 7f 00 00 01 这是sin_addr 成员,对应于IP 地址127.0.0.17f127)。这也是网络字节顺序。

  • 其余的 30 30 30 30 30 30 30 30 是“垃圾”,它将结构填充到 struct sockaddr 的通用大小,即 16 个字节长。

【讨论】:

  • 所以它实际上是十六进制的......但是在大端?但十六进制值为 0x1388。对不起,如果我的问题听起来很愚蠢。我将审查字节顺序并重新阅读您的回复。
猜你喜欢
  • 2012-10-31
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 2022-11-28
相关资源
最近更新 更多