记一次VMware的瓦解调试阐发进程

宣布时候 2020-08-11

1.研讨背景


VMware Workstation是一款支流的假造机软件,近期启明星斗ADLab宁静研讨员在利用VMware假造机的进程中碰到假造机非常瓦解的题目,当从7zip中间接将文件拖拽到VMware假造机中,会形成假造机非常封闭。今朝已测试过VMware 15.5.0、15.5.2、15.5.5 和7zip 19.0、20.02等版本。本文将经由进程对VMware和7zip法式遏制跟踪阐发,终究定位假造机非常封闭缘由。

2.VMware端调试阐发

利用WinDbg-I指令将WinDbg设置为立即调试器,VMware-vmx.exe法式瓦解后主动弹出WinDbg。仓库信息以下:



调试信息显现stack buffer overrun非常,最后揣度能够是缓冲区溢出缝隙。



经由进程查问材料后发明,从Windows 8起头,Windows设想了一个新的间断INT 29H,用以疾速抛出失利,在sdk中被申明为__fastfail, __fastfail外部函数不会前往。


体系布局
指令
代码参数的地位
x86
int 0x29
ecx
x64
int 0x29
rcx
ARM
操纵码 0xDEFB
r0


在上图中,法式遏制于int 29h,而它的参数为0xa,对应FAST_FAIL_GUARD_ICALL_CHECK_FAILURE,由此揣度题目能够呈现在CFG的查抄进程中。



从函数挪用栈中vmware_vmx+0x58b21地点向上追溯,静态调试法式,比拟法式一般运转与非常瓦解的函数挪用区分,定位到与法式瓦解相干的函数sub_1400965A0。


利用Windbg Attach vmware-vmx.exe法式,在sub_1400965A0函数设置断点,起头静态调试。从7z翻开的紧缩文件中拖拽cdp.pcapng的文件,法式在断点处停下。经由进程静态调试可知该函数中calloc分派了三个堆空间,别离用于寄存:主机姑且文件途径temp_path、方针文件名file_name和VMware中的缓存目次名vm_cache_dir_name。



可是翻开主机Temp目次下却不发明该文件,因而开端判定这是法式瓦解缘由。延续往下看,3个文件相干参数全都传入了sub_140579b30函数。



进入函数sub_140579b30,定位temp_path参数的处置。此中,sub_14057FF90函数对传入的temp_path遏制了一一遍历,sub_1405B2080函数对传入的temp_path遏制了不法性查抄。上面重点阐发sub_140576460函数。



sub_140576460函数将途径参数temp_path传入了sub_14049DA50。



起首,函数sub_14049DA50经由进程sub_140477C70对字符串遏制了处置。而后,挪用wstat64获得响应途径的文件状况,若是胜利获得则保管到一个布局体中,不然前往0xffffffff。因为Temp目次下并未发明备份文件,致使获得状况失利,从而前往0xffffffff。



前往0xffffffff后,从头回到sub_140579b30函数中,法式跳出while轮回达到以下地位,输入毛病信息并跳转至sub_140572A70。



从sub_140572A70终究履行到sub_1400960C0,达到以下地位将vmware_vmx+0xb1ed90处的值赋给了rsi,即为0。



延续往下履行,将rsi中0值赋值到rax中,而后挪用0x7ff8fab0c510处,即ntdll!LdrpDispatchUserCallTarget。



此处与静态下的进程有一点差别,静态下该处挪用以下:



若是按照静态进程履行,该当达到sub_1407C7650,即以下地位:


在ntdll.dll被加载之前,该处数据照旧为上图所示地点:



厥后在ntdll.dll中实行CFG(ControlFlowGuard)掩护机制,将vmware_vmx+0x7c9668地点处数据遏制了改写,从而履行到ntdll!LdrpDispatchUserCallTarget中。



在ntdll!LdrpDispatchUserCallTarget函数中,取r11+r10*8处的值赋值给r11时呈现了题目,该地点为空,就形成了空指针援用,从而履行了int 29h,形成非常。可是,即便不CFG机制,法式也会在履行“jmp rax”处瓦解,经由进程下图能够看出,CFG机制仅仅是在本来法式跳转指令前增加了一些查抄。



至此,VMware瓦解的缘由根基阐发清晰了。另外一个疑难是,为甚么7zip已在体系Temp下天生了文件,并且VMware也已获得到了途径参数,却在挪动前主动删除文件呢。这就须要从7zip中寻觅谜底。


3.7zip端调试阐发

由上一节阐发可知,Vmware crash缘由是Temp目次下文件被删除。浏览7zip源码,锁定了CPP/Windows/FileDir.cpp中的文件删除函数。



利用WinDbg加载7zip,而后在Remove函数地位遏制下断,法式运转后遏制拖拽操纵,在Remove函数间断后对应的挪用仓库以下所示。



仓库中7zFM+0x5b212地点位于函数CPanel::OnDrag中,该函数为鼠标拖拽操纵函数。当检测到对7zip翻开的目次遏制操纵时,便会在Temp目次下天生一个以7zE开首的随机定名文件夹。



而后,将该文件夹设置为方针目次,并且设置了一些数据及IpDropSourse布局体。



延续往下能够看到一个DoDragDrop函数,该函数功效是遏制OLE拖放相干操纵,经由进程检测光标的行动别离挪用一些方式并前往对应的数值。



而后,按照DoDragDrop函数的前往值来判定光标的拖拽是不是有用,从而履行对应的操纵。



从7zip中拖拽文件到假造机,因为没法获知文件拖拽的方针途径,是以DoDragDrop会前往DRAGDROP_S_CANCEL(0x40101),不会履行拷贝操纵的分支,而是间接将Temp目次下天生的姑且目次删除。



4.小 结


7zip紧缩包中文件拖拽操纵会触发DoDragDrop函数挪用,该函数会获得文件数据及光标遏制的地位。可是将文件拖拽到VMware窗口时,DoDragDrop函数不能获得精确的方针途径,是以没法将文件拷贝到方针地位,从而间接删除姑且文件,终究致使VMware没法获得文件状况形成瓦解。


参考链接:

[1]http://0cch.com/2016/12/13/int29h/

[2]http://docs.microsoft.com/en-us/windows/win32/api/ole2/nf-ole2-dodragdrop

[3]http://github.com/kornelski/7z/tree/20e38032e62bd6bb3a176d51bce0558b16dd51e2



启明星斗主动进攻尝试室(ADLab)


ADLab建立于1999年,是中国宁静行业最早建立的攻防手艺研讨尝试室之一,微软MAPP打算焦点成员,“黑雀进犯”观点首推者。停止今朝,ADLab已由进程CVE累计宣布宁静缝隙近1100个,经由进程 CNVD/CNNVD累计宣布宁静缝隙900余个,延续坚持国际收集宁静范畴一流水准。尝试室研讨标的目的涵盖操纵体系与利用体系宁静研讨、挪动智能终端宁静研讨、物联网智能装备宁静研讨、Web宁静研讨、工控体系宁静研讨、云宁静研讨。研讨功效利用于产物焦点手艺研讨、国度重点科技名目攻关、专业宁静办事等。


lab.jpg