《缓冲区溢出攻击原理课件》由会员分享,可在线阅读,更多相关《缓冲区溢出攻击原理课件(17页珍藏版)》请在金锄头文库上搜索。
1、1.1.缓冲区溢出攻击原理缓冲区溢出攻击原理堆栈(已初始化数据)数据段(未初始化数据)代码段一个进程的内存映像一个进程的内存映像文本段(代码段)文本段(代码段) 文本区域是由程序确定的, 包括代码(指令)和只读数据。 该区域相当于可执行文件的文本段。 这个区域通常被标记为只读, 任何对其写入的操作都会导致段错误(segmentation violation数据段数据段 数据区域包含了已初始化和未初始化的数据。 静态变量储存在这个区域中 堆栈堆栈 用于函数调用,用于返回用于函数调用,用于返回高低1)缓冲区溢出攻击缓冲区溢出攻击(实例实例)main()char passwd8 = 2e4rfe;c
2、har yourpasswd8 = ;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 EIPE
4、IP例子intAFunc(inti,intj)intm=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/压入环境变量压入环境变量/为局部变量分配空间为局部变
5、量分配空间EBP48hEDIESIEBX3(m=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!”);
6、m=i;n=j;BFunc(m,n);return8;#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();/函数调用examp
7、le.cexample.cvoidvoidfunction(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的位置是可以被计算出来的的位置是可以被计算出来的( (偏移值偏移值) )