一种Windowsx86下对栈空间中shellcode的定位与提取方法技术

技术编号:39002117 阅读:6 留言:0更新日期:2023-10-07 10:33
本发明专利技术属于网络安全技术领域,尤其是一种Windowsx86下对栈空间中shellcode的定位与提取方法,包括:对系统API函数进行hook,命中后对被hook的函数进行栈回溯,每回溯一级栈帧,就对该级返回地址指向的位置进行检查,看该位置是否属于栈空间内,当检查到某一级返回地址指向栈空间内部后,记下地址值,且记下沿地址减小方向最近的一级EBP值,然后再回溯一级得到当前栈帧的EBP值;以便进一步对提取的边界进行确认;根据确定的边界范围,将二进制数据进行提取,将二进制数据识别为x86汇编,真实的代码将被包含在其中。本发明专利技术,能够实现直观快捷的方式对shellcode进行定位和提取,提高提取的准确性。取的准确性。取的准确性。

【技术实现步骤摘要】
一种Windows x86下对栈空间中shellcode的定位与提取方法


[0001]本专利技术涉及网络安全
,尤其涉及一种Windows x86下对栈空间中shellcode的定位与提取方法。

技术介绍

[0002]在windows x86架构下,通过栈溢出的方式执行恶意代码是一种常见的攻击方式,特别是对于安全防护较差的旧版本的windows系统更是如此,无论是对个人或企业的信息安全都造成了严重的威胁。
[0003]对于部分利用栈溢出原理将shellcode放入栈空间内执行的病毒,在动态分析它的样本的过程中,如果能快速获取它的shellcode,能让我们对它的行为特征有一个更具体的了解。
[0004]目前针对提取shellcode的资料相对缺乏,很多都只是很对shellcode实现动态或静态检测,如中国专利网站上公开的公告号为CN 104008336 B的一种ShellCode检测方法和装置,采用文档分析和指令模拟技术,对待检测文件进行解析,然后用模拟指令判断是否存在可疑指令序列,并与预先建立的指令序列特征库进行对比,以判断是否包含ShellCode。但针对shellcode的定位以及提取的方法,大多数都是依靠有经验的技术员逐个手动提取,一旦面对几百个文件时,手动提取的方法效率会直线下降,而shellcode的定位以及提取对于检测来说至关重要。

技术实现思路

[0005]基于现有的shellcode的定位以及提取的方法欠缺的技术问题,本专利技术提出了一种Windows x86下对栈空间中shellcode的定位与提取方法。
[0006]本专利技术提出的一种Windows x86下对栈空间中shellcode的定位与提取方法,包括步骤一、对系统API函数LdrLoadDll,LdrGetProcedureAddressForCaller,NtCreateUserProcess和ZwTerminateProcess进行hook。
[0007]步骤二、命中后,对被hook的函数进行栈回溯,每回溯一级栈帧,就对该级返回地址指向的位置进行检查,看该位置是否属于栈空间内。如果回溯到头都未发现某一级返回地址指向栈空间则认为本次函数调用是安全的,否则认为出现shellcode在栈内执行,进入步骤三。
[0008]步骤三、当检查到某一级返回地址指向栈空间内部后,记下这个地址值r,且记下r所指位置沿地址减小方向最近的一级EBP值,记为e_1,然后通过e_1再回溯一级得到e_2,此时e_2为理论上的当前栈帧的EBP值。
[0009]步骤四、对提取的边界进行确认。
[0010]步骤五、根据步骤四确定的边界范围,将二进制数据进行提取,然后通过反汇编程序对其进行识别,将二进制数据识别为x86汇编,真实的shellcode代码将被包含在其中。
[0011]优选地,所述步骤二中的栈回溯方法为;
[0012]首先在目标函数的hook函数里通过内联汇编获取EBP寄存器的值,内联汇编形如:
[0013][0014]其中dwEBP是一个用来接纳EBP寄存器的值DWORD类型的变量,此时,将EBP的值作为一个指针,指向当前函数的栈帧底部,栈帧底部所存储的值为上一级函数调用时EBP寄存器的值,将该值作为一个指针,它又指向上一级函数的栈帧底部,以此类推,即可访问到当前线程的所有栈帧底部。
[0015]通过上述技术方案,其中回溯到头的判断依据是:第n级栈帧的返回地址和EBP的值均为0,且第n

