网络安全教程 教学课件 田园 第3章 网络病毒的典型入侵机制.pptVIP

网络安全教程 教学课件 田园 第3章 网络病毒的典型入侵机制.ppt

  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文档。上传文档
查看更多
网络安全教程 教学课件 田园 第3章 网络病毒的典型入侵机制.ppt

第3章 网络病毒的典型入侵机制 ;3.1 栈溢出攻击 ; #define MAX_BUFFER_SIZE 256 void routine(char* p) /*p[]是来自外部的字符串*/ { int x,y,u,v; char buffer[MAX_BUFFER_SIZE]; /*将输入字符串填入buffer:*/ strcpy(buffer, p); …… …… return; } ; strcpy(buffer, p)将数组p[]的内容逐字节复制到数组buffer[],但没有检查p[]的实际长度是否超过buffer[]的容量,即MAX_BUFFER_SIZE! 设想运行期间p[]承载的是来自外部的网络消息,而且该消息(有意或无意)确实超过了上界MAX_BUFFER_SIZE,这将导致数组buffer的溢出。 ;图3-1 栈溢出攻击;图3-1 栈溢出攻击(续);3.2 单字节栈溢出攻击 ; for循环在计算数组上界时错误地多计算了一个字节,结果在运行期间可能实际向栈帧写入257个字节,即溢出一个字节。 仔细观察图3-3(a)中“父栈帧”地址项的位置和含义,不难发现一条间接的攻击途径。 为解释这一攻击,需要先解释一下,“Little-Endian”机器和“Big-Endian”机器的区别。;如图3-2所示,详细描述了单字节溢出攻击。 ;图3-3 Little-Endian机器上的单字节溢出攻击; 细心的读者会注意到,成功实施这一攻击的关键在于能够成功伪造出父函数的栈帧。 父函数的栈帧记录的是父函数在调用函数routine之前的临时状态,routine返回后其父函数需要从这一瞬间状态继续向后执行。 如果父栈帧伪造不当导致父函数执行发生错误,不能正常结束而返回,则攻击者将达不到执行病毒代码的目的。 ;3.3 堆溢出攻击 ;#define MAX_BUFFER_SIZE 256 int main(int argc, char** argv){ { int i=0, ch; FILE *f; static char buffer[MAX_BUFFER_SIZE]; static char* szFilename = c:\\procfile.txt; ch = getchar(); while(ch!=EOF){ /*可能导致buffer[]溢出 */ buffer[i] = ch; ch = getchar(); i++; } f = fopen(szFilename, w+b); fputs(buffer, f); …… fclose(f); }; 以上程序中的变量buffer []和szFilename在进程空间中的布局如图3-4(a)所示。根据程序,buffer[]由来自程序输入流的字节顺序填充,如果攻击者炮制的输入流超长而且恰好改写了紧邻buffer[]的堆变量szFilename,这意味着该程序将打开一个攻击者指定的文件进行I/O操作。 如果这是一个特权进程,攻击者将有机会存取操作一个本来没有权限存取的敏感文件。 利用堆溢出攻击还有可能篡改进程空间中的函数地址以改变进程流程。 看下面的C语言程序。;#define MAX_BUFFER_SIZE 256 int CallBack(const char* szTemp){ …… } int main(int argc, char** argv){ { static char buffer[MAX_BUFFER_SIZE]; static int (*funcptr)(const char*); /*函数指针*/ funcptr = (int(*)(const char*))CallBack; strcpy(buffer, argv[1]); /*Size unchecked!*/ (int)(*funcptr)(argv[2]); …… };图3-4 堆溢出攻击的例子:篡改变量值; 以上程序没有检查argv[1]是否超出长度,从而使攻击者有可能通过溢出来篡改函数指针funcptr的值,结果将以argv[2](注意该参数也来自攻击者!)为参数,执行的不再是预期的函数Ca

您可能关注的文档

文档评论(0)

带头大哥 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档