如何在32位系统中使用ROP+Return-to-dl来绕过ASLR+DEP

2017 年 10 月 3 日 FreeBuf pwdme

传统的利用return-to-plt+ROP来绕过ASLR + DEP的技术需要知道库中函数的偏移地址,而在没有libc库的情况下可以使用Return-to-dl-resolve技术来达到动态获得库函数地址的目的,关于dl-resolve的技术细节请点击阅读原文了解详情

Environment

Vulnerable code

编译程序并且打开系统的ASLR:

程序是一个简单的缓冲区溢出,可以覆盖返回地址,在DEP的保护下,我们可以使用ROP技术来执行代码,为了绕过ASLR,这里使用了return-to-plt技术。

return-to-plt

call write@plt

调用write@plt的代码如下:

函数的plt其实地址可以用objdump -d -j.plt bof读出:

栈的布局如下:

运行:

看到write@plt被成功调用打出了我们想要的字符串。

Relocation directly

接下来改一下ROP,将直接调用write@plt改为将reloc_offset放在栈中,直接跳到0x8048300执行:

看到write@pltreloc_offset0x18,修改代码为:

运行:

Make fake Elf32_Rel structure

接下来要建立假的Elf32_Rel结构体,原来第一个结构体的位置为:

这里我们可插入一个非常大的reloc_offset,把结构体位置定位到我们可以控制的区域,选择区域为base_stage+28reloc_offset = (base_stage+28) - addr_relplt,在指定区域插入伪造的结构体,先看看原来的write的结构体:

构造为:

后半段改为:

这样同样能调用write:

Make fake Elf32_Sym structure

我们知道在找到Elf32_Rel结构体后,会通过r_info >> 8得到Elf32_Sym结构体的位置

writer_info >> 8 = 4,所以在SYMTAB[4],也就是0x80481cc + 64:

我们可以把结构体放在base_stage + 36处,原结构体为:

所以构造为:

还要修改Elf32_Rel结构体中的r_info,保证:

所以base_stage + 36需要加padding,使得为0x10的倍数,计算得到这里正好符合padding的要求,可以不需要padding,修改后为:

结果一样:

Make fake string table

我们知道Elf32_Sym结构体第一项是函数名称字符串在STRTAB中的偏移:

只需要修改st_name字段,直接在Elf32_Sym结构体后加字符串即可:

结果:

Get shell

只要把write\x00改为system\x00,然后修改对应的参数就可以了,完整的脚本:

运行:

这样就在不知道库中函数偏移的情况下调用了system

参考来源: ROP stager + Return-to-dl-resolveによるASLR+DEP回避

*本文作者:pwdme,转载请注明来自 FreeBuf.COM

登录查看更多
0

相关内容

专知会员服务
142+阅读 · 2020年6月15日
【ACL2020】利用模拟退火实现无监督复述
专知会员服务
13+阅读 · 2020年5月26日
Python地理数据处理,362页pdf,Geoprocessing with Python
专知会员服务
110+阅读 · 2020年5月24日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
机器学习速查手册,135页pdf
专知会员服务
336+阅读 · 2020年3月15日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
【经典书】Python计算机视觉编程,中文版,363页pdf
专知会员服务
136+阅读 · 2020年2月16日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
68+阅读 · 2020年1月17日
如何给你PyTorch里的Dataloader打鸡血
极市平台
15+阅读 · 2019年5月21日
一个牛逼的 Python 调试工具
机器学习算法与Python学习
15+阅读 · 2019年4月30日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
Forge:如何管理你的机器学习实验
专知
11+阅读 · 2018年12月1日
10道题,测一测你的AI水平到底如何
七月在线实验室
8+阅读 · 2018年7月17日
开发、调试计算机视觉代码有哪些技巧?
AI研习社
3+阅读 · 2018年7月9日
Python | 50行代码实现人脸检测
计算机与网络安全
3+阅读 · 2018年1月23日
如何七周成为数据分析师
R语言中文社区
4+阅读 · 2017年7月19日
Arxiv
3+阅读 · 2018年11月29日
The Matrix Calculus You Need For Deep Learning
Arxiv
12+阅读 · 2018年7月2日
Arxiv
6+阅读 · 2018年5月22日
Arxiv
3+阅读 · 2018年4月5日
Arxiv
9+阅读 · 2018年1月30日
VIP会员
相关VIP内容
专知会员服务
142+阅读 · 2020年6月15日
【ACL2020】利用模拟退火实现无监督复述
专知会员服务
13+阅读 · 2020年5月26日
Python地理数据处理,362页pdf,Geoprocessing with Python
专知会员服务
110+阅读 · 2020年5月24日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
机器学习速查手册,135页pdf
专知会员服务
336+阅读 · 2020年3月15日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
【经典书】Python计算机视觉编程,中文版,363页pdf
专知会员服务
136+阅读 · 2020年2月16日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
68+阅读 · 2020年1月17日
相关资讯
如何给你PyTorch里的Dataloader打鸡血
极市平台
15+阅读 · 2019年5月21日
一个牛逼的 Python 调试工具
机器学习算法与Python学习
15+阅读 · 2019年4月30日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
Forge:如何管理你的机器学习实验
专知
11+阅读 · 2018年12月1日
10道题,测一测你的AI水平到底如何
七月在线实验室
8+阅读 · 2018年7月17日
开发、调试计算机视觉代码有哪些技巧?
AI研习社
3+阅读 · 2018年7月9日
Python | 50行代码实现人脸检测
计算机与网络安全
3+阅读 · 2018年1月23日
如何七周成为数据分析师
R语言中文社区
4+阅读 · 2017年7月19日
Top
微信扫码咨询专知VIP会员