博客
关于我
示例解析缓冲区溢出攻击的原理
阅读量:337 次
发布时间:2019-03-04

本文共 1576 字,大约阅读时间需要 5 分钟。

在为C语言的数组等赋值时,可能赋值大小超出了数组的长度限制,这时超出的部分就会覆盖掉栈中其他部分的内容,从而发生缓冲区溢出。

下面用一个危险的例子进行说明:在这个程序中,我们利用strcpy()函数进行赋值操作。

C代码:

#include 
#include
#include
void StringCopy(char *str) { char p[10]; strcpy(p, str);}void hacked() { while(1) { printf("you are hacked!!!"); }}int main() { char str[] = "0123456789012345678901234567891111"; unsigned long long *p = (unsigned long long*)&str[18]; (*p) = (unsigned long long)hacked; //用hack函数的地址覆盖字符串str中的部分内容 //这里的18是在ubuntu64位下测试得到,其他系统可能会出现问题,不能正常运行 StringCopy(str); return 0;}

运行结果:程序疯狂显示"you are hacked";但这不是hack()函数的功能吗?我们并没有调用hack函数啊。

为了理解这个问题的本质,首先我们要知道,main函数在调用子函数时,首先会进行地址压栈,然后将栈基址指针%ebp压栈;然后会分配内存空间,如%esp-0x20(即分配32个空间,这个值具体看程序和OS),在这部分空间中进行函数内部操作;

函数执行完毕后,会清理掉这部分内存空间,弹出%ebp,并开始执行返回地址所指向的命令!那么我们只需要覆盖这个返回地址,让它变成我们hack()程序的地址,那么程序就会执行hack程序了!

所以我们只需要计算返回地址的位置即可,StringCopy函数对应的汇编代码如下:

;4 : void StringCopy(char *str){0x555555555169 endbr640x55555555516d push   %rbp0x55555555516e mov    %rsp,%rbp0x555555555171 sub    $0x20,%rsp0x555555555175 mov    %rdi,-0x18(%rbp);5 :	    char p[10];6 :	    strcpy(p,str);0x555555555179 mov    -0x18(%rbp),%rdx0x55555555517d lea    -0xa(%rbp),%rax # %ebp-0xa即为p的地址,p占十个字节;再加上%ebp占8个字节0x555555555181 mov    %rdx,%rsi0x555555555184 mov    %rax,%rdi0x555555555187 callq  0x555555555060 
;7 : }0x55555555518c nop0x55555555518d leaveq0x55555555518e retq

从上述程序我们可以看出,从变量p到栈底%ebp,一共占18个字节,而18个字节之后,便是返回地址所在的位置。

执行strcpy之前:

执行strcpy之后:

可以看到,函数的返回地址已经发生了改变。

继续执行,可以看到%rip的值也发生了改变,并且程序跳转到了hack()函数中,这里就完成了缓冲区溢出的攻击。

转载地址:http://ygth.baihongyu.com/

你可能感兴趣的文章
npm scripts 使用指南
查看>>
npm should be run outside of the node repl, in your normal shell
查看>>
npm start运行了什么
查看>>
npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
查看>>
npm 下载依赖慢的解决方案(亲测有效)
查看>>
npm 安装依赖过程中报错:Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
查看>>
npm.taobao.org 淘宝 npm 镜像证书过期?这样解决!
查看>>
npm—小记
查看>>
npm介绍以及常用命令
查看>>
NPM使用前设置和升级
查看>>
npm入门,这篇就够了
查看>>
npm切换到淘宝源
查看>>
npm切换源淘宝源的两种方法
查看>>
npm前端包管理工具简介---npm工作笔记001
查看>>
npm升级以及使用淘宝npm镜像
查看>>
npm发布包--所遇到的问题
查看>>
npm发布自己的组件UI包(详细步骤,图文并茂)
查看>>
npm和yarn清理缓存命令
查看>>
npm和yarn的使用对比
查看>>
npm如何清空缓存并重新打包?
查看>>