CTF-PWN-栈溢出-中级ROP-【BROP-1】

文章目录

  • BROP(Blind ROP)
  • 攻击条件
  • 攻击路线
  • 三种gadget
  • 函数参数构造
  • 利用PLT
    • 构造rdx的参数的gadget
    • 找输出函数的plt
    • 输出二进制文件内容
    • 利用plt表中存在跳转到got表中相应的地址

BROP(Blind ROP)

即没有得到源码或者可执行程序文件的情况的文件下,只有一个提供的功能端口进行攻击

BROP(Blind ROP) 于 2014 年由 斯坦福大学 的 Andrea Bittau 提出,其相关研究成果发表在 Oakland 2014,其论文题目是 Hacking Blind,下面是作者对应的 论文 和 PPT, 以及作者相应的介绍

  • 论文
  • PPT讲解-很值得看看的

攻击条件

  1. 存在栈溢出漏洞,并知道如何触发
  2. 服务器进程在崩溃后重启, 并且重写启动的进程的地址与先前的地址一样(这也就是说即使程序有 ASLR 保护,但是其只是在程序最初启动的时候有效果)。目前 nginx, MySQL, Apache, OpenSSH 等服务器应用都是符合这种特性的)

在这里插入图片描述

攻击路线

目前,大部分应用都会开启 ASLR、NX、Canary 保护。我们需要做的就是如何去绕过这些防护
在这里插入图片描述

  1. 暴力枚举判断栈溢出长度
  2. 暴力尝试攻破canary,因为我们由之前的利用的条件二知道每次crash后重启的程序canary依然不变,所以可以按照字节爆破,每个字节8位,共有256种可能,我们可以一种一种字节可能去尝试,如果遇到没有报错的,说明此时该字节正确,然后再去尝试下一个。所以32位情况尝试1024次,64位尝试2048次
  3. 暴力枚举写返回地址找到能返回到主函数的地址
  4. 首先找到gadget,可以找libc_cs_init的gadget来利用,从而控制要调用函数的参数
  5. 首先利用得到的gadget构造参数,然后暴力枚举地址作为返回地址,此时存在地址对应的指令可能正好是输出函数,那么此时经过之前构造的参数,会输出对应的内容,如存在这些内容,说明找到了输出函数如write或者puts或者printf
  6. 此时再将所有地址的内容都输出,并写到一个自己建立的文件中,然后将该文件反汇编,可以看到该程序的汇编代码,此时找到对应输出函数的plt表的内容,可以找到 jmp 输出函数在got表中的地址 该指令,然后记录该输出函数在got表中的地址
  7. 然后将该输出函数在got表中的地址作为参数,返回地址为输出函数进行输出。可得到输出函数的地址
  8. 通过输出函数的地址找的对应的glibc版本,并计算出基地址,然后得到system的地址和/bin/sh的地址
  9. 此时再次输入,此时构造参数为/bin/sh的地址,返回地址为system的地址,从而getshell

三种gadget

PIE(Position-Independent Executables):位置无关的可执行文件,和Windows下的ASLR(Address Space Layout Randomization)机制类似,PIE enabled表示程序开启地址随机化选、意味着程序每次运行的时候地址都会变化。主要是为了解决二进制本身地址已知的问题,可用来防御return2elf和其他已知地址读写问题。

默认情况下,PIE未开启,x86加载的基地址为0x8048000,而x64加载的基址为0x400000。

开启PIE后,elf中相对偏移不变,但加载机制每次均变化。

probe就是用去暴力枚举的地址或者说探测的地址,
stop就是不会是程序crash的地址
trap就是会使程序crash的地址

从在栈上的返回地址开始布置不同的stop和trap可以识别执行的指令,因为执行stop意味程序不会崩溃,而trap意味着程序会崩溃,所以可以判断该指令的ret在哪个位置

  • probe,stop,traps,traps……
    通过不断改变probe去尝试,此时不会崩溃的是最后使得栈顶没有变化且最后会执行ret指令的指令序列
    ret
    xor eax,eax;ret
    push eax;pop ebx;ret
  • probe,trap,stop,trap, trap……
    此时通过不断改变probe的值,可以找到最后使栈顶元素少去一个,并且在ret之前栈顶不改变的情况下再ret的指令流
    pop rax;ret
    pop rdi;push rax;pop rsi;ret
  • probe,trap,trap,trap,trap,trap,trap,stop,trap,trap……
    此时可以找到含ret的指令,且在将进行ret之前,此时栈顶位置少去6个单位
    pop rax;pop rdi;pop rsi;pop rdx;pop rbx;pop r14;ret

但此时注意如果probe是_start函数的开始地址都不会crash
在这里插入图片描述

