博客
关于我
示例解析缓冲区溢出攻击的原理
阅读量: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/

你可能感兴趣的文章
python协程实时输出_Python 协程以及事件循环的问题,怎么知道 IO 读取结束了呢?...
查看>>
Python十进制&;包提供错误的结果
查看>>
Python化身“安全老中医”:一键搞定工控系统漏洞,从零基础到精通,收藏这篇就够了!
查看>>
Python加速运行技巧
查看>>
python办公自动化基础遍历文件夹
查看>>
python办公自动化基础输出文件和文件夹
查看>>
python办公自动化基础搜索文件
查看>>
python知识:@classmethod和@staticmethod的异同
查看>>
python前端之css
查看>>
Python制作进度条,原来有这么多方法
查看>>
Python制作简单的学生成绩管理系统
查看>>
python制作甘特图的基本知识(附Demo)
查看>>
python制作一个简单的服务器,【Python】 做一个简单的 http 服务器
查看>>
Python到底能做什么?它的优点在哪?
查看>>
python利用pytorch库导出图像分割算子
查看>>
python利用pyshark监听网卡来抓包其中pyshark中摸索的一些可用参数
查看>>
python利用excel分析过杀漏失
查看>>
python判断汉字数目
查看>>
python判断文件是空的,如果是空的,就删除
查看>>
python判断密码是否正确_python密码判断是否符合要求的方法
查看>>