c - x86_64 上的缓冲区溢出 - 回到 libc 攻击 (linux)

标签 c linux security x86-64 buffer-overflow

在研究和测试了 32 位 linux 机器上的各种类型的攻击(shellcode 注入(inject)、返回 libc、GOT 覆盖)之后,我专注于 64 位世界。我在实现基本的 shellcode 注入(inject)攻击时没有遇到任何问题。

但现在我正试图在 x86_64 上返回 libc 攻击以绕过 NX 堆栈保护。现在,在 64 位世界中,易受攻击程序的文本段受空字节保护,因此您无法将执行重定向到受害者内部的指令。

(gdb) disas main
Dump of assembler code for function main:
   0x00000000004005bc <+0>: push   %rbp
   0x00000000004005bd <+1>: mov    %rsp,%rbp
   .........................................................
   0x0000000000400600 <+68>:    callq  0x400480 <strcpy@plt>
   0x0000000000400605 <+73>:    lea    -0x40(%rbp),%rax
   .........................................................
End of assembler dump.

地址的 8 个字节中有 5 个是空字节(4 个字节中有 1 个是空字节 -> 找到 32 位 pop-ret 小工具不是解决方案)。

与 32 位架构一样,libc 中的指令受 NULL 字节保护:

(gdb ) p execve<br/>
$ 1 = { <text variable, no debug info> } 0x7ffff7ad2cc0 <execve>

8 个字节中有 2 个是 null 字节。

我找到了一篇关于我正在尝试实现的技术的文章:

http://pastebin.com/RA4qVWgX

但主要是当输入(带空字节?)传递给程序时(文章第 241 行)它只是说“将其输入受害者”。据我所知,无法利用易受攻击的函数(getsstrcpy)在字符串中注入(inject)包含多个空字节的输入。

如果有人能帮助我理解这一点或给我有关 x86_64 机器上的 ret2libc 攻击的建议,我将不胜感激。

最佳答案

So I guess you could say: if the vulnerability is due to the presence of gets it's possible to realize a return-to-libc exploit (containing many null bytes), but if the vulnerability is due to the presence of strcpy it isn't possible to realize that because the strcpy will stop at the first null byte.

我们可以这么说,但应该知道 gets 只是不在空字节处停止的代码示例之一,而 strcpy 只是一个示例的代码。

关于c - x86_64 上的缓冲区溢出 - 回到 libc 攻击 (linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22911248/

相关文章:

c - 将 Fortran/C 程序从 32 位升级到多体系结构

linux - 通过 crontab 安排 UpStart 初始化脚本

java - 确保 Java 编码安全的预防措施

python - 如何在 python 中输入密码并为用户的每个字符打印一个星号?

c# - 通过网络运行 .net 应用程序

c - 在 C 中打印结构

c - 如何为使用第三方库的 C 程序设置成熟的构建过程(APR - Apache Portability Runtime)

linux - 有没有办法为 Linux KVM 创建模拟器

具有服务器端输入的 Java Linux 守护进程/服务

c - 如何在流中部分发送文本文件?