函数参数构造

此时如果需要用到write需要如下的gadget
在这里插入图片描述
对于参数可通过libc_csu_init
此时libc_csu_init中有一下子弹出 6 个寄存器的 gadgets,程序中并不经常出现。所以,如果我们发现了这样的 gadgets,那么,有很大的可能性,这个 gadgets 就是需要的gadgets。此时可通过错位构造得到想要的gadget
`
找gadget对于不同指令需要的排列的probe stop trap也不同
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

利用PLT

当probe为plt上某个函数的区间部分时,会执行这个给函数
在这里插入图片描述

构造rdx的参数的gadget

由于此时需要的gadget得有pop rdx;其最后还需有ret或者其他能间接将值转移到rdx得指令。但几乎没有
但此时是能够用调用strcmp函数后rdx是字符串长度值这个特性来修改rdx (有待商榷)

我们知道strcmp(para1, para2),只有para1和para2都是有效地址时,strcmp()函数才能够正确执行。我们前面已经知道了两个可用的gadget,csu_gadget1 + 7 和csu_gadget1 + 9。因此我们可用将这两个地址分别作为para1和para2,然后依然尝试probe判断是否成功执行,如果成功执行,说明找到了strcmp()。当然啦,也有可能找到strncmp()和strcasecmp()函数,但是它们和strcmp()有一样的效果。

在这里插入图片描述

找输出函数的plt

依然是构造好参数,但此时可以构造rdi,rsi,rdx了,此时只需要尝试probe如果输出参数对应的内容即找到了输出函数的plt的位置

输出二进制文件内容

然后构造好参数,利用输出函数输出二进制文件所有地址的内容。此时相当于没有blind,有源文件了。此时知道了plt表中的所有函数,那么可以调用不同函数了如read函数

利用plt表中存在跳转到got表中相应的地址

此时得到二进制文件后,找到输出函数的对应plt位置,找到其中跳转指令中存在输出函数在got表的地址,然后再次输出,此时参数为输出函数在got表中的地址,此时可以得到输出函数的真实地址,最后得到libc基地址并计算出/bin/sh的地址和system的地址,如果没有此时可以利用read函数或write函数写入可写的内存,参数自己构造,所以知道地址,然后调用系统调用或system都行,只不过系统调用还需构造其他参数
在这里插入图片描述

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

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

相关文章

C++学习实践(一)高频面试问题总结(附详细答案)

文章目录 一、基础常见面试题1、数组和链表区别2、深拷贝和浅拷贝相关问题的区别3、a和a区别4、c内存模型5、四种强制转换和应用场景 二、指针相关1、指针和引用的区别2、函数指针和指针函数3、传指针、引用和值4、常量指针和指针常量5、野指针6、智能指针的用法 三、关键字作用…

mySQL事务与存储引擎

目录 mySQL事务 1.事务的概念 2.事务的ACID特点 3.多客户端同时访问一个表时,出现的一致性问题 4.事务的隔离级别 5.事务的隔离级别作用范围 查询全局事务隔离级别 设置全局事务隔离级别 ​编辑查询会话事务隔离级别 设置会话事务隔离级别 6.事务控制语句…

这一次,我准备了 20节 PyTorch 中文课程

对于刚接触深度学习的小白来说,PyTorch 是必会的框架。 只是,很多小伙伴还没来得及开启学习之路,一个最重要的问题就摆在了面前: PyTorch,该怎么学呢? 很多同学会自己在网上找资料,不仅耗费时间…

如何使用IIS代理iServeriPortal

刘大 这里写目录标题 前言1.IIS使用http协议,iServer&iPortal使用http协议具体操作1.1 开启IIS管理器,并安装APR组件和url重写组件1.3 启用代理1.4 添加URL重写规则1.4.1 设置保留原始主机标头1.4.2 修改注册表1.5 iPortal的额外配置1.5.1 增加新的入…

使用防火墙是否可以应对DDoS攻击?

很多游戏行业公司对网络安全不够了解,觉得装个防火墙就可以万事大吉了。实际上使用防火墙确实是解决DDoS攻击问题的一种有效方法,一些更先进的防火墙还可以采用其他防御措施,例如:深度包检测、行为分析、人工智能等,来识别和防御各…

Vi文本编辑器如何使用,这里有详细步骤

Vi是一个强大的文本编辑器,包含在大多数Linux系统中,甚至是嵌入式系统中。有时,你必须在不包括更友好的文本编辑器的系统上编辑文本文件,因此了解Vi是至关重要的。 与Nano不同,Nano是一款易于使用的终端文本编辑器&am…

Shell 脚本应用(四)

正则表达式概述 正则表达式又称正规表达式,常规表达式。在代码中常简写为regex,regexp 或RE.正则表达式 是使用单个字符串来描述,匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串 的方法,通…

JVM入门到入土-Java虚拟机寄存器指令集与栈指令集

JVM入门到入土-Java虚拟机寄存器指令集与栈指令集 HotSpot虚拟机中的任何操作都需要入栈和出栈的步骤。 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小&#x…

PyCharm安装PyQt5一系列工具

目录 目录 一、安装IDE 二、安装Pycharm 三、Pycharm内安装一系列工具 1.新建一个项目 2.点击左上角File-Setting-点击加号 3.添加环境变量 4.配置qtdesigner,pyuic,pyrcc 三、用Pyinstaller打包成exe(简单版) 四、我的解释器装在了中文路径&a…

如何分析信号的频率信息?

1 简介 当信号的频率信息是已知的,或者近似已知的,则采样频率容易选择,选择最大采样频率的2倍以上(奈奎斯特采样)。 这里,将讨论信号频率未知的情况。尤其是,考虑如何避免混叠错误。 2 低通滤波(反混叠) 去除混叠错…

二、基于图像和结构化数据多模态融合的回归预测网络【框图讲解+源码】

整理读研期间做的项目与日常小实验 本篇未完待续…代码部分整理后补充 0. 背景 实验室有一些材料的SEM(扫描电镜)图像、也有对应的组分信息(结构化数据,包含类别特征和连续的数值特征),以及对应的力学性能…

WEB 3D技术 three.js带着大家简单在文档上过一下集合体 并理解如何在文档中调试参数

前面讲了 自己创建集合体 顶点分组 但是这样其实挺麻烦的 three.js 其实已经给我们封装好了 官网直接搜索 geometry 这边这个立方体 应该算是我们用的最多的 这里 这个就是通过三个参数设置 它们分别对应 高度 宽度 厚度 拉下来 我们看到 其实他有六个参数 前面的 x y z三个…

有什么好用的C/C++源代码混淆工具?

​ 有什么好用的C/C源代码混淆工具? 开始使用ipaguard 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术,可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP进行完整性保护,防止应用…

sqlmap各个命令的解释及其基本用法

各个命令的用法 -h,--help Show basic help message and exit(显示基本帮助消息并退出) -hh Show advanced help message and exit(显示高级帮助信息并退出) --version Show programs version number and exit(显示程序的版本…

力扣刷题记录(18)LeetCode:474、518、377、322

目录 474. 一和零 518. 零钱兑换 II 377. 组合总和 Ⅳ 322. 零钱兑换 总结&#xff1a; 474. 一和零 这道题和前面的思路一样&#xff0c;就是需要将背包扩展到二维。 class Solution { public:int findMaxForm(vector<string>& strs, int m, int n) {vector&l…

C语言结构体内存对齐

文章目录 一、结构体内存对齐问题二、查看结构体成员起始位置三、设置内存对齐方式 一、结构体内存对齐问题 如下的info_s结构体类型&#xff0c;包含一个int型成员age, 一个char型成员gender, 一个int型成员id。 单从数据成员的大小进行分析&#xff0c;整个结构体的大小应为…

输入两个时间,判断时间是否为非工作日,并且是日期否为同一天。是的话返回true,否返回false

工作遇到这么一个逻辑&#xff0c;前端回传两个时间&#xff08;必须是两个那一种&#xff09;。然后&#xff0c;我后端需要判断这两个时间是否为同一天&#xff0c;并且这个时间是否为非工作日&#xff0c;是的话返回true&#xff0c;反之返回false 代码&#xff1a; packa…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Dialog对话框组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Dialog对话框组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Dialog对话框组件 对话框的使用场景也很高频&#xff0c;比如 APP 上架应…

共享和独享的区别是什么?有必要用独享IP吗?

通俗地讲&#xff0c;共享IP就像乘坐公共汽车一样&#xff0c;您可以到达目的地&#xff0c;但将与其他乘客共享旅程&#xff0c;座位很可能是没有的。独享IP就像坐出租车一样&#xff0c;您可以更快到达目的地&#xff0c;由于车上只有您一个人&#xff0c;座位是您一个人专用…

安卓开发转鸿蒙开发到底有多简单?学习鸿蒙开发有什么价值?

相信各位小伙伴们多多少少都了解过鸿蒙了&#xff0c;有些一知半解而有些已经开始学习起来。那这个鸿蒙到底好不好搞&#xff1f;要不要搞&#xff1f; 据了解安卓反正目前工作感觉不好找&#xff0c;即便是上海这样的大城市也难搞&#xff0c;人员挺饱和的。最近临近年关裁员…