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

Whi*_*ask 5 buffer overflow

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

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

这是因为它在GDB中运行时溢出效果很好,因为它会让我回到shell.但是,在GDB之外的事情并没有那么顺利.我关闭了ASLR,它最初给了我问题,直到我最终解决了这个问题,现在我正在使用C函数getenv()来获取我正在溢出程序的确切变量.我确信我正在填充保存的帧完美,因为当我从代码中删除最后6个字节时,我溢出程序时它不会出错,

./notesearch $(python -c 'print "\x01\x01\x95\xe6\xff\xff\xff\x7f" * 15') #no seg fault
Run Code Online (Sandbox Code Playgroud)

然而,当我向字符串添加单个字节后,它意味着我必须用最后一个字节命中保存的帧指针,如GDB进一步确认的那样.

./notesearch $(python -c 'print "\x01\x01\x95\xe6\xff\xff\xff\x7f" * 15 + "\x9e"') # does seg fault
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*zer 1

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

作为建议,如果您只想进行暴力破解,请尝试在任一方向上调整 1 到 8 个字节的偏移量。更好的是,试试这个:

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

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