|
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的文件拉。 |
|