Return-into-libc分析

本文深入探讨了经典缓冲区溢出攻击及其防范机制,包括DEP/NX、ASLR及StackCanaries等。此外,还详细介绍了return-into-libc与ROP攻击原理,展示了如何通过精心构造的指令序列实现恶意代码的注入与执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经典缓冲区溢出
利用溢出,攻击者可以将期望数据写入漏洞程序内存中的任意位置,甚至包括控制程序 执行流的关键数据(比如函数调用后的返回地址),从而控制程序的执行过程并实施恶意行为。因此,攻击者通过篡改函数的返回地址以其指向自己纺织的恶意shellcode,这样函数返回时就可以跳转到相应的恶意代码来执行,即将恶意代码注入目标程序,并在以后跳转到此执行此代码。
提出的安全机制
针对这种先写后执行的攻击行为提出了DEP/NX机制,表示数据执行预防,此技术将内存区域标记为不可执行,通常将堆栈和堆标记为不可执行,从而预防攻击者执行驻留在这些内存区域的代码,保证内存只能被写或者被执行而不能先写后执行。
当然还有一些其他机制,ASLR、Stack Canaries等,ASLR表示地址空间层随机化,这种技术使共享库、堆栈和堆被占用的内存的地址随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置。Stack Canaries(函数栈)在这种技术中,编译器在堆栈帧的局部变量之后和保存的返回地址之前放置一个随机化保护值。在函数返回之前检查此保护,如果它不相同,然后程序退出,如果攻击者试图修改返回地址,Canary也将不可避免地被修改。因此,在函数返回之前,检查这个Canary,从而防止利用。(这些安全机制详解可见0day安全软件漏洞分析技术第二篇9、10、11、12、13、14、15章)
Return-into-libc 攻击原理
攻击者可以利用栈中的内容实施 return-into-libc 攻击。这是因为攻击者能够通过缓冲区溢出改写返回地址为一个库函数的地址,并且将此库函数执行时的参数也重新写入栈中。这样当函数调用时获取的是攻击者设定好的参数值(比如/bin/sh),并且结束后返回时就会返回到库函数而不是 main()。而此库函数实际上就帮助攻击者执行了其恶意行为。更复杂的攻击还可以通过 return-into-libc 的调用链(一系列库函数的连续调用)来完成(https://bbs.pediy.com/thread-217007.htm)。

于攻击者可用的指令序列只能为应用程序中已存在的函数,所以这种攻击方式的攻击能力有限。由于这种 return-into-libc 攻击方式的局限性,返回导向编程(Return-Oriented Programming, ROP)被提出,并成为一种有效的 return-into-libc 攻击手段。
ROP攻击原理
返回导向编程攻击的方式不再局限于将漏洞程序的控制流跳转到库函数中,而是可以利用程序和库函数中识别并选取的一组指令序列。攻击者将这些指令序列串连起来,形成攻击所需要的 shellcode 来从事后续的攻击行为。因此这种方式仍然不需要注入新的指令到漏洞程序就可以完成任意的操作。同时,它不利用完整的库函数,因此也不依赖于函数调用时通过堆栈传递参数。
返回导向编程攻击时,攻击者首先需要选取构建 shellcode 的指令,指令可以来自于应用程序二进制代码也可以来自于链接库。这些指令串连起来就可以形成整个 shellcode 的功能。最简单来讲,选取的每个连续指令序列都以“return”指令结束,这样如果攻击者在栈中放入后一个以“return”指令结束的指令序列的首指令地址,则在前一个”return”指令执行并返回时会 pop 栈中的后一个指令序列的首指令地址,并从前一个指令序列跳转到下一个指令序列执行。以此类推,就可以串连形成一个 ROP 链完成整个攻击。
ROP是一个复杂的技术,允许我们绕过DEP和ALSR,但不幸的是(或对于用户来说幸运的是)这不能绕过Canary,但如果有额外的内存泄漏,我们可以通过泄露,leak canary的值和使用它。ROP技术并不能绕过Canay保护措施。
ROP re-uses ,即我们可以重用Bin文件或者Libc文件(共享库)中的代码。这些代码,或者说指令,通常被我们称作“ROP Gadget”。
ROP 攻击代码的指令流在形式上具有一定的特征,即 ROP 代码中包含有大量的“ret”指令。 同时,每一小段指令序列通常都比较短小,一般只包含两到三个汇编语句,它们仅仅完成整个 shellcode 的一部分工作。这些指令通过“return”指令串连起来,实现最终 shellcode 的执行。其与传统 return-into-libc 攻击不同,在传统攻击中每个指令序列实际上是整个函数,而不是 ROP 攻击中的几条汇编指令。因此 ROP 攻击在一个更低的抽象层来进行攻击,更加灵活。构建 ROP 链有很多的技巧,具体可以参见参考资源中关于返回导向编程的论文内容。

相应实验网上一堆、、、、、

参考:
Paper:一种不完全依赖栈的ROP攻击技术的研究_林志添
     https://www.youkuaiyun.com/article/a/2014-03-03/15818077
0day安全软件漏洞分析技术第二篇安全机制
http://netsecurity.51cto.com/art/201703/534647.htm
看雪精华帖18之使用链接的return-to-libc绕过NX bit (NX bit是一种硬件保护机制,它通过设置页目录表中的相关属性位来表明分配出来的页内存是否可执行)
帖子地址:https://bbs.pediy.com/thread-217007.htm

### 全志T113-S3芯片及相关开发板概述 全志T113-S3是一款基于ARM架构的低功耗处理器,广泛应用于嵌入式系统和物联网设备中。该芯片集成了丰富的硬件资源,能够满足多种应用场景的需求[^1]。 #### 芯片规格 全志T113-S3的主要规格包括: - **CPU核心**:采用单核Cortex-A7架构,运行频率可达1GHz。 - **内存支持**:内置128MB DDR3内存,提供稳定的计算能力。 - **存储接口**:支持多种外部存储介质,如SD卡、eMMC以及SPI NAND闪存等[^1]。 - **外设接口**:提供了UART、I2C、SPI等多种通用串行通信接口,便于与其他外围设备互联。 - **图形处理单元(GPU)**:集成Mali400 MP GPU,适用于轻量级图像渲染任务。 - **视频编解码能力**:支持H.264编码/解码,适合多媒体应用场合。 #### 开发板特性 围绕T113-S3设计的开发板具备以下特点: - 提供完整的硬件平台,方便开发者测试与验证设计方案; - 支持通过Buildroot构建定制化的Linux操作系统镜像[^1]; - 搭载RTL8211系列网口PHY芯片,可实现可靠的以太网连接功能[^2]; #### 使用方法与工具链搭建 为了顺利开展基于此款SoC的应用程序编写活动,需完成如下准备工作: ##### 工具安装 在宿主机端执行必要的软件包部署操作之前,请确认已正确设置了交叉编译器路径变量等内容。如果发现缺少某些依赖项,则可通过APT管理器补充缺失组件实例命令展示如下所示[^3]: ```bash sudo apt-get update && sudo apt-get upgrade -y sudo apt-get install build-essential git-core libncurses5-dev zlib1g-dev gawk flex bison device-tree-compiler ccache python3-pip python-is-python3 wget curl libssl-dev bc rsync unzip p7zip-full dosfstools parted kmod lzop pv xz-utils qemu-user-static libc6-armhf-cross gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf libstdc++-arm-linux-gnueabihf-dev libgl1-mesa-dev:i386 u-boot-tools ``` ##### 关键配置文件说明 以下是几个重要的配置文件及其作用简介[^4]: - `board.dts`:描述特定主板布局参数给内核使用的DTB(Dynamic Translation Buffer)源代码形式存在; - `uboot-board.dts`: 定义Uboot引导加载期间所需初始化细节信息 ; - `linux/config-5.4`: 默认启用的一套针对目标系统的Linux Kernel选项集合 ; - `sys_config.fex & sys_partition.fex`: 控制固件打包流程里涉及的各项设置定义. 以上构成了整个项目的基础框架结构图谱. ```python def generate_dtb(source_file, output_directory): """ A function to compile DTS files into DTB format. Args: source_file (str): Path of the input .dts file. output_directory (str): Directory where compiled dtb should go. Returns: str: Full path of generated binary blob after successfull compilation process completes successfully otherwise raises exception upon failure condition encountered during execution phase . """ import os try: base_name = os.path.basename(os.path.splitext(source_file)[0]) target_path = f"{output_directory}/{base_name}.dtb" result = os.system(f"dtc -O dtb -o {target_path} {source_file}") if int(result)==0: return target_path else: raise Exception("Failed while trying to convert provided dts definition!") except Exception as e: print(e) # Example Usage Scenario Below Here For Demonstration Purposes Only Do Not Execute Directly Without Modifications Accordingly To Your Environment Setup Requirements First! compiled_blob=generate_dtb("/path/to/my_board.dts","./build_output/") print(compiled_blob) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值