Stack_Buffer_Overflow
我们平时说的栈溢出一般是指栈缓冲区溢出 (Stack Buffer Overflow)。
栈溢出的条件
- 程序必须向栈上写入数据。
- 写入的数据大小没有被很好地控制。
利用栈溢出的攻击方式
直接现用 getshell
若漏洞程序调用了现成的含有 systemcall 的函数,直接利用栈溢出覆盖函数返回地址为 systemcall 函数的地址
ROP
ROP
(Return Oriented Programming) 即面向返回编程
ROP
攻击的条件:- 程序漏洞允许我们劫持控制流,并控制后续的返回地址。
- 可以找到满足条件的
gadgets
及其地址
ret2text
:- 这是最简单的
ROP
攻击方式了,即当程序本身含有敏感代码,如system('/usr/bin/sh')
时,利用栈溢出漏洞覆盖返回地址,导致EIP
指向敏感命令,直接执行敏感代码,攻击成功。
- 这是最简单的
ret2shellcode
:
如果程序本身没有出现system('/bin/sh')
时,直接自己写一个注入到栈上,然后再利用栈溢出漏洞覆盖返回地址为我们注入的代码。
此处有几个要点:- 我们需要写一个
shellcode
到栈上然后再执行,所以需要拥有栈的可执行权,即程序没有开启NX (No eXecutable)
保护,或者程序存在可读可写可执行段。 - 我们自己写的
shellcode
相对于返回地址的偏移是无法通过ida
静态分析直接确定的,因为程序运行的时候由于性能优化或者数据对齐等原因,可能最后运行时的偏移量与静态分析的时候的偏移量之间有差距。所以这个偏移量应该通过调试判断,具体方法
- 我们需要写一个
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 HaoIne!