2

我正在阅读Hacking: The art of exploit,它显然充满了过时的信息(不考虑金丝雀、不可执行堆栈、ASLR)。我试图了解即使在现代系统上是否(以及如何)堆栈溢出攻击也是可能的。到目前为止,我发现的最好的论文是Stack 在现代 Linux 系统上的粉碎,至少是从 2012 年开始的。

似乎真正阻碍堆栈溢出攻击执行任意代码的是金丝雀和位置无关可执行文件(在 gcc 中禁用标志-fno-stack-protector-fPIE)。PIE 使堆栈不可执行,因此即使设法用堆栈地址覆盖返回地址,程序也会崩溃,因为堆栈上的代码不允许执行。

显然,Linux 终端命令readelf -l <filename>允许知道是否使用 PIE 编译了可执行文件。标题GNU_STACK是我们应该查看的:如果是RWE,则允许执行,如果E缺少,则不是。因此,检查堆栈是否可执行很简单。(值得指出的是,在不反汇编或使软件崩溃的情况下,检查文件是否使用金丝雀保护编译并不容易)

但是,据我了解,可以通过一个名为execstackGNU_STACK的小工具轻松调整标题。这很容易。它甚至不需要 root 权限(当然,只要文件的所有者不是 root)。RWEexecstack -s <filename>

现在,我的问题是:如果我们可以如此轻松地更改它的设置,那么 PIE 的意义何在?禁用金丝雀需要重新编译整个文件,因为金丝雀检查内置在汇编代码中,但GNU_STACK标题似乎很容易出错......我错过了什么?

更新:如果攻击者可以修改标头,那么这意味着攻击者已经实现了代码注入。 ”我不确定这是真的。如果攻击者想要利用可执行文件中的缺陷,他很可能需要另一个可执行文件。例如,在《黑客:剥削的艺术》一书中,漏洞notesearch是通过 exploit notesearch_exploit。即使notesearch有不可执行的堆栈,也可以通过对 execstack in 的 apt 调用轻松使其可执行notesearch_exploit(鉴于没有 root 权限的事实),从而绕过 PIE 限制。这不正确吗?

4

0 回答 0