缓冲区溢出攻击原理.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1.缓冲区溢出攻击原理 1) 缓冲区溢出攻击(实例) 2)栈溢出攻击(函数调用) 函数调用与堆栈 缓冲区溢出攻击 例子 int AFunc(int i,int j) { int m = 3; int n = 4; ????m = i; n = j; ????BFunc(m,n); ????return 8; } int BFunc(int i,int j) { int m = 1; int n = 2; m = i; n = j; return m; } 函数调用中栈的工作过程 函数调用中栈的工作过程 当缓冲区溢出发生时…… int AFunc(int i,int j) { int m = 3; int n = 4; char szBuf[8] = {0}; strcpy(szBuf, “This is a overflow buffer!”); ????m = i; n = j; ????BFunc(m,n); ????return 8; } #includeiostream.h #includestring.h void input() { ?int access(0); //access为1时表示登录正确得到权限,初始为0 ?char password[4]; //用于存储用户输入的登录密码? ?cout输入密码:; ?cinpassword;? ?if(strcmp(password,1988)==0)//比较两个串是否相等,如果相等返回值为0 ?{ ??access=1; //两串相等,将权限变量赋值1? ?} ?if(access!=0)? //access非零,则登录成功 ??cout登录成功endl; ?else????????? //access为零,登录失败 ??couterror; } void main() { ?input(); ? //函数调用 } 攻击原理: 改变RET的值; 用特殊的可执行指令来改变 这样就可以达到攻击目的。 RET的位置是可以被计算出来的(偏移值) * 堆栈 (已初始化数据) 数据段 (未初始化数据) 代码段 一个进程的内存映像 文本段(代码段) 文本区域是由程序确定的, 包括代码(指令)和只读数据。 该区域相当于可执行文件的文本段。 这个区域通常被标记为只读, 任何对其写入的操作都会导致段错误(segmentation violation 数据段 数据区域包含了已初始化和未初始化的数据。 静态变量储存在这个区域中 堆栈 用于函数调用,用于返回 高 低 main() { char passwd[8] = {2e4rfe}; char yourpasswd[8] = {}; 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 want return 0; } 程序的设计功能: 输入正确的口令后做某项工作(否则重复要求输入口令) 演示: 输入精心计划好的字串打乱设计期望的执行逻辑,从而绕过某些口令 实在参数 返回地址 基地址 栈底(内存高端) 栈 增 长 方 向 局部变量 1) 首先把参数压入栈; 2) 然后保存命令寄存器(IP)中的内容作为返回地址(RET); 3) 第三个放入堆栈的是基址寄存器(FP); 4) 然后把当前的栈指针(SP)拷贝到FP,作为新的基地址; 5) 最后为本地变量留出一定空间 缓 冲 区 寄存器 EIP argc argv ESP → EIP’ ←buf → ESP → 低 高 ①进入函数后的堆栈 ②拷贝超长字符 数组到缓冲区中 ③释放局部变量 ESP指向返回地址 ④从堆栈中取出的 EIP,执行shell code EIP’ ESP → EIP’ EIP’ → int main() {AFunc(5,6);?return 0;} 6 当前EBP 当前ESP AFunc(5,6

文档评论(0)

guoxiachuanyue + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档