|=---------------------------------------------------------------------------=|
|=-----------------=[ 绕过卡巴斯基主动防御系统方法的讨论 ]=----------------=|
|=---------------------------------------------------------------------------=|
|=---------------------------------------------------------------------------=|
|=------------------------=[ By lisl03 ]=-----------------------=|
|=----------------------=[ <lisl03_at_gmail.com> ]=---------------------=|
|=---------------------------------------------------------------------------=|
卡巴斯基的主动防御系统自推出以来,大大增强了系统的安全特性,使得以前常用一些
攻击操作变得不那么容易了。在执行溢出攻击的时候,如果我们的ShellCode刚获得执行就
被卡巴给拦了下来,那么经过精心编写的漏洞EXP程序将就此作罢了。因此,有必要研究一下
ShellCode的编程过卡巴斯基主动防御的问题。
通过借鉴gyzy大虾写的《基于栈指纹检测缓冲区溢出的一点思路》及czy在安焦上发表
了《点评“基于栈指纹检测缓冲区溢出的一点思路”》的文章,我将这些知识与技术消化后加
以整理,加上以前自己摸索出来的一些方法与体会,综合成了这篇文章,希望能够对大家有所
帮助。
有关卡巴斯基等个人安全套装产品主动防御的原理就不啰嗦了。需要补充说明的是,实
际上卡巴在做返回地址检查的时候除了检测返回地址是否在栈中,还会检测返回地址是否在
进程的堆空间里。如果检测到函数将要返回到堆中执行,那么卡巴依然会弹出报警窗口。只
是报警窗口给出的提示与栈溢出稍有不同,如图一所示。
|=-----------------=[ 绕过卡巴斯基主动防御系统方法的讨论 ]=----------------=|
|=---------------------------------------------------------------------------=|
|=---------------------------------------------------------------------------=|
|=------------------------=[ By lisl03 ]=-----------------------=|
|=----------------------=[ <lisl03_at_gmail.com> ]=---------------------=|
|=---------------------------------------------------------------------------=|
卡巴斯基的主动防御系统自推出以来,大大增强了系统的安全特性,使得以前常用一些
攻击操作变得不那么容易了。在执行溢出攻击的时候,如果我们的ShellCode刚获得执行就
被卡巴给拦了下来,那么经过精心编写的漏洞EXP程序将就此作罢了。因此,有必要研究一下
ShellCode的编程过卡巴斯基主动防御的问题。
通过借鉴gyzy大虾写的《基于栈指纹检测缓冲区溢出的一点思路》及czy在安焦上发表
了《点评“基于栈指纹检测缓冲区溢出的一点思路”》的文章,我将这些知识与技术消化后加
以整理,加上以前自己摸索出来的一些方法与体会,综合成了这篇文章,希望能够对大家有所
帮助。
有关卡巴斯基等个人安全套装产品主动防御的原理就不啰嗦了。需要补充说明的是,实
际上卡巴在做返回地址检查的时候除了检测返回地址是否在栈中,还会检测返回地址是否在
进程的堆空间里。如果检测到函数将要返回到堆中执行,那么卡巴依然会弹出报警窗口。只
是报警窗口给出的提示与栈溢出稍有不同,如图一所示。
图一、 卡巴斯基堆溢出检测提示 本文所附的示例代码ShellCode1.c及ShellCode2.c能证明这一点。这两个文件的主要 区别是ShellCode1.c创建一个新堆申请一块空间后将ShellCode拷贝到该堆空间中执行; ShellCode2.c是直接在进程的默认堆中申请一块空间将shellcode拷贝执行到该空间执行。 卡巴这样做的目的是使它对堆溢出类型的攻击也能够进行检测。 本文下面主要集中讲解一下绕过卡巴斯基主动防御的ShellCode的编写技巧与方法: 1、不使用被主动防御系统Hook过的函数 最简单的办法就是在编写ShellCode时尽量不调用 GetProcAddress和LoadLibrary函数。 Kernel32.dll与Ntdll.dll是进程启动时必须加载的两个模块。在Win32系统中,Kernel32.dll 是Windows系统中非常重要的动态链接库文件,它提供了系统的内存管理、数据的输入输出 操作等API函数操作。因此,用来编写ShellCode的API函数基本都集中在该Dll文件中。使用 该动态连接库