当前位置: 首页 > 网络应用技术

双制固件功能锁定动态

时间:2023-03-08 23:39:39 网络应用技术

  背景简介

  固件系统中的二进制文件取决于特定系统环境的执行。对固件的研究需要通过固件的模拟执行二进制文件程序,而无需支持。取决于特定硬件环境的固件无法完全模拟,并且挂钩需要一个取决于硬件的函数。

  ld_preload锁

  特定功能的锁定技术被分为动态注入锁和静态注射锁。静态注射是指通过修改静态二进制文件中的内容来注射特定功能。淋巴注射在操作过程中是指锁定特定功能。动态注入锁定可以通过锁定PLT表或一方面获取表,另一方面可以通过环境变量LD_PRELOAD来实现。

  在“揭开路由器0DayCve”中,作者针对D-Link DIR-605L(FW_113)路由器中的Web应用程序BOA。静态MIPS可以模拟执行,并且文本中的作者通过LD_PRELOAD环境可变实现锁定函数。

  现有问题

  LD_PRELOAD环境变量的开关指定在编译ULIBC时,关闭选项时,LD_PRELEROAD不能用于预订指定的动态链接库文件。

  在固件的二进制文件中,将删除二进制文件中的部分信息,并且仅保留片段信息,以便无法通过补丁增加动态链接库。patches支持二进制文件的补丁修改或添加执行过程中的链接lib。

  本文的计划

  在小精灵文件中,有一个动态段,ld.,因此可以加载程序在通过本节运行的程序中所需的LIB文件。图1是在IDA中编译后观看的动态段的内容。

  图1 ELF32_DYN结构数组

  动态部分简介

  动态部分的开头包括一个由n elf32_dyn组成的结构,该结构表示结构的类型。d_un是指针d_ptr的值或联合结合的相应结构。

  D_TAG字段保留类型定义参数。有关详细信息,请参见ELF(5)手册。动态链接通常使用的更重要的类型值在下面列出

  1-dt_ned此类型的数据结构保存了程序所需的共享库的名称。字符串表的偏移

  2-dt_symtab动态符号表的动态符号表,相应的部分为.dynsym

  3-dt_hash符号散点列表的名称,相应的部分为.hash,也称为.gnu.hash

  4-DT_STRTAB符号字符串表的地址,相应的部分为.dynstr

  5-DT_PLTGOT全球射击桌

  由于上述字段显示在IDA中如下所示,d_tag字段表示动态段的类型,当值为1。共享库的名称取决于程序的名称取决于要加载的LIB的相应d_val。

  与共享库文件名相对应的结构的类型值为0x01。如图2所示,0x4001c4-0x4001e4保留了共享库的名称,该名称依赖于5个二进制文件。

  图2 DT_NEDED共享库依赖关系

  动态段的定位

  从二进制文件开始的动态段的过程如下:

  elf_header->程序标头 - >动态程序

  ELF_HEADER保留了程序标头的偏移

  图3小精灵标题

  程序标头中动态段的相关结构信息

  图4程序标题

  扩展此结构,您可以在文件0x140h中找到动态段的偏移

  程序标头结构

  DT_NEDED锻造

  动态部分由动态结构的数量组成,动态结构定义如下:

  仍然有一部分空间可以填充动态和Elf_hash之间的空间。本文使用此部分空间来实现特定的LIB负载。

  [----帮助网络安全学习,所有信息加上Weixin:YJ009991,注释“掘金”的收购!

  ①净安全学习成长道路思维地图

  ②60+网络安全经典常用工具包

  ③100+SRC分析报告

  ④150+净安全实际战斗技术E-书

  ⑤最有权威的CISSP认证测试指南+问题库

  ⑥超过1800页CTF实际战斗技能手册

  ⑦DATO工厂的最新面试问题集(包括答案)

  ⑧应用客户端安全检测指南(Android+iOS)

  在本文中计划实验和测试

  使用Dynamic和Elf_hash之间的空区域,在该区域中伪造了一个新的新动态数组。如下图所示,二进制文件的大小未修改,而IBCJSON.SO则是假装的,因此二进制文件加载了。IBCJSON.SO.写下IBCJSON.SO中的相应锁定功能。

  想法:依次移动原始的ELF32_DYN数组元素,然后将伪造的ibcjson.so添加到第一个数组中。LIB的名称可以选择字符串表中的任何字符串。

  核心移动代码依次移动ELF32_DYN中的元素,动态部分动态[0]元素被用作填充的数据。在本文的实验中,在动态[0]中添加1的值1。。注意大小末端的转换问题。

  测试环境

  BOA程序TotOlink N210RE,锁定功能参考DIR605A,锁定APMIB_INIT和APMIB_GET

  固件的LD已关闭,LD_Preload程序选项已关闭。

  锁定功能代码用作“揭示家庭路由器CVE”提供的示例代码。根据原件,添加printf检查显示屏是否成功。

  通过MIPS-Linux-GCC编译。注意MIPS-Linux-GCC在编译过程中的编译文件的位置(步入坑!!!)

  使用以下代码,向原始BOA二进制文件添加动态

  makefile如下

  N210RE的测试屏幕截图如下,通过导出ld_library_path加载程序ibcjson.so,成功锁定boa,输出helloloo

  Ubuntu下的Rand功能锁定测试

  rand函数的标题文件是stdlib.h

  写Rand.C

  写rand_hook.so

  使用ld_preload测试成功实现了该功能的锁

  使用补丁为动态段落,测试rand_patch的元素添加伪造,并增加依赖于IBC.SO.6,ibc.so.6的库文件,以通过Extort ld_library_path_path_path_path_path_path_path_so.6导入IBC.SO.6的文件路径

  意识到兰德的锁

  总结

  本文研究了二进制文件中的动态段,并通过修改二进制文件来添加依赖共享库,以解决固件缺少仿真固件时固件缺乏节日信息的问题,并且固件函数无法通过ld_preleroad锁定固件功能。该解决方案仍然存在缺点。LD加载共享库的依赖顺序和共享锁定锁的基本原则尚未深入探讨。

  参考

  “揭示路由器0DAY DISCIR技术”

  “二元分析战斗”

  有关更多拍摄现场实验和在线安全学习材料,请单击此处>>

  原始:https://juejin.cn/post/71041909315556892679