C - x86_64上的缓冲区溢出 - 返回到 libc 攻击 (Linux)



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

但是现在我试图回到对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)的字符串中注入具有多个空字节的输入。

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

所以我想你可以说:如果漏洞是由于存在 的获取可以实现返回 libc 漏洞(包含 许多空字节),但如果漏洞是由于存在 STRCPY 不可能意识到这一点,因为 strcpy 会停止 在第一个空字节处。

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

最新更新