边肖为您带来了新开发的自动漏洞利用引擎Rex自动化漏洞利用引擎,该引擎旨在参与DARPA网络挑战,并展示了自动生成Rex堆栈溢出漏洞的能力。测试示例是linux下的可执行程序vuln _ stacksmash,其中存在堆栈溢出漏洞。Rop2text、rop2system、jmpesp都是Rex自动生成的。如有必要,下载rex自动漏洞利用引擎。
Rex自动利用引擎000 vuln _ stack mash堆栈溢出漏洞使用radare2对vuln _ stack mash进行简要分析。在vuln()函数中,调用read (int FD,void * buf,size _ tcount)时,不检查缓冲区大小,导致堆栈溢出。
使用GDB调试vuln _ stacksmash并运行到溢出点。程序状态如下:
计算偏移量为044,构造PoC并输入。单步执行并检查堆栈帧,可以看到EBP已被“\ x41 \ x41 \ x41”覆盖,接下来的四个字节是EIP值,已被“\ x42 \ x42 \ x42”覆盖。
追踪到vuln()返回,触发异常,EIP被劫持为“\ x42 \ x42 \ x42”。
上面简要分析了vuln _ stacksmash中的堆栈溢出漏洞,下面将介绍如何使用Rex自动生成Exploit。
Rex自动开发引擎001 Rex脚本的实现基于Angr,主要采用混合符号执行技术。对原理感兴趣的同学可以看论文《(State of) The Art of War: Offensive Techniques in Binary Analysis》。由于封装,整个代码看起来很简单,包括10行代码,包括漏洞重现、漏洞类型确定、漏洞利用生成和漏洞利用有效性验证。其中,Crash类用于重现漏洞并返回漏洞类型,Exploit类用于判断漏洞的可用性并生成Exploit。第171-174行用于验证漏洞利用的有效性。
Rex自动漏洞利用引擎002漏洞重现:在实现混合符号执行时,Rex首先使用QEMU进行具体执行,在获得Crash状态后,使用Angr进行具体执行,相关函数封装在Crash类中。
1、具体实施
使用QEMU加载vuln _ stacksmash,以PoC作为输入运行,获取程序崩溃时的状态。实施结果如下:
2、并行执行
获得崩溃状态后,基于Angr实现Concolic执行。首先设置程序的初始状态。
使用“POSIX”、“预构造器”插件来辅助分析:
SimSystemPosix()
环境符合posix的状态的数据存储和交互机制。
作为“state.posix”提供。
SimStatePreconstrainer()
这个状态插件管理预过滤的概念——添加您希望稍后删除的约束。
: param constrained _ addrs :内存操作,其地址应在崩溃分析期间受到约束
使用“追踪器”和“机会主义者”探索技术:
设置模拟管理器:
执行结果:
003漏洞类型确定。
Crash类中的_ trial _ Crash()方法决定了漏洞类型。
执行结果为IP_OVERWRITE:
Rex自动漏洞利用引擎的0 01 Rex脚本生成的代码中设置了Rop_leak_memory、rop_set_register和explore_for_exploit。根据源代码,rop_leak_memory和rop_set_register是CGC格式文件的利用技术。在Rex现有的exploit _ technology中,call_jmp_sp_shellcode、call_shellcode和rop_to_system用于ELF文件。实施结果如下:
005已验证
确认三个生成的结果。
006汇总。