Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux上C中的现代堆栈溢出(stack smash)漏洞?_C_Linux_Stack Overflow_Exploit_Stack Smash - Fatal编程技术网

Linux上C中的现代堆栈溢出(stack smash)漏洞?

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和漏洞 无效返

简而言之,我想通过在堆栈上执行所需的地址来实现一个简单的、真正基本的利用

为此,我做了一些研究:

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:

(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后是对的,我没有将地址驱动到堆栈上的正确寄存器中。最好的