【问题标题】:Allocate writable memory in the .text section在 .text 部分分配可写内存
【发布时间】:2021-10-12 10:52:03
【问题描述】:

除了.data.bss之外,是否可以在NASM程序的其他部分分配内存?

假设我想写信到.text 部分中的某个位置并收到Segmentation Fault

我对避免这种情况和合法访问内存的方法很感兴趣。我正在运行 Ubuntu Linux

【问题讨论】:

  • .text 部分在大多数操作系统上默认是写保护的。只需将您想要写入的任何内容放入另一个部分即可避免这种情况。

标签: linux assembly memory-management nasm


【解决方案1】:

如果您想在运行时分配内存,请使用sub rsp, 4096 或其他东西在堆栈上保留一些空间。或者,如果您链​​接到 libc,则从 libc 运行 mmap 系统调用或 call malloc


如果你想测试shellcode/自修改代码
或有其他原因需要可写的.text

ld --omagicgcc -Wl,--omagic 链接。来自ld(1) man page

-N
--omagic
将文本和数据部分设置为可读可写。此外,不要对数据段进行页面对齐,并禁用针对共享的链接 图书馆。如果输出格式支持 Unix 风格的幻数,则将输出标记为“OMAGIC”。

另见How can I make GCC compile the .text section as writable in an ELF binary?


或者您可能可以使用链接描述文件。也可以使用 NASM 部分属性来声明具有读、写、执行权限的自定义部分。

通常(在 shellcode 测试之外)没有理由这样做,只需将您的静态存储放在 .data.bss 中,并将您的静态只读数据放在 .rodata 中,就像平常一样人。

将读/写数据放在代码附近对性能非常不利:可能来自检测自修改代码的硬件的管道核弹,如果您有页面,它至少会污染 iTLB 的数据和代码的 dTLB这包括两者中的一些,而不是充满其中的一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 2017-06-21
    相关资源
    最近更新 更多