今天接着学习栈溢出的基本知识。
学习栈溢出首先就要明白栈溢出的过程。我们直接拿实例来学习(这样效率会高一点)
如上图所示,这是一个栈段的简化图。栈由高地址向低地址增长,图中上方是高地址,下方是低地址。我们看,buf 的长度为80,紧邻b函数的rbp指针和返回地址。此时,整个栈没有问题,没有发生栈溢出。可是,buf的长度是可以人为改变的,那么如果我们向buf中读入的长度超过80字节呢?我们假设,向buf中读入:'X'*80+'A'*8+'B'*8,这样,长度超过,发生栈溢出。那么,就会发生下面图中的情况:
和第一幅图对比,能看到,原本存储b函数的rbp地址的内容,都被覆盖成了“AAAAAAAA”这样的无效内容,返回地址也被覆盖成了“BBBBBBBB”。这个时候,如果返回地址,那么就会产生错误,因为这串无效字符被翻译为二进制后将不会是一个合法地址。
换一个想法,如果我们想达到攻击的效果,那么我们是不是在那些“无效内容”中操作就可以了?
假设我们想让程序跳转到一个目标地址:target addr 。那,在我们知道目标所开辟的这段这段栈空间的大小后,我们先让垃圾内容填充这些大小的空间,然后再写上这个目标的target addr,就可以了。如下图:
这就是大致过程吧。
好,今天的栈溢出过程就到这,慢慢来吧。