【问题标题】:Pointing a section/end of unsigned char array to a memory address将 unsigned char 数组的部分/结尾指向内存地址
【发布时间】: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


【解决方案1】:

与 C 中的所有对象一样,指针的值由内存中的字节表示。要使其他一些字节指向指针指向的相同字节,可以简单地将表示指针的字节复制到其他字节:

memcpy(byte_array + offset, &opcodes, sizeof opcodes);

这里offset 大概是五个,在您似乎在byte_array 中拥有的五个初始字节之后开始。

请注意,这显然是一个利用程序漏洞的粗略实验。尽管这个概念很有吸引力,但要成功利用漏洞需要的知识比这个问题所暗示的要多得多,而且这并不是学习软件工程的最佳途径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 2021-12-06
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2019-04-07
    相关资源
    最近更新 更多