闲来无事复现一个 ollydbg 的洞。
漏洞信息
漏洞可以在知道创宇的漏洞组件中找到
1 | https://www.seebug.org/vuldb/ssvid-3876 |
不过它年代久远,里面的具体信息链接已经失效了,经过 google 发现了一个相关链接
1 | http://arabteam2000-forum.com/index.php?/topic/168295-ollydbg-110-local-buffer-overflow-exploit/ |
这个页面貌似是中东那边的论坛,谷歌翻译勉强能看懂一点,幸好帖子中给出了关于这个漏洞的演示视频以及 payload,但是不包含详细的漏洞成因,出于好奇尝试对此漏洞进行分析。
漏洞复现
简单看了一下视频,加上给出的 POC 成功触发漏洞。其中 POC 如下
1 | [Settings] |
具体操作方法:
- 将 poc 命名为 ollydbg.ini,放在 OD 根目录下面(先备份好原先的文件)
- 修改 POC [History] 下面的 Executable[0] 参数,填写一个 exe 文件路径
- 启动原版 OD(如果你使用的是吾爱破解专用版,请打开根目录中的 OllyDBG.EXE)
- 选择 File ,点击刚刚填写的文件
- 点击 Debug 选项卡下面的 Arguments 选项,点击那串乱码的参数,点击确定
此时 OD 崩溃,成功触发了漏洞。
漏洞分析
根据视频中的提示,我们使用 IDA 打开 OD 主程序,漏洞主要在 sub_44150C 函数中。
反编译代码如下
1 | INT_PTR __stdcall sub_44150C(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4) |
对函数查看交叉引用发现有另外一个函数调用了此函数
1 | INT_PTR sub_441858() |
原来它是一个对话框回调函数,用于处理对话框的消息。
我们主要关注存在漏洞的代码
1 | do |
此处会从第二个参数开始遍历,最外层是 do while 循环,循环 24 次处理所有参数。
第一个 if 处理两种情况
- ini 中的参数没有全部处理完毕,并且当前处理的参数开头不是双引号
- ini 中的参数处理完毕
第一种情况,会正常的取得参数在栈中的地址,然后重新写入 ini 文件。第二种情况把参数地址设置成 0,这样就不会更新 ini 文件了。
因此,当 ini 文件没有全部处理完毕,并且当前处理的参数还是以双引号开头的话,程序就会跑到 else 里面,这里的逻辑就很简单了,直接将参数用 sprintf 函数拷贝到另一个栈中的位置,然后再把它更新到 ini 文件中。
为什么要针对双引号情况单独处理呢?简单查找一下 GetPrivateProfileString 在 MSDN 的帮助页面发现如下描述
1 | If the string associated with lpKeyName is enclosed in single or double quotation marks, the marks are discarded when the GetPrivateProfileString function retrieves the string. |
如果目标参数的值被单引号或者双引号包裹,那么这些包裹字符将会被自动丢弃。
所以我猜测这里作者默认以双引号开头的参数为空参数,即 “” 这种形态,所以没有xxxx进一步限制参数长度。但是事实证明用户可以通过修改 ini 文件传入畸形的参数即 “”xxxx”” 这样四个双引号构成的字符串,最外层的引号被 API 自动过滤,但是内层还存在引号,并且参数不为空,依然可以进入 sprinf 逻辑中。
IDA 查看 String 参数距离栈底只有 0x104 字节,但是用户能够传入的字符串最大可以达到 0x1000 字节,显然会导致栈溢出。
论坛给出的 POC 是在 XP 下可用的,感兴趣的同学可以考虑构建一下 win7、win10 等系统的 POC。
要注意的是查看系统是否开启 DEP 数据执行保护,win 7 下默认只为系统进程和服务开启,第三方进程默认不开启,可以通过任务管理器进行查看。
虽然第三方程序不开启,但是执行 shellcode 的时候可能会访问到内核的一些数据,或者有其他的操作。不过我对 windows 漏洞利用不是很了解,暂时没有写出可用的POC。
此外,吾爱破解专用版 OD 也是存在这个问题的,只要是 OD 版本为 1.10 基本上都会受到影响,其中中文版 POC 如下
1 | [History] |
漏洞影响
在 win7 以上的系统使用 OD 之前需要允许 UAC,似乎可以使用漏洞基于调试器绕过 UAC 执行任意命令。
但是综合来看触发漏洞的条件较为苛刻,总体利用价值不算特别高。
平时使用 OD 的时候尽量不要使用参数功能,必须使用的时候先点击下拉菜单看看有没有特别奇怪的参数。
- 本文作者: CataLpa
- 本文链接: https://wzt.ac.cn/2020/02/25/ODBUG/
-
版权声明:
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。