复现W32Dasm缓冲区溢出(cve-2005-0308)

  • A+

## # 漏洞背景

W32Dasm是一款URSoft开发的反汇编和调试工具。W32Dasm8.93及之前版本中的wsprintf函数存在缓冲区溢出漏洞。远程攻击者可通过一个超大的import或export函数名,利用此漏洞执行任意代码。

漏洞分析

1.查找漏洞资料

http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2005-0308

image.png
http://www.nsfocus.net/index.php?act=sec_bug&do=view&bug_id=7369

image.png

2.漏洞分析

通过上面了解W32Dasm 8.93之前版本的wsprintf函数存在缓冲溢出漏洞,程序使用wsprintf()函数拷贝分析文件的引入/导出函数名到一个256字节的缓冲区,超长引入/导出函数名可发生缓冲区溢出,精心构建一个恶意可执行文件,诱使用户调试,可以进程权限在系统上执行任意指令。

,上od打开这个W32Dasm

image.png
查找所有模块调用

image.png
设置所有wsprintfa函数断点

image.png
切回主页面

image.png
点击运行

image.png
打开了程序W32Dasm

image.png
选择一个文件,这个用strings.exe这个文件

image.png
可以看到他已经断在第一个wsprintf位置

image.png
但是这个位置使用%lu无符号长整型整数,所以这个不是我们要找的,继续f9
直到45d8db,这里使用%s字符串

image.png
按f9

image.png

image.png
可以通过数据窗口看到变化,说明eax是将要拷贝的内容,edx就是拷贝过的内容,猜测可能是这个位置。
Buffer
Start 66bdcc (也就是edx)
End 66bec8 (也就是ebp)
首先通过栈跟随

image.png
可以看到66becc位置是返回地址。正常执行完成会跳到457ec0继续
返回地址:66becc
返回地址下一个地址:66bed0,shellcode

image.png
判断缓冲区大小,fc+4(ebp本身有4字节)=100(16进制),转10进制就是256,与漏洞报告对应。
通过上述分析可知,如果需要复现这个漏洞只需要将导入,导出表的名字构造过长,可以进行漏洞验证。

# 漏洞验证

根据pe结构分析如下
首先需要找到originalfristthunk(rva 相对虚拟地址)->再找到image-thunk-data(rva)->再通过rva找到真正位置
根据上述步骤,用lordpe找到位置。
打开strings.exe,点击目录

image.png
找到导入表

image.png
找到OriginalFirstThunk为12A74

image.png
点击ok,确定退回主界面,点击位置计算器

image.png
执行,再打开16进制编辑器

image.png
看到11074的位置是bc2c0100,它是偏移量,转回为12cbc

image.png
再次计算
12cbc位置,就可以到实际位置,1f8是序号(不管),shellcode从47位置开始写入

image.png
写入好的文件如下

image.png
使用W32Dasm打开修改strings.exe,可以看到计算器弹出来了

image.png