admin 管理员组文章数量: 887021
2024年2月7日发(作者:oracle查询数据库个数)
第36卷 第18期 Vo1.36 ・计算机工程 2010年9月 September 2010 No.18 Computer Engineering 安全技术・ 文章编号:100o—3428(2o1o)18-_0163—o3 文献标识码:A 中图分类号:TP393・08 shellcode攻击与防范技术 王薏 ,李祥和 ,关龙 ,崔宝江 (1.北京邮电大学计算机学院,北京100876;2.解放军信息工程大学信息工程学院,郑州450002; 3.大连理工大学电子与信息工程学院,辽宁大连116024) 摘要:针对Windows系统环境下,攻击者通过shellcode代码威胁系统安全的问题,研究shellcode攻击与防范方法。分析shellcode代码 的工作原理、攻击过程及多种变化,介绍新型Windows系统采用的GS和ASLR保护对shellcode攻击的防范机制,并通过实验验汪其防 范效果。结果证明,实施shellcode攻击需要一定的条件,而Gs和ALSR可破坏这些攻击条件的形成,有效阻止攻击。 关健词:shellcode代码;编码;定位 Attack and Defending Technology of shellcode WANG Ying ,LI Xiang.he ,GUAN Long ,CUI Bao-jiang (1.School of Computer,Beijing University of Posts and Telecommunications,Beijing 1 00876,China; 2.Institute of Information Engineering,PLA Information Engineering University,Zhengzhou 450002,China; 3.School ofElectronic and Information Engineering,Dalian University ofTechnology,Dalian 116024,China) [Abstract]Aiming at the problem that shellcode threats the security of he operatting system,this paper researches on the shellcode attack and the method against the attack.Principle,consisting and process of the shellcode attack are analysed.The GS and ALSR work against the shellcode attack,and the effect of he tGS and ALSR protection mechanism is tested.Experimental results show that it needs some conditions when the attacker carries out the shellcode attack,and the new protection mechanism can limit this condition against he tattack. [Key words l shellcode;coding;location 向进程中植入一段用于获得shell的代码称为 “shellcode”。目前,人们通常用shellcode这个专用术语来统 加载的动态链接库的信息。 (4)PEB—LDR—DATA结构体偏移位置为0xlC的地方获得 称缓冲区溢出攻击中植入进程的代码。这段代码可删改系统 重要文件、窃取数据、上传病毒或创建有特权的帐户,甚至 格式化硬盘等,为此研究有效防范shellcode的方法是必要的。 执行模块初始化链表的头指针InlnitializationOrderModule List。 (5)模块初始化链表InlnitializationOrderModuleList中按顺 l shellcode攻击 1.1 shellcode编写 为了完成特定功能,shellcode需要调用很多系统API, 然而在不同的操作系统版本中对系统动态链接库的加载基址 是不同的;同时不同的补丁版本对应的动态链接库的内容也 有所不同,包括动态链接库的文件大小和导出函数的偏移地 序存放着PE装入运行时初始化模块的信息,第1个链表结 点是ntdl1.d1l,第2个链表结点是kernel32.dll。 (6)找到属于kernel32.dll的结点后,在其偏移0x08处就 是kernel32.dll在内存中的加载基址。 (7)从kernel32.du的加载基址算起,偏移0x3C的地方就 是其PE头。 (8)在PE头偏移0x78的地方可以获得指向函数导出表的 指针。 址等,所以,在shellcode中使用静态函数地址来调用API 会使其通用性受到很大限制,只能动态搜索。 在win一32平台下搜索动态链接库中API地址的方法, 可以概括如下…:从Fs所指的线程控制块开始,一直追溯到 动态链接库的函数名导出表,确定所需的API函数的相对位 (9)导出表偏移0xlC处的指针指向存储导出函数偏移地 址(RVA)的列表。 (10)导出表偏移0x20处的指针指向存储导出函数名的 列表。 置,然后在函数偏移地址(RVA)导出表中相应位置取得此地 址,最后与动态链接库地址相加得到API的绝对地址。 在win一32平台下定位kernel32.dll中的API地址的具体 步骤如下 : (11)函数的RVA地址和名字按照顺序存放在上述2个列 表中,可以先在名_称列表中确定所需函数的相对位置,然后 基金项目:国家“863”计划基金资助项目(2007AA01Z466);国家 部委预研基金资助项目 (1)通过段选择字Fs在内存中找到当前线程控制块TEB。 (2)在线程控制块偏移位置为0x30的地方获得进程控制 块PEB的指针。 作者倚介:王博士 颖(1978--),女,博士研究生,主研方向:计算机网 龙,硕士研究生;崔宝江,副教授、 络安全;李祥和,教授;关收稿日期:2010—04—10 (3)在进程控制块中偏移位置为0x0C的地方获得指向 PEBLDR——DATA结构体的指针,该指针存放着已经被进程 E-mail:zjjinby@163.com ~l63—
在地址列表中找到对应的RVA。 (12)获得RVA后,JJn ̄前面已经得到的动态链接库的基 址,得到所需要API在内存中的虚拟地址操作流程,如图1 所示。 获得kenrel32.dll的基地址 获得函数名称导出表、 函数偏移地址RVA 导出表的入口地址 将指针指向下一个函数名 N 是所需函数? 、/ 上Y 取出对应的RVA, 计算出所需API的绝对地址 保存所需API地址 圈1获得kernel32中API地址的渡程 在编写通用shellcode时,利用此方法获得kernel32.dll 中的GetProcAddress和LoadLibrary这2个函数后,其他所 需要的API函数可以直接使用这2个函数动态获得。利用此 种方法编写的shellcode,可以提高shellcode的通用性。 1.2 shelicode编码 在很多情况下,shellcode的内容会受到限制。首先,所 有的字符串函数都会对NULL字节进行限制,其次,在不同 的目标程序中,对shellcode的要求也不同。比如Foxmail的 shellcode里不能有“/’'字符,IIS的shellcode里面不能有“Lx20” 字符。最后,基于特征的IDS系统往往也会对常见的sheUcode 进行拦截。 利用shellcode编码,可以突破各种限制,使其符合各种 限制条件。最后,在真正shellcode前面加上几条解码指令, 对shellcode进行解码后再执行。 编码方法常用的有以下4种: (1)异或不变法 异或编码是一种最简单的编码,只需要将编码后的 shellcode每位与编码时使用的key再次异或即可解码。编码 代码如下所示: unsigned char shellcode[]:” ̄x50\x00\x50\… 58”: //含有、xoo的shellcode int nLen:sizeof(shellcode)一1; //获得shellcode的长度 for(i=0;i<nLen;i++1 {shellcodeli]=shellcode[i] key; //对每一位shellcode作xor key编码} 需要注意的是用于异或编码的key值,不能选取 shellcode中已有的字符,否则编码后产生的NULL字节会使 shellcode被截断,无法实现相应功能。 (2)循环移位法 循环移位法与异或不变法相似,都是对每一个字符单独 进行编码,选择的移位位数作为key。解码时,只需对每个 字符反向循环移动key位即可。 比如,采用循环左移法编码,key=5,编码算法如下所示: unsigned char ShiffL5(uns噜ned char code) f//对每一个字符进行循环左移5位编码 unsigned char a=code; 一164一 asmI rol a,0x05;J return a;} unsigned char shellcode[]=’’\x58\x00\x50\x0c’‘: I/含有\xO0的shellcode int nLen=sizeo“shellcode)一1; //获得shellcode的长度 for(i=O;i<nLeu;i++1 f shellcode[i]=ShifIL5(shellcodefjJ): ,/对每一位shellcode作循环左移5位编码 } (3)微调法 J 有时在解码指令中出现了几个非法字符,或者shellcode 中仅有个别的非法字符,此时可以采用微调法进行编码。微 调法原理就是在不改变指令功能的情况下,个别改变使用的 代码。这种等价变换法对有少量字符限制的情况比较实用。 比如,在IIS漏洞里不能有0x20,但在shellcode中出现 了mov ebx,20h指令,此时可以采用微调法对其更改。若修 改成mov ebx,34h;sub ebx,14h,这2条指令与原指令的执 行效果是一样的,都是将ebx的值减去0x20,但微调后,避 免了在shellcode中出现0x20。 (4)内存搜索法 在一些特殊情况下,对shellcode的长度会有所限制,比 如不能超过100 Byte,但所编写的shellcode不符合要求,此 时可以采用内存搜索法。内存搜索法是对shellcode进行分段, 做一个短的搜索shellcode的代码,真正的shellcode放在内 存的其他地方。首先执行搜索shellcode的代码,其功能是在 内存中查找真正的shellcode,找到后就跳转去执行。由于搜 索代码一般很短,因此能满足对长度限制的要求。可以采用 如下的汇编代码实现搜索功能: xor ebx,ebx add esi,20000 again:lnC esl mov eax,dword ptr ds:[esi】 cmp eax,50585058 jnz again jmp esl 此段代码从esi+20000h处的地址空问开始查找,直到找 到50585058数据为止,然后跳转到此处继续执行。50585058 是存放真正的sheUcode地址前缀,是“准hop”指令(50对 应的汇编指令是push eax,58;对应的汇编指令是pop eax)。 这样的汇编指令在代码中一般是唯一的。 各种编码方法各有优势,在实际应用中,应根据具体情 况选择合适的编码算法。有时需要采用几种方法同时进行编 码,比如先采用循环移位法编码,若发现编码后仍有非法字 符,则在此基础上,可以采用微调法对出现的非法字符进行 调整,使得最终编码后的shellcode符合要求。 1.3 shelicode定位 shellcode的定位是漏洞利用中最关键的一步,只有正确 定位shellcode才能使shellcode顺利被执行。关于shellcode 的定位方法,可以归纳为如下3种: (1)直接定位 将shellcode释放到固定的地址空问中,然后利用漏洞直 接跳转到此处继续执行。 (2)跳转定位 当shellcode的位置与某个寄存器值相关或者与栈中的某
个值相关时,可以采用跳转定位法。比如,将shellcode存放 到栈中,利用栈溢出漏洞来执行时,可以这样组织缓冲区结 构:NNNNNRsssss(N:填充数据,如hop、R:函数返回地 址,s:编写的shellcode)。当函数返回时,发现esp寄存器指 向shellcode的起始位置。如果采用Jmp esp指令的地址覆盖 函数返回地址,当函数返回时,会执行jmp esp指令,就会 跳转到shellcode处开始执行。这种方法经常被使用,而且能 够准确定位到shellcode,使得shellcode顺利执行。 (3)模糊定位 在某些漏洞利用过程中,栈与堆的地址空问总是在不断 变化,因此,很难准确定位到shellcode位置,此时可以采用 模糊定位法,即在shellcode前面增加hop指令,扩大定位的 范围。定位步骤如下: 首先,在堆中申请大块的存储空问。 然后,填充构造的数据为“payload十she儿code”。如:利 用Oc和shellcode填充区域,此时,0x0c0c0c0c的地址的内 容也是0c0c0c0c,而0c这个指令正好是双字节指令: 0c0c0c0c 0c 0c 01"al,0c 0c0c0c0e 0c 0c or al,0c 且对寄存器影响最小,可以起到nop的作用。 最后,将eip指向了OxOcOcOcOc这个地址,就会一直在 这块内存中执行下去,直到执行shellcode。 1.4 shellcode实倒分析 下面以ms06—027漏洞为例,分析shellcode的具体运用 过程。触发漏洞后,各个寄存器情况如图2所示。 錾翻 整 整.t E艋 Dw0RD Pn Ds【E^】鍪誊0.i..-【+8】鏊= 嘲E瓣 黼鞣 豁漤牲1。, PlIsM E^)【 鞴DWOKDwR DS[ECX+t4] INc EBI cIlP EDI EBX JL Silol【r吡珊0柚30】B矾22 POP助I 图2 ms06-027鼍涓麓发后寄存器状杏 经过分析可知,eax中的数据可以被攻击者控制,从而 ecx中的数据可被控制,那么在执行call dword ptr ds:[ecx+14】 指令时,即可稳定跳转到存放shellcode位置,继续分析 shellcode,shellcode的起始代码如图3所示。 图3 shellcode起始代码 从图3可见,shellcode采用了异或进行编码,同时ollydbg 将编码后的shellcode反汇编成特权指令,将编码后的 shellcode在几种流行杀毒软件中进行测试,结果如表1所示。 表1 shellcode编码酋后对比 可见攻击者如果对shellcode进行编码可以使shellcode 有效突破各种杀毒软件的防护。 2 shellcode防范 2.1 ASLR保护机制 shellcode一般通过查找kernel32.dll的基址取得 GetProcAddress和LoadLibrary这2个API函数,进而获得所 需要的其他函数。如果加载的动态链接库是随机存放在系统 中,那么shellcode将无法实现其功能,可以有效防范shellcode 的执行。 基于这种思想,微软的ASLR保护机制将dl1进行随机加 载。主要实现方法是采用一MilmageBitMap函数处理一个全局 位图,位图的每一位代表64 KB,一个d“被加载的位置在位 图中会做相应的标记。 当dl】中有IMAGE_DLLcHARACTER1STICS_DYNAMIC_ BASE标志时,系统通过MiselectImageBase函数实现d1l随机 加载,具体实现过程如图4所示。 图4 MiSelectlmageBase函敦实现漉程 MiselectImageBase函数中使用的MilmageBias是一个随 机生成的8位数值,表示距离MilmageBitMap位图开始的偏 移,所以,MilmageBias有多达256种取值,使得dlI加载随 机化。在Vista系统中采用ASLR技术,实现dl1的地址随机 化,因此,shellcode不能准确找到kernel32.dll的加载地址。 这种对dll随机加载的方法,可以有效防范shellcode的执行。 对使用ASLR保护机制前后,shellcode执行情况如表2 所示。 表2各种编码的shelleode执行对比的情况 经研究发现,ASLR机制在大部分情况下,能很好地阻 止shellcode执行,但是由于系统dl1只对基址的8 bit进行了 随机化 ,攻击者尝试2 次后可以得到正确的地址。如果对 基址实现16 bit随机化,将会使得攻击者更加困难找到dl】 基址,大大提高安全等级。 (下转第168页) 165~
蒙板中,边界附近的细节都很好地体现了出来;山于本方法 些应用lLI-l能 受到限制。 同时考虑了图像的空间信息,在前背景颜色相似处的边界附 下‘一 1鼍号虑更复杂的前背景分离模型,使其能适应各 近很大程度地减少了歧义,从而可得到相对较好的前景蒙板。 种图像;对算法进行优化,使算法的运行速度更快;充分利 用多值深度图像,以得到多层次的前背景分离结果。 一日 参考文献 i1]Smith A,Blinn J.Blue Screen Matting[C]//Prcoeedings of SIGGRAPH’96.New Orleans,LA,USA:IEEE Press,1996: 259—268 12]Qian R J,Sezan M I.Video Background Replacement Without a Blue Screen[C]//Proceedings of 1999 International Conference on (a)输入图像 (b)深度图像 Image Processing.Kobe,Japan:Is.n.】,1999:143—146. 圈H n 【3】Chuang Yungyu,Curless B,Salesin D,et 1a.A Bayesian Approach to Digital Matting[C]//Proceedings of 2001 Computer Society Conference on Computer Vision and Pattern Recognition.Kauai, USA:IEEE Press,2001:264—271. 141 Levin A,Lischinski D,Weiss Y.A Closed Form Solutiofi to Natural Image Matting[C]//Proceedings of 2006 Computer Society Conference on Computer Vision and Pattern Recogniiton.New Yoi'k, (c)文献[3】方法 (d)文献【41方法 (e)本文方法 USA IEEE Press,2006:6 1-68. 的前景蒙板 的前景蒙板 的前景蒙板 圈1各种酋背景分离方法的结果比较 [51 Levin A,Rav—Acha A,Lischinski D.Spectral Matting[C]// Proceedings of 2007 Computer Society Conference on Computer 5结束语 Vision and Pattern Recognition.Minneapolis,USA:IEEE Press, 本文的模型对图像的前景图像和背景图像有局部平滑性 2007:1-8. 的假设,虽然对于绝大多数自然图像而言都是成立的,但不 【6】Oliver w,Finger J,Yang Qin,et a1.Automatic Natural Video 排除一些特例可能得不到较好的结果。该模型虽然能够得到 Matting with Depth[Cl//Proceedings of the 15th Paciifc Conference 比较令人满意的前景蒙板,但是其代价函数和优化算法比较 on Computer Graphics and Applications.Maui,USA:IEEE Press, 复杂,在运行速度上相对其他前背景分离方法并没有特别的 2o07:469—472. 优势。另外,本文使用额外的硬件设备得到深度图像,在一 编辑张正兴 (上接第165页) Windows各种版本中,提高了shellcode的通用性。同时对 2.2 GS保护机制 shellcode进行编码,可以使得shellcode突破很多限制条件。 栈溢出漏洞常常被shellcode所利用。经常利用jmp esp 在此基础上,如果可以准确定位到shellcode位置,那么 的地址覆盖函数的返回地址,跳转到shellcode继续执行,而 shellcode将可以顺利执行,实现相应功能。对各种shellcode 且这种定位shellcode的方法非常稳定。如果在函数返回前能 分析发现,大部分shellcode攻击过程都是采用此方法实现的。 判断出函数返回地址已经被修改,则可以进行错误处理,防 为了更好地防范shellcode,在系统中采用加载动态链接库随 止跳转到其他地址空间中取指执行,可有效地防止shellcode 机化,使得shellcode无法准确找到kernel32.dll等重要文件 执行。Visual c++.NET的GS安全编译选项就是一例 。 的加载基址。同时在栈中增加安全Cookie,在函数返回时, GS编译选项实现方法是在所有函数调用发生时,向栈帧 进行安全检查,使得在栈溢出中,shellcode不能被准确定位。 内压入一个称为“Security Cookie”的随机DWORD,存放在 这些新安全技术配合各种杀毒软件使得shellcode执行更加困 EBP之前。同时系统在数据区中存放了一个Security Cookie 难,有效地遏制了病毒及木马的传播。 的副本。当栈中发生溢出时,Security Cookie首先被淹没, 参考文献 然后EBP和返回地址被淹没。在函数返回前,系统首先会比 【l】王清.0day安全:软件漏洞分析技术【M】.北京:电子工业出版 较栈帧中存放的Security Cookie与数据区中存放的副本是否 社,2008. 相同,如果不同,说明发生栈溢出。此时,函数不会被正常 『2】Xfocus Team.Shellcode编写技术[EB/OL].(2003—08・31).http:// 返回,转到错误处理流程继续执行。所以,覆盖函数返回地 WWW.xfocus.neffarticles/200308/604.htm1. 址的方法作为跳转地址,已经无效,可以从根本上防止 f3 J匿名.编写变形的she1lcode【EB,OL].(2008—08—05).http://www. shellcode被执行。 hacker.com.cn/article/view14408.htm1. 需要注意的是只有Visual c++.NET以后的编译器才支 【41王炜Q版缓冲区溢出教程[EB/OL].(2008-02—26).http:/fobs. pediy.corrdshowthread.php?t=60252&tcatid=42. 持这种保护机制,所以,软件开发商应该更新自己的编译软 件,开发更加安全的软件产品。 [5]Whitehouse O.An Analysis of Address Space Layout Ran2 Domization on Windows Vista[M].IS.1.】:Symantec,2007. 3结束语 161 Whitehouse O.Analysis of GS Protections in Windows Vista[M1. 在Windows系统下,可以利用PEB来查找API地址, 【S 1.】:Symantec,2007. 编写通用的shellcode。这样编写的shellcode可以运行在 编辑顾逸斐 ~168~
版权声明:本文标题:shellcode攻击与防范技术 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1707283095h513601.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论