- 1、本文档共188页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
信息对抗技术 韩 宏 缓冲区溢出攻击 什么是缓冲区溢出攻击 网络中占60%-70%的攻击是缓冲区溢出攻击。 攻击的目的是什么?获得系统的控制权限。而不是破坏。 基本攻击方式 通过向有漏洞的程序发送特别数据,使得程序将这段特别数据当作代码并跳转过去运行。而这段被当作的代码,可以和攻击者交互,从而实现了对被攻击机器的控制。 如何控制别人的程序流向 怎样使程序跳转到指定的代码呢?有以下三种方式: jmp 地址; call 地址; ret; 如果要想程序跳转到攻击者给定的内存执行,需要有对应的代码执行这个跳转过程。比如 jmp 0x1234;就将程序跳转到0x1234地址运行。但被攻击的程序中不可能存在这样的语句跳转到攻击者指定的位置。 同理,call 0x1234这种也不行。 只剩下ret了。 请回忆前边反汇编基础部分讲解的ret指令的用处和工作过程 这个ret进行了如下操作: 将返回地址从栈顶中弹出,并放入EIP寄存器,使得程序下一步执行EIP指向的地址。也就是说,ret将使程序执行栈顶保存的那个地址 我们来尝试修改ret地址 procedure Func1(); begin end; procedure TForm1.Button1Click(Sender: TObject); begin Func1(); end; procedure Func1(); begin end; 的end处打断点,然后执行到此处。 到esp指向的内存0x12f3e4,该地址指向的是0x44dbb5地址,即返回地址 好,我们修改这个地址中存的地址 修改后,执行一个单步动作,执行ret指令,代码窗口指向了0x11111地址 正常的代码中不可能有这样的修改语句存在,但在一些特定的条件下,可能修改那个保存的地址。 请回忆C语言中的strcpy,以及str作为前缀的函数有什么限制条件。 Str系列的函数要求空字符结尾,也就是0这个byte值结尾。 Strcpy会分析从源地址开始的每一个字节看是否是0,如果是表示源字符串已经结束,否则会一直拷贝下去。它并不关心目标地址是否有足够的空间保存被复制的内容。以下是一个strcpy的示意实现 strcpy(char * des, char * src) { char * cursrc, curdes; cursrc = src; curdes = des; while (*cursrc != 0){ *des = *src; src++; des++; } } 该实现中没有也无法判定目标地址指向的内存 是否有足够的空间存放被复制的内容。以下是strcpy的一般用法 { Char buf[100]; ... Strcpy(buf, src); ... { 请注意,这个buf的大小,是程序员估计出来的比正常使用还多的空间。 如果src的字符串长度大于buf,strcpy并不会在100处停止复制,而是会继续往后复制。那这时拷贝的内容就会依次覆盖后边的内容 如果前图中多余的复制的那部分蓝色的部分正好存放的是ret的返回地址,那么我们就可以改变程序的流向了!!!! 而这只需要在给strcpy的源地址的内容(0字符前的部分)长度大于目标缓存预先分配的地址。 这里一个关键是,需要保存ret地址的内存紧接在目标缓存的后面,可能吗? 我们需要分析反汇编基础中对一个函数调用过程的分析了。 首先,函数的局部变量和函数的返回地址都是保存在栈上,因此他们具备了相互比邻的可能。 后图中,return address保存在比局部变量sum高8个字节的地方,很容易被strcpy拷贝的过长部分覆盖 请观察一下代码和其 对应的栈布局 Void func(char *src) { char buf[10]; strcpy(buf, src); } 请观察一下代码和其 对应的栈布局 Void func(char *src) { char buf[10]; strcpy(buf, src); } 请观察一下代码和其 对应的栈布局 Void func(char *src) { char buf[10]; strcpy(buf, src); } strcpy(char * des, char * src) { char * cursrc, curdes; cursrc = src; curdes = des; while (*cursrc != 0){ *des = *src; src++; des++; } } 当调用strcpy的函数返回时,程序就会
您可能关注的文档
- c++5数据的共享与保护讲稿.ppt
- 2013中国痛风临床诊治指南讲稿.ppt
- C++第8章结构体、共用体和枚举类型讲稿.ppt
- C++第8章类和对象讲稿.ppt
- 护理安全警示教育试卷.ppt
- C4医院护理查对制度培训讲稿.ppt
- 混凝土的耐久性试卷.ppt
- 2013最新人教版数学二年级上册《5的乘法口诀》讲稿.ppt
- 5.3园林植物配置与造景草本花卉讲稿.ppt
- 06第六章讲稿.ppt
- 2025年网络文学平台版权运营模式创新与版权保护体系构建.docx
- 数字藏品市场运营策略洞察:2025年市场风险与应对策略分析.docx
- 全球新能源汽车产业政策法规与市场前景白皮书.docx
- 工业互联网平台安全标准制定:安全防护与合规性监管策略.docx
- 剧本杀剧本创作审核标准2025年优化与行业自律.docx
- 2025年新能源电动巡逻车在城市安防中的应用对城市环境的影响分析.docx
- 全渠道零售案例精选:2025年行业创新实践报告.docx
- 2025年网约车司乘纠纷处理机制优化与行业可持续发展报告.docx
- 2025年宠物烘焙食品市场法规政策解读:合规经营与风险规避.docx
- 2025年宠物行业数据安全监管政策影响分析报告.docx
文档评论(0)