找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 1277|回复: 0

ZDI-08-009 这个怪异的漏洞

[复制链接]

739

主题

468

回帖

4307

牛毛

论坛管理员

狼群

积分
4347
发表于 2008-3-27 23:30:31 | 显示全部楼层 |阅读模式
int3的空间

这个漏洞其实很简单,超长key name就能导致一个stack overflow,但是为啥javaws.exe不crash呢,于是参照ZDI-08-010仔细分析了一下这个漏洞。
漏洞是这样的,汇编代码我就不全帖了,帖一个关键处的代码:

.text:00406B9F ; ---------------------------------------------------------------------------
.text:00406B9F
.text:00406B9F loc_406B9F:               ; CODE XREF: sub_406A51+B5 j
.text:00406B9F                     ; sub_406A51+D2 j ...
.text:00406B9F         mov   [ebp+edi+68h+var_50], cl
.text:00406BA3         inc   edi
.text:00406BA4
.text:00406BA4 loc_406BA4:               ; CODE XREF: sub_406A51+121 j
.text:00406BA4                     ; sub_406A51+14C j
.text:00406BA4         mov   [ebp+edi+68h+var_50], 0
.text:00406BA9
.text:00406BA9 loc_406BA9:               ; CODE XREF: sub_406A51+63 j
.text:00406BA9                     ; sub_406A51+6C j ...
.text:00406BA9         mov   edx, [ebp+68h+var_10]
.text:00406BAC         inc   edx
.text:00406BAD         cmp   edx, [ebp+68h+arg_8]
.text:00406BB0         mov   [ebp+68h+var_10], edx
.text:00406BB3         jl   loc_406AA9
.text:00406BB9         jmp   loc_406A93

伪C代码应该是这样的:

for (int i = 5; i < strlen(lpszSrc); i ++)
{
     buff = lpszSrc;
     buff[i + 1] = 0x00;
}

但是当时的stack layout其实是这样的:

| Buffer (0x90 bytes)| i | saved EBP | saved EIP|

当你输入超长数据把i这个值覆盖的话,就会导致i这个值大于strlen(lpszSrc),这样你还没能够覆盖到函数的返回地址的时候这个for循环就退出了。
目前还不清楚key name中能否包含0的数据,如果可以就把这个i覆盖成一个较小的值就可以了,否则你就要构造一个几十Mb的文件拉。
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5用户社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-1-11 23:03 , Processed in 0.112902 second(s), 25 queries , Yac On.

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表