网络字节顺序字节序转换
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
【讨论】:
以上是关于网络字节顺序字节序转换的主要内容,如果未能解决你的问题,请参考以下文章