gpt4 book ai didi

c - gcc execstack 标志究竟允许什么情况以及它是如何强制执行的?

转载 作者:太空狗 更新时间:2023-10-29 16:05:25 25 4
gpt4 key购买 nike

我在这里有一些示例代码,我用它来理解初学者 CTF 的一些 C 行为:

// example.c

#include <stdio.h>


void main() {
void (*print)();

print = getenv("EGG");
print();
}

编译:gcc -z execstack -g -m32 -o example example.c

用法:EGG=$(echo -ne '\x90\xc3) ./example

如果我使用 execstack 标志编译代码,程序将执行我在上面注入(inject)的操作码。没有这个标志,程序将由于段错误而崩溃。

为什么会这样?是因为 getenv 将实际的操作码存储在堆栈上,并且 execstack 标志允许跳转到堆栈吗?或者 getenv 是否将指针压入堆栈,以及关于内存的哪些部分可执行的一些其他规则?我阅读了联机帮助页,但无法确切地了解规则是什么以及它们是如何执行的。

另一个问题是我认为我也确实缺少一个在调试时可视化内存的好工具,所以很难弄清楚这一点。任何建议将不胜感激。

最佳答案

getenv存储环境变量的值在堆栈上。它在进程启动时已经在堆栈中,getenv获得指向它的指针。

请参阅 i386 System V ABI 对进程启动时 argv[] 和 envp[] 所在位置的描述:以上 [esp] .

_start在调用 main 之前不复制它们, 只是计算指向它们的指针作为参数传递给 main . (链接到 https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI 的最新版本,其中维护了官方当前版本。)


您的代码将指向堆栈内存(包含环境变量的值)的指针转换为函数指针并通过它进行调用。查看编译器生成的 asm(例如 https://godbolt.org/ ):它类似于 call getenv/call eax .

-zexecstack在您的内核版本中1 使您的所有页面都可执行,而不仅仅是堆栈。它也适用于 .data , .bss , 和 .rodata部分,以及分配给 malloc 的内存/new .

GNU/Linux 上的确切机制是一个“read-implies-exec”进程级标志,它会影响所有 future 的分配,包括手动使用 mmap . 参见 Unexpected exec permission from mmap when assembly files included in the project有关 GNU_STACK 的更多信息ELF header 内容。

脚注 1:5.4 左右之后的 Linux 仅使堆栈本身可执行,而不是 READ_IMPLIES_EXEC:Linux default behavior of executable .data section changed between 5.4 and 5.9?

有趣的事实:获取访问其父局部变量的嵌套函数的地址会使 gcc 启用 -zexecstack .它将可执行“蹦床”的代码存储到堆栈上,该堆栈将“静态链”指针传递给实际的嵌套函数,从而允许它引用其父级的堆栈框架。


如果你想在没有 -zexecstack 的情况下将数据作为代码执行,你会使用 mprotect(PROT_EXEC|PROT_READ|PROT_WRITE)在包含该环境变量的页面上。 (它是您的堆栈的一部分,因此您不应删除写权限;例如,它可能与 main 的堆栈框架位于同一页面中。)


相关:

使用 GNU/Linux ld在 2018 年底左右之前从 binutils 中,.rodata部分链接到与 .text 相同的 ELF 段部分,因此 const char code[] = {0xc3}或字符串文字是可执行的。

当前 ld给出 .rodata它自己的段在没有执行的情况下被映射读取,因此不再可能在只读数据中找到 ROP/Spectre“小工具”,除非您使用 -zexecstack .即使这样也不适用于当前的内核; char code[] = ...;作为函数内部的局部变量,会将数据放在实际可执行的堆栈中。参见 How to get c code to execute hex machine code?了解详情。

关于c - gcc execstack 标志究竟允许什么情况以及它是如何强制执行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53346274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com