今天,学习栈溢出的原理。
我们知道,栈溢出的漏洞利用,是PWN中一个很重要的内容。
从之前的知识中我们可以知道,栈的作用主要是存储函数调用的相关信息以及函数的局部变量。这些局部变量通常为数组或者是输入的缓冲区(buf)。函数的调用信息主要指的是返回地址和栈底指针(rbp)。
在栈存储数据的时候,会发生这样一种情况:函数中的存储在栈中的局部变量的数组边界检查不严时,发生越界,造成用户输入覆盖到缓冲区之外的数据内容(例行检查检查的金丝雀就是用来检查的,具体原理。。之后再看)。如果在检查栈保护(Stack)时有 No Canary found ,可能高概率就是一道栈溢出类型的题目。
由于栈中同时存在函数调用的相关信息,栈溢出可以导致控制流的劫持。
举例说明栈溢出的过程:
在这个图中,我们看到,是main函数下有一个b程序,b程序调用了a程序,但是在a程序的中,预定的缓冲区长度为80,却向buf中read了200长度。显然超过了缓冲区预定的长度,这样,当用户输入的信息被储存到这个栈时(其实已经满了,但用户不知情),用户的信息就无法压入到这个栈中,就会被输送到其他地址,进而造成了栈溢出,信息泄露。当然,栈溢出的攻击方式不只这一种,但其攻击的原理基本不变,大概就是在目标栈不改变的情况下,用垃圾数据填充目标数据的位置,达到目标数据不在栈中的目的。
今天先到这,PWN 的路太长,我这个菜只能慢慢走了。