收藏 分享(赏)

缓冲区溢出攻击原理.ppt

上传人:HR专家 文档编号:6007539 上传时间:2019-03-23 格式:PPT 页数:17 大小:268.50KB
下载 相关 举报
缓冲区溢出攻击原理.ppt_第1页
第1页 / 共17页
缓冲区溢出攻击原理.ppt_第2页
第2页 / 共17页
缓冲区溢出攻击原理.ppt_第3页
第3页 / 共17页
缓冲区溢出攻击原理.ppt_第4页
第4页 / 共17页
缓冲区溢出攻击原理.ppt_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、1.缓冲区溢出攻击原理,堆栈,(已初始化数据) 数据段 (未初始化数据),代码段,一个进程的内存映像,文本段(代码段)文本区域是由程序确定的, 包括代码(指令)和只读数据。 该区域相当于可执行文件的文本段。 这个区域通常被标记为只读, 任何对其写入的操作都会导致段错误(segmentation violation,数据段数据区域包含了已初始化和未初始化的数据。 静态变量储存在这个区域中,堆栈用于函数调用,用于返回,高,低,1) 缓冲区溢出攻击(实例),main() char passwd8 = “2e4rfe“;char yourpasswd8 = “; again:puts(“please

2、input passwd?“);gets(yourpasswd); if (strcmp(yourpasswd, passwd)= =0)goto ok;puts(“passwd error“);goto again;exit(-2); ok:puts(“correct!“);/ do work you wantreturn 0; ,程序的设计功能: 输入正确的口令后做某项工作(否则重复要求输入口令) 演示: 输入精心计划好的字串打乱设计期望的执行逻辑,从而绕过某些口令,2)栈溢出攻击(函数调用),1) 首先把参数压入栈;2) 然后保存命令寄存器(IP)中的内容作为返回地址(RET);3) 第

3、三个放入堆栈的是基址寄存器(FP);4) 然后把当前的栈指针(SP)拷贝到FP,作为新的基地址;5) 最后为本地变量留出一定空间,函数调用与堆栈,缓冲区溢出攻击,缓,冲,区,寄存器,EIP,argc,argv,ESP,EIP,buf,ESP,低,高,进入函数后的堆栈,拷贝超长字符,数组到缓冲区中,释放局部变量,ESP指向返回地址,从堆栈中取出的,EIP,执行shell code,EIP,ESP,EIP,EIP,例子,int AFunc(int i,int j) int m = 3; int n = 4;m = i; n = j;BFunc(m,n);return 8; ,int BFunc(i

4、nt i,int j) int m = 1;int n = 2;m = i;n = j;return m; ,int main() AFunc(5,6); return 0;,6,AFunc(5,6); push 6 push 5 call _AFunc add esp+8,函数调用中栈的工作过程,5,EIP,_AFunc push ebp mov ebp,esp sub esp,48h /压入环境变量 /为局部变量分配空间,EBP,48h,EDI ESI EBX,3(m=3),4(n=4),6,AFunc(5,6); call _AFunc add esp+8,函数调用中栈的工作过程,5,E

5、IP,_AFunc return 0; pop edi pop esi pop ebx add esp,48h /栈校验 pop ebp ret,EBP,48h,EDI ESI EBX,3(m=3),4(n=4),当缓冲区溢出发生时,int AFunc(int i,int j) int m = 3; int n = 4;char szBuf8 = 0; strcpy(szBuf, “This is a overflow buffer!”);m = i;n = j;BFunc(m,n);return 8; ,#include #include void input() int access(0)

6、; /access为1时表示登录正确得到权限,初始为0char password4; /用于存储用户输入的登录密码 coutpassword; if(strcmp(password,“1988“)=0)/比较两个串是否相等,如果相等返回值为0 access=1; /两串相等,将权限变量赋值1 if(access!=0) /access非零,则登录成功 cout“登录成功“endl; else /access为零,登录失败 cout“error“; void main() input(); /函数调用 ,example.c void function(char *str) char buffer16; strcpy(buffer,str); void main() char large_string256; int i; for(i=0;i255;i+) large_stringi = A; function(large_string); ,*str,Ret (Function后的指令地址),基地址FP,buffer,栈底(内存高端),程序运行结果:buffer、FP、RET、甚至Str本身等的值都变成了A,攻击原理:改变RET的值;用特殊的可执行指令来改变这样就可以达到攻击目的。RET的位置是可以被计算出来的(偏移值),

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报