《缓冲区溢出攻击原理.ppt》由会员分享,可在线阅读,更多相关《缓冲区溢出攻击原理.ppt(17页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、1.1.缓冲区溢出攻击原理缓冲区溢出攻击原理堆栈(已初始化数据)数据段(未初始化数据)代码段一个进程的内存映像一个进程的内存映像文本段(代码段)文本段(代码段)文本区域是由程序确定的,包括代码(指令)和只读数据。该区域相当于可执行文件的文本段。这个区域通常被标记为只读,任何对其写入的操作都会导致段错误(segmentation violation数据段数据段 数据区域包含了已初始化和未初始化的数据。静态变量储存在这个区域中 堆栈堆栈 用于函数调用,用于返回用于函数调用,用于返回高低1)缓冲区溢出攻击缓冲区溢出攻击(实例实例)main()char passwd8=2e4rfe;char your
2、passwd8=;again:puts(please 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)栈溢出攻击)栈溢出攻击(函数调用函数调用)实在参数实在参数返回地址返回地址基地址
3、基地址栈底栈底(内存高端内存高端)栈栈增增长长方方向向局部变量局部变量 1)首先把参数压入栈;2)然后保存命令寄存器(IP)中的内容作为返回地址(RET);3)第三个放入堆栈的是基址寄存器(FP);4)然后把当前的栈指针(SP)拷贝到FP,作为新的基地址;5)最后为本地变量留出一定空间函数调用与堆栈函数调用与堆栈 缓冲区溢出攻击缓冲区溢出攻击缓冲区寄存器EIPargcargvESP EIPbuf ESP 低高进入函数后的堆栈拷贝超长字符数组到缓冲区中释放局部变量ESP指向返回地址从堆栈中取出的EIP,执行shell codeEIPESP EIPEIP例子intAFunc(inti,intj)i
4、ntm=3;intn=4;m=i;n=j;BFunc(m,n);return8;intBFunc(inti,intj)intm=1;intn=2;m=i;n=j;returnm;intmain()AFunc(5,6);return0;6当前当前EBP当前当前ESPAFunc(5,6);push6push5call_AFuncaddesp+8语句执行前的语句执行前的EBP语句执行前的语句执行前的ESP函数调用中栈的工作过程5EIP_AFuncpushebpmovebp,espsubesp,48h/压入环境变量压入环境变量/为局部变量分配空间为局部变量分配空间EBP48hEDIESIEBX3(m=
5、3)4(n=4)6当前当前EBP当前当前ESPAFunc(5,6);call_AFuncaddesp+8语句执行前的语句执行前的EBP语句执行前的语句执行前的ESP函数调用中栈的工作过程5EIP_AFuncreturn0;popedipopesipopebxaddesp,48h/栈校验栈校验popebpretEBP48hEDIESIEBX3(m=3)4(n=4)当缓冲区溢出发生时intAFunc(inti,intj)intm=3;intn=4;charszBuf8=0;strcpy(szBuf,“Thisisaoverflowbuffer!”);m=i;n=j;BFunc(m,n);retur
6、n8;#include#includevoidinput()intaccess(0);/access为1时表示登录正确得到权限,初始为0charpassword4;/用于存储用户输入的登录密码coutpassword;if(strcmp(password,1988)=0)/比较两个串是否相等,如果相等返回值为0access=1;/两串相等,将权限变量赋值1if(access!=0)/access非零,则登录成功cout登录成功endl;else/access为零,登录失败couterror;voidmain()input();/函数调用example.cexample.cvoidvoidfun
7、ction(charfunction(char*str)*str)charcharbuffer16;buffer16;strcpy(buffer,strstrcpy(buffer,str););voidvoidmain()main()charcharlarge_string256;large_string256;intinti;i;for(i=0;i255;i+)for(i=0;i255;i+)large_stringi large_stringi=A A;function(large_string);function(large_string);*strRet(Function后的指令地址后的指令地址)基地址基地址FPbuffer栈底(内存高端)程序运行结果:程序运行结果:buffer、FP、RET、甚至甚至Str本身等的值都变成了本身等的值都变成了A攻击原理:攻击原理:改变改变RETRET的值;的值;用特殊的可执行指令来改变用特殊的可执行指令来改变 这样就可以达到攻击目的。这样就可以达到攻击目的。RETRET的位置是可以被计算出来的的位置是可以被计算出来的(偏移值偏移值)
限制150内