LoadPE资源解析溢出分析

来源:互联网 发布:湖北广电网络客服 编辑:程序博客网 时间:2024/05/18 02:03
从看雪上看到一篇帖子,LoadPE在解析资源时溢出,导致执行任意代码,原帖如下:
http://bbs.pediy.com/showthread.php?t=64935
溢出是怎么发生的呢,做了个简要的分析如下:
溢出位置如下:
0040F5B2        |> /3945 9C                   /CMP DWORD PTR SS:[EBP-64],EAX   //解析IMAGE_RESOURCE_DIRECTORY NameId, EAX为该层的count
0040F5B5        |. |0F83 9A020000             |JNB LORDPE.0040F855    //都处理完毕则跳出循环
0040F5BB        |. |8B07                      |MOV EAX,DWORD PTR DS:[EDI]   
0040F5BD        |. |A9 00000080               |TEST EAX,80000000    //测试高位,看EAX是ID还是NAME偏移
0040F5C2        |. |74 35                     |JE SHORT LORDPE.0040F5F9    //ID则跳走
0040F5C4        |. |25 FFFFFF7F               |AND EAX,7FFFFFFF     //高位清0,取NAME偏移
0040F5C9        |. |03C6                      |ADD EAX,ESI     //加上基地址
0040F5CB        |. |8945 DC                   |MOV DWORD PTR SS:[EBP-24],EAX   
0040F5CE        |. |68 2C010000               |PUSH 12C      //限定的NAME的最大长度,(为宽字符长度),造成溢出的罪魁祸首就是这个12C
0040F5D3        |. |8D95 6CFEFFFF             |LEA EDX,DWORD PTR SS:[EBP-194]
0040F5D9        |. |52                        |PUSH EDX      //局部缓冲区(溢出的就是它) 
0040F5DA        |. |50                        |PUSH EAX      //源NAME地址
0040F5DB        |. |E8 70FDFFFF               |CALL LORDPE.0040F350    
0040F5E0        |. |68 2C010000               |PUSH 12C      
0040F5E5        |. |8D85 6CFEFFFF             |LEA EAX,DWORD PTR SS:[EBP-194]
0040F5EB        |. |50                        |PUSH EAX      
0040F5EC        |. |E8 1FFEFFFF               |CALL LORDPE.0040F410    //将上面的NAME加上引号在界面上显示
注意这里:
0040F5CE        |. |68 2C010000               |PUSH 12C      //限定的NAME的最大长度,(为宽字符长度),造成溢出的罪魁祸首就是这个12C
0040F5D3        |. |8D95 6CFEFFFF             |LEA EDX,DWORD PTR SS:[EBP-194]
 
最大的宽字符个数限定的是0x12C(也就是0x258个字节),但作者给的缓冲区是[EBP-194]即
最大才0x194个字节,因此显然存在溢出的风险,因此,修改的方法很简单,将0x12C给他缩小
到安全为止。缩小到多少才安全呢?这个除了要小于0x194这个必要条件之外,还有一点要考虑
就是不能覆盖到其他的局部变量,不然程序肯定运行不正常。在该段代码中看了一下,发现离缓
冲区最近的一个局部变量为[ebp-68],因此缓冲区的最大范围即(0x194-0x68)= 0x12C, 由
于限定的是宽字符的个数,因此在除2即96,修改即可。之后程序可正常运行。看来作者在写程
序的时候大意了一下,忘记了除2,直接将0x12c传给了函数,造成这个漏洞。
原创粉丝点击