在研究和测试了32位linux机器上的各种类型的攻击(shellcode注入,返回libc,GOT覆盖)后,我专注于64位世界。我在执行基本shellcode注入攻击方面没有任何问题。
但是现在我试图在x86_64上返回libc攻击以绕过NX-stack保护。现在,在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个是空字节 - &gt;查找32位pop-ret小工具不是解决方案)。
与32架构一样,libc中的指令用NULL字节保护:
(gdb ) p execve<br/>
$ 1 = { <text variable, no debug info> } 0x7ffff7ad2cc0 <execve>
8个字节中的2个是null
个字节。
我发现了一篇关于我正在努力实现的技术的文章:
但是在输入(使用空字节?)传递给程序(文章的第241行)的主要点上,它只是说“将它输入受害者”。据我所知,没有办法在利用易受攻击的函数(gets
,strcpy
)的字符串中注入带有多个空字节的输入。
如果有人能帮助我理解这一点,或者在x86_64机器上给出关于ret2libc攻击的建议,我将不胜感激。
答案 0 :(得分:1)
所以我想你可以说:如果漏洞是由于存在 得到它可以实现一个返回libc漏洞利用(包含 许多空字节),但如果漏洞是由于存在 strcpy它不可能意识到因为strcpy会停止 在第一个空字节。
我们可以这么说,但是应该知道gets
只是代码的一个例子,它不会停留在空字节上,而strcpy
只是代码的一个例子。