在研究和测试了对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行)时,它只是说"将其输入受害者"。据我所知,没有办法在利用易受攻击的函数(gets
,strcpy
)的字符串中注入具有多个空字节的输入。
如果有人能帮助我理解这一点或给我有关x86_64机器上的 ret2libc 攻击的建议,我将不胜感激。
所以我想你可以说:如果漏洞是由于存在 的获取可以实现返回 libc 漏洞(包含 许多空字节),但如果漏洞是由于存在 STRCPY 不可能意识到这一点,因为 strcpy 会停止 在第一个空字节处。
我们可以这么说,但应该知道,gets
只是不停留在空字节的代码的一个示例,而strcpy
只是止步于空字节的代码示例。