【发布时间】:2021-03-30 01:52:36
【问题描述】:
假设我有一个示例字节数组:
unsigned char byte_array[] = "\xff\x00\xaf\xc1\x00\x00\x00\x00\x00\x00\x00\x00";
说我还有一个指向汇编操作码的指针:
unsigned char *opcodes = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
如何将byte_array 的最后8 个字节指向opcodes 指向byte_array 的指针opcodes 的内存地址(不是opcodes 指向的数据)字节?例如说opcodes指向的内存地址是:
0x0000ffffffffffff8
我希望byte_array 成为:
\xff\x00\xaf\xc1\xf8\xff\xff\xff\xff\xff\x00\x00
基本上我需要以某种方式提取存储在变量opcodes 中的内存地址,并将该内存地址分配给byte_array 的最后8 个字节。
【问题讨论】:
-
首先,您需要使该字节数组更大。目前它只有 5 个字节长。
-
我注意到我在最后一秒修改了它。
-
将
opcodes的字节复制到byte_array中想要的字节。 -
请注意,您的
opcodes不使用 64 位绝对地址。编译该 C 并运行objdump -D -rwC -Mintel,我得到ff 00 inc DWORD PTR [rax]/af scasd/c1 00 00 rol DWORD PTR [rax],0x0。 (其余的零解码为00 00 add BYTE PTR [rax],al。)在c1字节之后删除一个64位绝对地址会将地址的低字节解码为ModRM字节,这可能需要一些后面的字节作为更多的寻址-模式字节。接下来的一个字节将是立即旋转计数。 -
x86-64 对于
mov的特殊形式只有 64 位绝对寻址。 (往返 AL/AX/EAX/RAX)。
标签: arrays c assembly memory append