Exploit FormatString 2017/06/05
CVE-2012-3569分析

0x00.环境

系统::WINXP SP3

影响软件:VMware-ovftool-2.1.0-467744-win-i386

0x01.成因

未过滤格式化字符串,导致%n写入栈上关键数据

0x02.要点

1.如何定位关键点?

从崩溃点开始不好分析,栈也被破坏了,利用windbg x命令很好定位,如下

0:000> x *!*basic_ostream*operator<<*
7848e3fd MSVCP90!std::basic_ostream<char,std::char_traits<char> >::operator<< (<no parameter info>)
7848e3fd MSVCP90!std::basic_ostream<char,std::char_traits<char> >::operator<< (<no parameter info>)
7848e3fd MSVCP90!std::basic_ostream<unsigned short,std::char_traits<unsigned short> >::operator<< (<no parameter info>)
7848e3fd MSVCP90!std::basic_ostream<wchar_t,std::char_traits<wchar_t> >::operator<< (<no parameter info>)
7848e3fd MSVCP90!std::basic_ostream<unsigned short,std::char_traits<unsigned short> >::operator<< (<no parameter info>)
...

全部下断,遇到刚开始经常断下的取消该断点,排除几次后找到关键输出函数7848e503,随即找到关键函数sub_47E7B0

2.怎么获得控制权的?

通过搜索字符,找到写入%hn的指针固定为ebp+50

0:000> dd ebp+50
0012fc6c  00680592 00000004 0012ff50 004184f4
0012fc7c  00cd5a38 02c9b9f8 5f49b106 016138e0
0012fc8c  00000002 00000000 029946f0 00000000
0012fc9c  00000100 0299482c 005ee3f6 00000000
0012fcac  0000000f 5f49b2e2 02994400 01e50000
0012fcbc  0299459c 005ee41e 00000000 0000000f
0012fccc  00000003 72507000 636f746f 00006c6f
0012fcdc  0012fcc4 00000000 0000000f 7c930040
0:000> k
ChildEBP RetAddr  
WARNING: Stack unwind information not available. Following frames may be wrong.
0012fc1c 0045637e ovftool+0x7ea31
0012fc74 004184f4 ovftool+0x5637e
0012ff50 004186f4 ovftool+0x184f4
0012ff7c 005e82ff ovftool+0x186f4
0012ffc0 7c817067 ovftool+0x1e82ff
0012fff0 00000000 kernel32!BaseProcessStart+0x23

可以看到第四次ret时将获得控制权

3.如何利用?

通过增长数据,使地址可预测,使得第四次RET到ROP+SHELLCODE的地址,完成利用