软件安全实验——pre7(JIT sprayheap spraySEH绕过DEP漏洞预习)

Posted 大灬白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件安全实验——pre7(JIT sprayheap spraySEH绕过DEP漏洞预习)相关的知识,希望对你有一定的参考价值。

一级目录

1、详细解释一下JIT spray以及heap spray是什么?

答:
(1)
JIT编译(just-in-time compilation)狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”。JIT可以加快脚本代码的执行。在浏览器中通常会使用JIT。JIT编译器对于攻击者来说是一个很大的攻击面,存在各种各样的攻击,例如: 1. JIT-Spray 2. JIT-based code-reuse attacks。另外JIT编译器由于代码很复杂,也导致了攻击面很大。
JIT-Spray:JIT Spray是一种诞生于2010年的漏洞利用技术,可将Shellcode嵌入到JIT引擎生成的可执行代码中。目前,包括Chakra在内的各JIT引擎几乎都针对该技术采取了防御措施,包括随机插入空指令、立即数加密等。如果一个高级语言的表达式中含有有固定值,并且这个高级语言是JIT编译的,那就可以在运行时嵌入恶意代码,从而绕过DEP。如果如果攻击者尝试去分配(Spray)很多的这类代码,代码的地址就变得可以预知了,从而绕过ASLR。最后需要获得程序的控制流,这种情况下,JIT编译器的UAF、Type Confusion、堆溢出就很有用了。

(2)
为什么需要Heap Spray?首先看看现有的攻击技术:

对于已有的栈溢出堆溢出攻击方法,大部分已经很难利用了。攻击者怎么办?别急!还可以覆盖的函数指针,对象指针,但是覆盖这些指针之后怎么利用呢?强大的Heap Spray来帮你。
Heap Spray(堆喷射)是在shellcode的前面加上大量的slide code(滑板指令),组成一个注入代码段。然后向系统申请大量内存,并且反复用注入代码段来填充。这样就使得进程的地址空间被大量的注入代码所占据。然后结合其他的漏洞攻击技术控制程序流,使得程序执行到堆上,最终将导致shellcode的执行。
传统slide code(滑板指令)一般是NOP指令,但是随着一些新的攻击技术的出现,逐渐开始使用更多的类NOP指令,譬如0x0C(0x0C0C代表的x86指令是OR AL 0x0C),0x0D等等,不管是NOP还是0C,他们的共同特点就是不会影响shellcode的执行。使用slide code的原因下面还会详细讲到。
Heap Spray只是一种辅助技术,需要结合其他的栈溢出或堆溢出等等各种溢出技术才能发挥作用。
Heap Spray第一次被用于漏洞利用至少是在2001年,但是广泛被使用则应该是2005年,因为这一年在IE上面发现了很多的漏洞,造成了这种利用技术的爆发,而且在浏览器利用中是比较有效的。另一个原因是这种利用技术学习成本低,通用性高并且方便使用,初学者可以快速掌握。
因此,Heap Spray是一种通过(比较巧妙的方式)控制堆上数据,继而把程序控制流导向ShellCode的古老艺术。

2、解释一下老的windows操作系统下面利用SEH绕过DEP的原理和过程。

SEH(“Structured Exception Handling”),即结构化异常处理是windows操作系统提供给程序设计者的强有力的处理程序错误或异常的武器。
DEP是数据执行保护的英文缩写,全称为Data Execution Prevention。数据执行保护(DEP) 是一套软硬件技术,能够在内存上执行额外检查以帮助防止在系统上运行恶意代码。
第一步:Fuzz,触发漏洞
第二步:利用no-safeSeh模块地址覆盖seh,绕过safesef,并返回到准备的数据缓冲区。
第三步:利用no-safeseh模块内的add esp num; retn(num > 0x909)绕过no-safeseh。
第四步:关闭dep,指向shellcode。

如果在启用DEP后,就不能使用pop pop ret地址了,而应采用pop reg/pop reg/pop esp/ret 指令的地址,指令pop esp 可以改变堆栈指针,ret将执行流转移到nseh 中的地址上(用关闭NX 例程的地址覆盖nseh,用指向pop/pop/pop esp/ret 指令的指针覆盖异常处理器)。

以上是关于软件安全实验——pre7(JIT sprayheap spraySEH绕过DEP漏洞预习)的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出Java 10的实验性JIT编译器Graal

软件安全实验——lab10(二TCP/IP攻击实验)

一种针对JavaScript引擎JIT编译器的模糊测试方法

软件安全实验——pre3

软件安全实验——lab8(SQL注入)(上)(旧虚拟机seedubuntu9版本实验)

软件安全实验——lab3(格式化字符串printf)