## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-0NEB1N-CVE-2020-1349
# CVE-2020-1349
该漏洞存在于安装于韩文 Windows 10 1909 x64(代码页 949)上的 Outlook 2019(16.0.12624.20424)中。
## 概览

我尚未能利用此漏洞绕过 ASLR,但我编写了一个 Outlook 2019 32 位漏洞利用程序,通过使用启动时固定的系统库地址弹出一个计算器。
此外,该漏洞为零点击漏洞。如果除“outlook.com”账户以外的邮件服务账户通过 IMAP 与 Outlook 2019 关联,则仅通过接收邮件即可触发。
## 第一个漏洞
root@kitploit:~
v26 = IsDBCSLeadByte(*v13);
v12 = 0;
if ( v26 )
{
LODWORD(v5) = v5 - 1;
*v11++ = *v13++;
--v8;
}
LODWORD(v5) = v5 - 1;
*v11++ = *v13++;
--v8;
goto LABEL_51;
[OUTLMIME!CloseAllSockets+0x50804 伪代码]
崩溃发生,存在漏洞的部分如上所示。当解析的 To 头或 From 头字符串为多字节时,用于计数剩余待解析字符串的变量会减少 2,而当该变量为 1 时减少 2 会导致整数下溢。
## 第二个漏洞
root@kitploit:~
if ( v23 != '=' )
{
if ( v23 == 34 )
v15 = 6;
goto LABEL_48;
}
v15 = 1;
}
if ( v15 )
goto LABEL_40;
[OUTLMIME!CloseAllSockets+0x50804 伪代码]
root@kitploit:~
LABEL_40:
v24 = v13[v14];
if ( v24 )
{
if ( v5 == v14 )
goto LABEL_52;
if ( v8 != v14 )
{
v25 = IsDBCSLeadByte(v24);
v12 = 0;
if ( v25 )
++v14;
++v14;
}
}
goto LABEL_51;
}
[OUTLMIME!CloseAllSockets+0x50804 伪代码]
root@kitploit:~
LABEL_51:
if ( v5 <= v14 )
goto EXIT_0;
}
[OUTLMIME!CloseAllSockets+0x50804 伪代码]
root@kitploit:~
if ( v15 )
{
if ( v15 == 1 )
{
v15 = 2;
v21 = v13[v14];
v22 = v14 + 1;
if ( v21 != '?' )
v22 = v14;
if ( v21 != '?' )
v15 = v12;
v14 = v22;
}
[OUTLMIME!CloseAllSockets+0x50804 伪代码]
root@kitploit:~
else if ( v15 > 1 )
{
if ( v15 <= 3 )
{
v18 = v13[v14];
v19 = v14 + 1;
if ( v18 != '?' )
v19 = v14;
v14 = v19;
v20 = v15 + 1;
if ( v18 != '?' )
v20 = v15;
v15 = v20;
}
[OUTLMIME!CloseAllSockets+0x50804 伪代码]
root@kitploit:~
if ( v15 == 4 )
{
if ( v13[v14] == '?' )
v15 = 5;
LABEL_40:
v24 = v13[v14];
if ( v24 )
{
if ( v5 == v14 )
goto LABEL_52;
if ( v8 != v14 )
{
v25 = IsDBCSLeadByte(v24);
v12 = 0;
if ( v25 )
++v14;
++v14;
}
}
goto LABEL_51;
}
[OUTLMIME!CloseAllSockets+0x50804 伪代码]
root@kitploit:~
if ( v15 == 5 )
{
v16 = v14;
v17 = v14 + 1;
v30 = v13[v16];
if ( v30 == '=' )
{
*v11++ = 34;
--v8;
}
memcpy(v11, v13, v17);
v13 += v17;
v11 += v17;
LODWORD(v5) = v5 - v17;
v8 -= v17;
if ( v30 == '=' )
{
*v11++ = 34;
--v8;
}
v12 = 0;
v14 = 0;
v15 = 0;
goto LABEL_51;
}
[OUTLMIME!CloseAllSockets+0x50804 伪代码]
root@kitploit:~
else
{
v23 = v13[v14];
if ( v23 != '=' )
{
if ( v23 == '"' )
v15 = 6;
goto LABEL_48;
}
v15 = 1;
}
if ( v15 )
goto LABEL_40;
[OUTLMIME!CloseAllSockets+0x50804 伪代码]
root@kitploit:~
LABEL_48:
v26 = IsDBCSLeadByte(*v13);
v12 = 0;
if ( v26 )
{
LODWORD(v5) = v5 - 1;
*v11++ = *v13++;
--v8;
}
LODWORD(v5) = v5 - 1;
*v11++ = *v13++;
--v8;
goto LABEL_51;
[OUTLMIME!CloseAllSockets+0x50804 伪代码]
然而,利用上述漏洞触发堆溢出时,我无法满足再次跳出循环的条件,因此无法按需进行部分覆盖。因此,我不得不寻找满足特定条件而能跳出循环的输入。出于同样的原因,我严格审查了周围的代码部分,虽然没有找到能跳出循环的输入值,但发现了一个在处理特殊字符串时因索引未增加或未写入而导致陷入无限循环的漏洞。
## EIP控制

在执行堆喷洒和堆 Feng Shui 后,通过利用上述漏洞覆盖了另一个线程中未被无限循环捕获的运行对象的虚函数表,成功实现了 EIP 劫持。