1级返回地址指向ntdll.dll模块内部。
[0016]优选地,获取函数返回地址的方法为;
[0017]将EBP的值加4作为一个指针,它便指向当前函数的返回地址,将上一级函数栈帧的EBP的值加4作为一个指针,它便指向上一级函数的返回地址。
[0018]优选地,所述步骤三中判断栈空间的方法为;
[0019]通过当前线程的线程环境块获取栈空间的顶部地址和底部地址,栈顶在线程环境块偏移4字节位置,栈底在偏移8字节位置,内联汇编代码如下;
[0020][0021]其中buttom和top是变量,分别接纳栈底和栈顶的值,栈底和栈顶之间的值所指向的区域均为当前线程的栈空间。
[0022]优选地,判断返回地址指向栈空间的方法为;
[0023]回溯过程中,对每一级栈帧的返回地址进行判断,如果返回地址的值介于栈底和栈顶之间,则返回地址指向了栈空间。
[0024]优选地,所述步骤四中的边界分为上界以及下界,所述上界的确定方法为;
[0025]以r指向的地址为起点,向内存减小的方向逐字节扫描,所述上界扫描出现预设的情形时,则停止扫描,确定出对应的上界。
[0026]优选地,所述上界扫描出现预设的情形时,则停止扫描,确定出对应的上界,包括:
[0027]P1、至少5个连续的0x00,以第一个0x00的地址加1作为上界;
[0028]P2、至少5个连续的0xcc,以第一个0xcc的地址加1作为上界;
[0029]P3、至少4个连续的nop指令(0x90),以第一个0x90的地址加1作为上界。
[0030]P4、以r值被存放的地址加4作为上界。
[0031]优选地,所述下界的确定方法为;
[0032]以r指向的地址为起点,向内存增大的方向逐字节扫描,所述下界扫描出现预设的情形时,则停止扫描,确定出对应的下界。
[0033]优选地,所述下界扫描出现预设的情形时,则停止扫描,确定出对应的下界,包括:
[0034]S1、至少5个连续的0x00,以第一个0x00的地址减1作为下界;
[0035]S2、至少5个连续的0xcc,以第一个0xcc的地址减1作为下界;
[0036]S3、至少4个连续的nop指令(0x90),以第一个0x90的地址减1作为下界。
[0037]S4、如果是从ZwTerminateProcess函数回溯而来,则以地址r为结束地址。
[0038]S5、以e_2为初始值进行栈回溯,如果能成功回溯到头,则以e_2被存放的地址减4作为下界地址。
[0039]本专利技术中的有益效果为:
[0040]本专利技术结合shellcode常用的行为特征,通过对shellcode最大概率会调用的系统API函数进行hook,实现一种直观快捷的方式对shellcode进行定位和提取,虽然提取的范围不能达到完全精确,但能大概率将其主体部分囊括进来,这种方案有效避免了手动提取效率低的技术问题。
附图说明
[0041]图1为本专利技术提出的一种Windows x86下对栈空间中shellcode的定位与提取方法的栈回溯原理图;
[0042]图2为本专利技术提出的一种Windows x86下对栈空间中shellcode的定位与提取方法的栈溢出执行shellcode的原理图;
[0043]图3为本专利技术提出的一种Windows x86本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种Windows x86下对栈空间中shellcode的定位与提取方法,其特征在于:包括步骤一、对系统API函数LdrLoadDll,LdrGetProcedureAddressForCaller,NtCreateUserProcess和ZwTerminateProcess进行hook;步骤二、命中后,对被hook的函数进行栈回溯,每回溯一级栈帧,就对该级返回地址指向的位置进行检查,看该位置是否属于栈空间内,如果回溯到头都未发现某一级返回地址指向栈空间则认为本次函数调用是安全的,否则认为出现shellcode在栈内执行,进入步骤三;步骤三、当检查到某一级返回地址指向栈空间内部后,记下这个地址值r,且记下r所指位置沿地址减小方向最近的一级EBP值,记为e_1,然后通过e_1再回溯一级得到e_2,此时e_2为理论上的当前栈帧的EBP值;步骤四、对提取的边界进行确认;步骤五、根据步骤四确定的边界范围,将二进制数据进行提取,然后通过反汇编程序对其进行识别,将二进制数据识别为x86汇编,真实的shellcode代码将被包含在其中。2.根据权利要求1所述的一种Windows x86下对栈空间中shellcode的定位与提取方法,其特征在于:所述步骤二中的栈回溯方法为;首先在目标函数的hook函数里通过内联汇编获取EBP寄存器的值,用内联汇编来接纳EBP寄存器的值DWORD类型的变量,此时,将EBP的值作为一个指针,指向当前函数的栈帧底部,栈帧底部所存储的值为上一级函数调用时EBP寄存器的值,将该值作为一个指针,它又指向上一级函数的栈帧底部,以此类推,即可访问到当前线程的所有栈帧底部。3.根据权利要求2所述的一种Windows x86下对栈空间中shellcode的定位与提取方法,其特征在于:获取函数返回地址的方法为;将EBP的值加4作为一个指针,它便指向当前函数的返回地址,将上一级函数栈帧的EBP的值加4作为一个指针,它便指向上一级函数的返回地址。4.根据权利要求1所述的一种Windows x86下对栈空间中shellcode的定位与提取方法,其特征在于:所述步骤三中判断栈空间的方法为;通过当前线程的线程环境块获取栈空间的顶部地址和底部地址,栈顶在线程环境块偏移4字节位置,栈底在偏移8字节...

【专利技术属性】
技术研发人员:喻杨熠宋春岭崔培升
申请(专利权)人:北京亿赛通科技发展有限责任公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1