栈溢出攻击系列: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. 覆盖的时候是从地址的低位到高位复制
这样的结构是否是非常眼熟,那就是我们常用的数组。
栈空间
内存低地址 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
方法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
相关文章推荐
- 栈溢出攻击系列:shellcode在linux x86 64位攻击获得root权限(四)linux下进程内存布局
- 栈溢出攻击系列:shellcode在linux x86 64位攻击获得root权限(一)函数如何执行
- 栈溢出攻击系列:shellcode在linux x86 64位攻击获得root权限(二)shellcode
- 栈溢出攻击系列:shellcode在linux x86 64位攻击获得root权限(三)linux下进程中的多用户
- 栈溢出攻击系列:shellcode在linux x86 64位攻击获得root权限(七)利用寄存器攻击
- 栈溢出攻击系列:shellcode在linux x86 64位攻击获得root权限(六)固定地址的栈溢出攻击
- Linux下rootkit-ddrk攻击获得root权限以及清除方法
- Linux下rootkit-ddrk攻击获得root权限以及清除方法
- 《coredump问题原理探究》Linux x86版4.4节函数的逆向之循环结构
- linux本地自动溢出获取root权限工具
- Mint 64位 adt-bundle-linux-x86_64 无法打开adb命令
- android java获得root权限调用linux命令
- linux下如何添加一个用户并且让用户获得root权限
- 再谈Linux修改应用程序获得root权限
- centos x86-64位版本 想安装qq for linux
- linux本地自动溢出获取root权限工具
- 服务器被rootkit-ddrk攻击获得root权限的解决方案
- Android应用.三星i9000系列(4).SuperOneClick获取Root权限的原理
- centos x86-64位版本 想安装qq for linux
- #(Linux)Ubuntu使用# 终端root权限的获得