在 .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 --omagic
或gcc -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 部分分配可写内存的主要内容,如果未能解决你的问题,请参考以下文章