网络字节顺序字节序转换

Posted

技术标签:

【中文标题】网络字节顺序字节序转换【英文标题】:Network byte order endianness conversion 【发布时间】:2022-01-22 11:02:35 【问题描述】:

我有以下几点:

#define IPADDR "\xc0\x80\x10\x0a" /* 192.168.1.10 */
#define PORT "\x7a\x69" /* 31337 */

但是,我终其一生都无法弄清楚十六进制值如何等于 ASCII 值。如何将其更改为不同的 IP 或端口号?

基本上我如何从IP到\xc0\x80\x10\x0a,反之亦然?

简而言之,我正在查看http://shell-storm.org/shellcode/files/shellcode-857.php,并想知道他们是如何到达那个长字符串的

谢谢

【问题讨论】:

长字符串只是上面反汇编列表中的机器码。那个以48 31 c0 开头并以0f 05 结尾。字符串也是如此。 无论你使用什么字节顺序或字节序,第一个字符串都无法解码为注释地址。其中至少有一个是错误的。 168 = 0xa8,这不在您的地址中,甚至没有反转。 【参考方案1】:

这与到达那里无关,只是表示同一事物的不同方式:

#include <stdio.h>
#include <stdint.h>
#include <string.h>

#define IPADDR "\xc0\x80\x10\x0a" /* not 192.168.1.10  */
                                  /* but 192.128.16.10 */

#define PORT "\x7a\x69"           /* not 31337 */
                                  /* but 27002 */

#define c2ui(a) ((unsigned int)(unsigned char)a)

int main()

    printf("\n%u.%u.%u.%u\n", c2ui(IPADDR[0]),
                              c2ui(IPADDR[1]),
                              c2ui(IPADDR[2]),
                              c2ui(IPADDR[3]));

    printf("\n\\x%02x\\x%02x\\x%02x\\x%02x\n", c2ui(IPADDR[0]),
                                               c2ui(IPADDR[1]),
                                               c2ui(IPADDR[2]),
                                               c2ui(IPADDR[3]));
    union
    
        uint8_t s_port[3];
        uint16_t v_port;
     v;
    memcpy(v.s_port, (uint8_t *)&PORT[0], sizeof(PORT));
    printf("\nport: %u\n", v.v_port);

除了我在示例代码中指出的描述中存在错误之外。相反,在 PORT 的情况下存在问题,因为该数字是否正确取决于该程序将在其上运行的系统类型。例如,在我的系统上,要获得描述中的值,我必须反转这两个字符。出于这个原因,将这种类型的格式用于值并不是一个好主意。如果是这样写就更好了:

#define PORT 31337                /* 31337 */

【讨论】:

"\x7a\x69" 是端口 31337。端口 27002 是 "\x69\x7a" @Chris Dodd:操作...我已经将它从原来的倒过来做一个测试。现在我更正它【参考方案2】:

有标准函数 nthos/htons/ntohl/htonl 在网络和主机字节顺序之间转换 16 位和 32 位值(基本上是端口号和 ipv4 地址)。比如:

sockaddr_in  addr;

addr.sin_addr = htonl(INADDR_LOOPBACK);  // loopback address converted to network order
addr.sin_port = htons(31337);  // convert port to network order

【讨论】:

以上是关于网络字节顺序字节序转换的主要内容,如果未能解决你的问题,请参考以下文章

主机字节序和网络字节序转换

请问 网络编程里的主机字节顺序和网路字节概念?

什么时候需要高低字节序转换,即ntohs()函数

主机序和网络序以及使用例子

网络与主机字节转换函数:htons ntohs htonl ntohl

网络字节序与主机字节序的转换