Rex:栈溢出之Exploit自动生成

2019 年 2 月 16 日 FreeBuf

Rex是由Shellphish开发的自动化漏洞利用引擎,设计初衷在于参加Cyber Grand Challenge。本文以栈溢出为例,展示Rex自动生成 Exploit的能力。测试样例为Linux下可执行程序vuln_stacksmash,其中存在栈溢出漏洞,通过Rex自动生成rop2system、rop2text、jmpesp三种Exploit。

0x00 vuln_stacksmash栈溢出漏洞

使用radare2简要分析vuln_stacksmash。vuln()函数中,调用 read(int fd,void * bu,size_t count)时未检查缓冲区大小,导致栈溢出。

使用GDB调试vuln_stacksmash,运行至溢出点,程序状态如下:

计算偏移为0x44,构造PoC并输入。单步执行并检查栈帧情况,可见EBP已被“\x41\x41\x41\x41”覆盖,后续四个字节为EIP值,已被覆盖为“\x42\x42\x42\x42”。

跟踪至vuln()返回,触发异常,EIP被劫持为“\x42\x42\x42\x42”。

上文简要分析了vuln_stacksmash中存在的栈溢出漏洞,下文将介绍如何利用Rex自动生成Exploit。

0x01 Rex脚本

Rex的实现基于Angr,主要采用混合符号执行技术,对原理感兴趣的同学可以阅读论文《(State of) The Art of War: Offensive Techniques in Binary Analysis》。由于封装的原因,整体代码看起来较为简洁,从漏洞复现、漏洞类型判定、Exploit生成到Exploit有效性验证,共计10行代码。其中,Crash类用以复现漏洞并返回漏洞类型,Exploit类用以判定漏洞的可利用性,并生成Exploit。171 ~ 174行用以验证Exploit的有效性。

0x02 漏洞复现

Rex在实现混合符号执行时,首先使用QEMU进行Concrete Execution,在获取到Crash状态后,使用Angr进行Concolic Execution,相关功能封装在Crash类中。

1、Concrete Execution

使用QEMU加载vuln_stacksmash,以PoC为输入运行,获取程序崩溃时的状态。执行结果如下:

2、Concolic Execution

在获取到Crash state后,基于Angr实现Concolic Execution。首先设置程序初始状态。

使用‘posix’、’preconstrainer’插件辅助分析:

SimSystemPosix()

Data storage and interaction mechanisms for states with an environment conforming to posix.

Available as state.posix.

SimStatePreconstrainer()

This state plugin manages the concept of preconstraining - adding constraints which you would like to remove later.

:param constrained_addrs : SimActions for memory operations whose addresses should be constrained during crash analysis

使用‘Tracer’、’Oppologist’两种Exploration_techniques:

设置simulation_manager:

执行结果:

0x03 漏洞类型判定

Crash类中的_triage_crash()方法对漏洞类型进行判定。

执行结果为IP_OVERWRITE:

0x04 Exploit生成

代码中设置了rop_leak_memory、rop_set_register、 explore_for_exploit三种利用方式。通过阅读源码可知,rop_leak_memory、rop_set_register均是针对CGC格式文件的利用技术。在Rex现有的exploit_technique中,call_jmp_sp_shellcode、call_shellcode、rop_to_system三种技术用以针对ELF文件。执行结果如下:

0x05 Verified

对三种生成结果进行确认。

0x06 小结

通过学习Rex源码以及混合符号执行,成功对栈溢出漏洞生成Exploit。文中所针对的漏洞非常简单,且未涉及ASLR等安全机制的绕过。由于弟才疏学浅,文中难免存在理解不当之处,望各位师傅批评指正。

*本文原创作者:xiaohan0x00,本文属FreeBuf原创奖励计划,未经许可禁止转载

登录查看更多
0

相关内容

【论文】结构GANs,Structured GANs,
专知会员服务
14+阅读 · 2020年1月16日
【论文】欺骗学习(Learning by Cheating)
专知会员服务
26+阅读 · 2020年1月3日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
94+阅读 · 2019年12月4日
【ICIP2019教程-NVIDIA】图像到图像转换,附7份PPT下载
专知会员服务
53+阅读 · 2019年11月20日
Keras作者François Chollet推荐的开源图像搜索引擎项目Sis
专知会员服务
29+阅读 · 2019年10月17日
Linux挖矿病毒的清除与分析
FreeBuf
14+阅读 · 2019年4月15日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
自动文本摘要
AI研习社
21+阅读 · 2018年10月27日
如何使用注意力模型生成图像描述?
AI研习社
9+阅读 · 2018年8月6日
用Python调用百度OCR接口实例
数据挖掘入门与实战
16+阅读 · 2018年1月29日
gan生成图像at 1024² 的 代码 论文
CreateAMind
4+阅读 · 2017年10月31日
利用深度强化学习进行对话生成
PaperWeekly
9+阅读 · 2017年8月23日
【开发】 用GAN来做图像生成,这是最好的方法
GAN生成式对抗网络
6+阅读 · 2017年8月9日
Learning to See Through Obstructions
Arxiv
7+阅读 · 2020年4月2日
Arxiv
3+阅读 · 2012年11月20日
VIP会员
相关资讯
Linux挖矿病毒的清除与分析
FreeBuf
14+阅读 · 2019年4月15日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
自动文本摘要
AI研习社
21+阅读 · 2018年10月27日
如何使用注意力模型生成图像描述?
AI研习社
9+阅读 · 2018年8月6日
用Python调用百度OCR接口实例
数据挖掘入门与实战
16+阅读 · 2018年1月29日
gan生成图像at 1024² 的 代码 论文
CreateAMind
4+阅读 · 2017年10月31日
利用深度强化学习进行对话生成
PaperWeekly
9+阅读 · 2017年8月23日
【开发】 用GAN来做图像生成,这是最好的方法
GAN生成式对抗网络
6+阅读 · 2017年8月9日
Top
微信扫码咨询专知VIP会员