在研究和测试了32位linux机器上的各种攻击(外壳代码注入,返回到libc,GOT覆盖)之后,我专注于64位世界。在实现基本外壳代码注入攻击方面,我没有任何问题。
但是现在我试图返回到libc对x86_64的攻击,以绕过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小工具不是解决方案)。
与32-体系结构一样,libc中的指令使用空字节进行保护:
(gdb ) p execve<br/>
$ 1 = { <text variable, no debug info> } 0x7ffff7ad2cc0 <execve>8个字节中有2个是null字节。
我发现了一篇关于我正试图意识到的技巧的文章:
但是,当输入(带有空字节?)时,被传递给程序(文章的第241行),它只是说“把它喂给受害者”。据我所知,没有办法在利用易受攻击的函数(gets、strcpy)的字符串中注入多个空字节的输入。
如果有人能帮助我理解这一点,或者给我关于ret2libc攻击x86_64机器的建议,我将不胜感激。
发布于 2015-02-12 08:48:28
因此,我想您可以说:如果漏洞是由于gets的存在,就有可能实现返回到libc的漏洞(包含许多空字节),但是如果漏洞是由于strcpy的存在,就不可能意识到这一点,因为strcpy将在第一个空字节处停止。
我们可以这么说,但是应该知道,gets只是代码的一个例子,它不停止于空字节,而strcpy只是代码的一个例子。
https://stackoverflow.com/questions/22911248
复制相似问题