我们平时说的栈溢出一般是指栈缓冲区溢出 (Stack Buffer Overflow)。

栈溢出的条件

  • 程序必须向栈上写入数据。
  • 写入的数据大小没有被很好地控制。

利用栈溢出的攻击方式

直接现用 getshell

若漏洞程序调用了现成的含有 systemcall 的函数,直接利用栈溢出覆盖函数返回地址为 systemcall 函数的地址

ROP

ROP(Return Oriented Programming) 即面向返回编程

  • ROP攻击的条件:

    • 程序漏洞允许我们劫持控制流,并控制后续的返回地址。
    • 可以找到满足条件的gadgets及其地址
  • ret2text:

    • 这是最简单的ROP攻击方式了,即当程序本身含有敏感代码,如system('/usr/bin/sh')时,利用栈溢出漏洞覆盖返回地址,导致EIP指向敏感命令,直接执行敏感代码,攻击成功。
  • ret2shellcode:
    如果程序本身没有出现system('/bin/sh')时,直接自己写一个注入到栈上,然后再利用栈溢出漏洞覆盖返回地址为我们注入的代码。
    此处有几个要点:

    1. 我们需要写一个shellcode到栈上然后再执行,所以需要拥有栈的可执行权,即程序没有开启NX (No eXecutable)保护,或者程序存在可读可写可执行段。
    2. 我们自己写的shellcode相对于返回地址的偏移是无法通过ida静态分析直接确定的,因为程序运行的时候由于性能优化或者数据对齐等原因,可能最后运行时的偏移量与静态分析的时候的偏移量之间有差距。所以这个偏移量应该通过调试判断,具体方法