1、Windows缓冲区溢出攻击 深入研究,1.一个对话框,2.简介,缓冲区溢出(又称堆栈溢出)攻击已成为最常用的黑客技术之一。 涉及各种操作系统、应用软件中广泛存在普遍且危险的漏洞 。 导致程序运行失败、系统崩溃等后果 。 更为严重的是可以利用它执行非授权指令,取得系统特权,进行各种非法操作。,3.缓冲区溢出带来的病毒,第一个缓冲区溢出攻击-Morris蠕虫,发生在1988年,它曾造成了全世界6000多台网络服务器瘫痪。,4.缓冲区溢出攻击相关知识,IA-32汇编 Winsock编程 TEB(线程环境块) PEB(进程环境块) PE文件结构 代码权限(ring0,ring1,ring2,ring
2、3),5.使用的工具,Ethereal包分析工具 OllyDbg32位汇编级调试工具 SoftICE系统调试器,6.缓冲区溢出攻击的目的,扰乱具有某些特权运行的程序的功能 使得攻击者取得程序的控制权 对目标电脑造成损害 获取秘密资料 借助他人的电脑或服务器做坏事,微观目的:,宏观目的:,7.引起缓冲区溢出,C(与其后代 C+)本质就是不安全的。 开发人员没有做边界检查数组和指针的引用(而这一行为往往会被忽视)。 标准C 库中还存在许多非安全字符串操作,包括:strcpy() 、sprintf() 、gets() 等。,8.IA-32堆栈(Windows系统),参数2,参数1,EIP+1,001
3、2FF7C,0012FF80,0012FF84,0012FF88,0012FF74,0012FF70,0012FF78,栈,堆,堆栈,参数2,参数1,EIP+1,0012FF7C,0012FF80,0012FF84,0012FF88,0012FF74,0012FF70,0012FF78,9.Windows函数调用原理,PUSH 参数2 PUSH 参数1 CALL 函数;(PUSH EIP+1). 函数 PROC.RET ; (MOV EIP,EBP) 函数 ENDP,EBP,10.Windows空间申请,参数2,参数1,EIP+1,0012FF7C,0012FF80,0012FF84,0012
4、FF88,0012FF74,0012FF70,0012FF78,char bigbuff=“aaaaaaaaaa” void main() char smallbuff5;strcpy(smallbuff,bigbuff); ,11.堆栈溢出,参数2,参数1,EIP+1,0012FF7C,0012FF80,0012FF84,0012FF88,0012FF74,0012FF70,0012FF78,char bigbuff=“aaaaaaaaaa” void main() char smallbuff5;strcpy(smallbuff,bigbuff); ,返回地址,10个a,aaaa,aaaa
5、,aa,12.本地溢出实例,char bigbuff=“aaaaaaaaaa” void main() char smallbuff5;strcpy(smallbuff,bigbuff); ,13.溢出代码调试( 一),14.溢出代码调试( 二),(1),(2),(3),(4),15.Shellcode,Shellcode是一段机器指令,用于在溢出之后改变系统正常流程,转而执行Shellcode从而完成攻击者的功能。 运作方式:调用系统API函数,完成各种操作。几乎可以完成所有系统操作。,16.网络缓冲区溢出攻击,攻击目的: 获取远程主机控制权限 工 具: bkdcom.exe 途 径: 通过
6、网络 攻击方式: 反弹端口 包分析工具: Ethereal(攻击端使用) 调试工具: SoftICE(被攻击端使用) 其他工具: NC(瑞士军刀),17.攻击操作,CMD-2,CMD-1,CMD-1,18.溢出调试(被攻击端),(1)利用万能断点:bpx lstrcpyW,19.溢出调试(被攻击端),(2)发生溢出的函数入口,20.溢出调试(被攻击端),(3)发生溢出后,将返回地址覆盖,21.溢出调试(被攻击端),覆盖是什么地址呢?,77E2E32A 这个地址,存放着下面代码: jmp esp,22.溢出调试(被攻击端),1998年,cDc的Dildog,在他的文章内首次提出。执行ret后,e
7、ip已经变成可以控制的内容。 通过jmp esp,放在esp后的Shellcode,就可以准确定位了。,23.溢出攻击达到目的,24.最近流行的缓冲区溢出病毒,(1)冲击波 利用漏洞:RPC缓冲区溢出 135/TCP (2)震荡波 利用漏洞:LSASS漏洞 1025/TCP (3)极速波 利用漏洞:UPNP漏洞 445/TCP (4)高波 利用多种漏洞,非常危险,预防缓冲区溢出,目前有三种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响: 1、通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码; 2、强制写正确的代码的方法; 3、利用编译器的边界检查来实现缓冲区的保护,使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁。,