在 .text 部分分配可写内存

Posted

技术标签:

【中文标题】在 .text 部分分配可写内存【英文标题】:Allocate writable memory in the .text section 【发布时间】:2020-09-01 03:26:47 【问题描述】:

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

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

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

【问题讨论】:

.text 部分在大多数操作系统上默认是写保护的。只需将您要写入的任何内容放入另一个部分即可避免这种情况。 【参考方案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包括两者中的一些,而不是充满其中的一个。

【讨论】:

以上是关于在 .text 部分分配可写内存的主要内容,如果未能解决你的问题,请参考以下文章

14_内存分配延迟

VirtualAlloc/Ex 分配啥样的内存

text 动态内存分配

JVM总结的部分内容

内存分配和回收策略

内存动态分配