您的位置:首页 > 运维架构 > Shell

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

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



方法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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: