栈溢出攻击系列:shellcode在linux x86 64位攻击获得root权限(五)栈溢出原理

在前面的系列中,已经提到了方法调用关系中栈空间是如何布局的,而造成栈溢出的主要原因是有些函数没有越界检查,最后导致了栈的溢出,也就是栈的空间被人为的重新布局。大家重新在看这张栈的图


方法A调用方法B, 当B方法执行退出的时候,首先rbp指针指回方法A的函数入口地址,然后把rip 赋值到返回地址也就是当A call B的地址,而在图上返回地址就在B方法的调用栈的上方(栈是从高位到低位分配的),那么只要覆盖栈到返回地址,替换成自己想要的返回的地址,那么rip指针将会指向你想执行的代码,最后达到攻击的目的。

这样我们需要2个重要条件

1. 能在栈上直接分配空间的

2. 覆盖的时候是从地址的低位到高位复制

这样的结构是否是非常眼熟,那就是我们常用的数组。

数组的分配

char[10] 数组

栈空间 


内存低地址 RSP ------------------------------| RBP|返回地址 内存高地址

                            char[0]char[1]..char[10]


也就是如果复制一些内容越界到char[11] char[12]char[13]char[14]... char[18] 8个数组的话(这是rbp的内容,在64位地址中是8个byte),那将覆盖返回地址,也就是我可以指定接下来eip的指针的内容,执行我想执行的代码,运气很不错当覆盖rbp的地址的时候,并没有检查他的有效性,那么我可以从容的覆盖rbp 直到覆盖返回地址。

但实际情况gcc 在编译的时候,为了读取效率会缓存对齐而额外分配一些空间,那么你可能要多覆盖点空间才可以,这是计算的问题不是难点。

那什么样的函数能做这样的事情呢?

很容易我们会发现一些不检查越界的函数,比如strcpy



你可能感兴趣的:(栈溢出)