文档详情

信息对抗技术-溢出攻击 研究生课程 教学课件.ppt

发布:2018-01-24约3.1万字共188页下载文档
文本预览下载声明
信息对抗技术 韩 宏 缓冲区溢出攻击 什么是缓冲区溢出攻击 网络中占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++; } } 该实现中没有也无法判定目标地址指向的内存 是否有足够的空间存放被复制的内容。以下使strcp的一般用法 { 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的函数返回时,程序就会跳
显示全部
相似文档