64 位 Debian 内核中的缓冲区溢出保护?

标签 buffer overflow

我在环境变量中存储了一些 shellcode,并且正在尝试溢出程序。

./notesearch $(python -c 'print "\x01\x01\x01\x01\x01\x01\x01\x01" * 15 + "\x9e\xe7\xff\xff\xff\x7f"')

关键是在 GDB 中运行时溢出工作得很好,因为它把我扔回了一个 shell。然而,在 GDB 之外,事情的运行并不那么顺利。我关闭了最初给我带来问题的 ASLR,直到我最终解决了这个问题,现在我使用 C 函数 getenv() 来获取我正在溢出程序的确切变量。我确信我正在完美地填充保存的帧,因为当我从我用它溢出程序的代码中删除最后 6 个字节时,它不会出现段错误,
./notesearch $(python -c 'print "\x01\x01\x95\xe6\xff\xff\xff\x7f" * 15') #no seg fault

但是,当我之后向字符串添加一个字节时,它确实如此,这意味着我必须用最后一个字节命中保存的帧指针,正如 GDB 进一步确认的那样。
./notesearch $(python -c 'print "\x01\x01\x95\xe6\xff\xff\xff\x7f" * 15 + "\x9e"') # does seg fault

反正我也是用gcc notesearch.c -o notesearch -ggdb -fno-stack-protector -z execstack编译的,正如我之前所说的,它无论如何都可以在 GDB 中工作,所以我假设它是更多的内核保护?有任何想法吗?

最佳答案

根据我的经验,在使用 gdb 观察某些东西的同时进行漏洞利用开发,内存偏移量可能会在调试环境和“真实世界”之间发生意外变化。

作为一个建议,如果您只想强制执行它,请尝试在任一方向上将偏移量调整 1 到 8 个字节。更好的是,试试这个:

  • 启用核心转储 ( ulimit -c nolimit )
  • 使用 tools/pattern_create.rb 从 Metasploit 生成一个模式,该模式是您期望的或更大的大小
  • 在它爆炸后检查核心转储并找出模式的哪些寄存器元素。

  • 有了这个,从 tools/pattern_offset.rb 获取精确的偏移量!

    关于64 位 Debian 内核中的缓冲区溢出保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29837942/

    相关文章:

    node.js - 检测从缓冲区读取的部分或不完整的字符

    node.js - 无需编写 node.js 即可远程创建读取流

    c++ - 最大缓冲区数

    C++吞咽错误

    html - 如何在 div 中垂直对齐溢出 :hidden

    redirect - DOS 命令重定向到文件截断输出

    html - 将溢出设置为在固定的 div 上滚动不起作用

    c++ - 如何避免表达式 (A - B * C)/D 溢出?

    html - 父 div 缩小小于子表的宽度

    html - DIV 位置 :fixed - overflow issue