Pwn入门系列7——栈溢出原理

栈溢出

①函数中的存储在栈中的局部变量数组边界检查不严格发生越界写,造成用户输入覆盖到缓冲区外的数据内容。
②由于栈中同时存在着与函数调用参数相关信息,栈溢出可以导致控制流劫持。

栈溢出过程

①main函数调用b,b函数调用a。
②缓冲区溢出发生在a函数中。
③buf的长度是80,但是却读入了200长度。
1.png
④分析程序运行至a时的栈帧。
⑤栈中存放buf和返回地址等信息。
⑥buf的长度为80,紧邻b函数的rbp指针和返回地址。
2.png
⑦如果我们此时读入80字节长度的数据,没问题。
⑧如果我们读入长度超过80字节的数据呢?
3.png

栈溢出过程

①这里我们读入‘X’80 + ‘A’8 + ‘B’8
②可以看到,原本存储b函数的rbp地址内容已经被覆盖成了”AAAAAAAA”
③返回地址已经被覆盖为了”BBBBBBBB”
④这时候如果程序返回,程序会返回一个异常错误。
⑤因为”BBBBBBBB”这个字符串,翻译到16进制:0x4242424242424242,这个地址在内存中不是一个合法的代码地址。
⑥我们变换一下思路,这次我们输入的数据是‘X’
80 + ‘A’*8 + target addr
⑦target addrs是我们想要程序跳转到的地方。
⑧这时候,程序的执行流就被我们控制了。

rbp

①那么RBP我们就不管了吗?
②是的,一般情况下,RBP的值不需要我们构造。
③RBP是程序用来定位栈中的局部变量地址的。
④除非涉及到RBP寄存器传递参数,一般的ROP不需要管RBP。

总结

①栈溢出的原理就是栈中存储的局部变量数组发生了溢出,覆盖了栈中的其他数据。
②将返回地址覆盖为我们期望的目标地址,几个劫持控制流。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!