当前位置: 首页 > article >正文

逆向工程趣谈:如何通过残缺的重定位表‘猜’出C代码中的秘密数组名?

逆向工程趣谈如何通过残缺的重定位表‘猜’出C代码中的秘密数组名当你面对一个被故意混淆了符号名的目标文件时那种感觉就像拿到了一张被墨水涂改过的藏宝图。最近我在分析一个名为phase5.o的目标文件时就遇到了这样的挑战——关键数组TRAN_ARRAY在符号表中被显示为fEgeEF而其他重要符号也都被类似的无意义字符串替代。这不禁让我思考如何像侦探破案一样从这些被刻意隐藏的线索中还原出程序的真实面目1. 理解重定位表程序链接的胶水重定位表Relocation Table是ELF格式文件中一个至关重要的数据结构它记录了在链接阶段需要修正的地址引用。简单来说它就像是建筑工地上的此处需要连接标记告诉链接器哪些地方需要打补丁。在典型的ELF文件中你会看到两种重定位表.rel.text针对代码段的重定位.rel.data针对数据段的重定位每个重定位条目通常包含两个关键信息偏移量需要修正的位置在段内的偏移重定位类型和符号索引如何修正以及引用哪个符号typedef struct { Elf32_Addr r_offset; // 需要重定位的位置 Elf32_Word r_info; // 符号索引和重定位类型 } Elf32_Rel;提示在32位系统中每个重定位条目占8字节64位系统中则为16字节。2. 逆向推理从机器码到高级语言结构逆向工程最迷人的地方在于它要求你同时具备自上而下和自下而上的思维能力。当我看到phase5.o中那些被混淆的符号名时决定采用以下方法逐步还原2.1 符号表与重定位表的交叉分析首先使用readelf -s phase5.o查看符号表你会发现类似这样的条目Num: Value Size Type Bind Vis Ndx Name 9: 000000 0040 OBJECT GLOBAL DEFAULT 3 fEgeEF 10: 000040 0100 OBJECT GLOBAL DEFAULT 3 qbivHB 12: 000140 0004 OBJECT GLOBAL DEFAULT 3 CODE然后通过objdump -dr phase5.o查看反汇编代码和重定位信息你会看到类似80483a0: 8b 04 85 00 00 00 00 mov 0x0(,%eax,4),%eax R_386_32 fEgeEF这个重定位条目告诉我们在偏移量80483a3处需要填入fEgeEF的地址。结合反汇编代码可以推断这是一个数组访问操作因为有(,%eax,4)的索引计算。2.2 识别数组访问模式在C代码中数组访问通常编译为以下形式的汇编指令mov offset(base, index, scale), dest其中scale等于数组元素的大小如int数组通常为4。通过统计重定位表中引用fEgeEF的位置我发现有9处这样的访问且都出现在transform_code函数中。这强烈暗示fEgeEF实际上是一个被频繁访问的数组。3. 实战还原被混淆的符号名现在让我们一步步还原这个被混淆的程序结构。3.1 重建关键数据结构通过分析重定位表和反汇编代码可以推断出以下对应关系混淆符号实际含义证据线索fEgeEFTRAN_ARRAY多处数组访问模式用于转换逻辑qbivHBFDICT出现在字符编码函数中类似字典表CODECODE保持原名全局变量3.2 补全重定位表原始重定位表中有部分条目被清零我们需要根据程序逻辑补全。以下是关键步骤使用hexedit打开phase5.o定位到.rel.text节通常在0x524偏移处每个重定位条目8字节格式为前4字节需要重定位的偏移后4字节高24位为符号索引低8位为重定位类型例如要补全对fEgeEF的引用0000003d 09000001 # 偏移0x3d引用符号9(fEgeEF)类型R_386_32(01)3.3 验证推理的正确性为了验证我们的推断可以编写一个简单的测试程序extern const int fEgeEF[]; extern const char qbivHB[]; void test_array() { printf(fEgeEF[0] %x\n, fEgeEF[0]); printf(qbivHB[A] %c\n, qbivHB[A]); }如果输出符合预期如转换数组的值和字典表的映射就证明我们的符号还原是正确的。4. 逆向工程中的思维模式这种逆向推理过程实际上反映了软件安全分析中的核心思维模式模式识别识别常见的编译器代码生成模式假设验证提出假设并寻找证据支持或反驳交叉验证结合多种信息来源符号表、重定位表、反汇编上下文推理从程序整体行为推断局部功能例如在分析transform_code函数时我注意到它使用了TRAN_ARRAY即fEgeEF进行位操作// 还原后的transform_code函数 int transform_code(int code, int mode) { switch(TRAN_ARRAY[mode] 0x7) { case 0: code ~TRAN_ARRAY[mode]; break; case 1: code ^ TRAN_ARRAY[mode]; break; // ... } return code; }这种模式很像是某种编码或加密算法进一步验证了fEgeEF作为转换数组的角色。5. 工具链与技巧分享在实际操作中以下工具组合特别有用readelf查看ELF文件结构readelf -a phase5.oobjdump反汇编与重定位信息objdump -dr phase5.ohexedit直接编辑二进制文件nm查看符号表nm phase5.o几个实用技巧关注.rodata节常量数组通常存放在这里查找重复的访问模式数组操作通常有规律可循注意函数调用约定可以帮助识别参数传递6. 从理论到实践一个完整的推理案例让我们看一个具体的例子。在反汇编代码中我们发现了以下片段mov $0x0,%eax mov %eax,-0x4(%ebp) mov -0x4(%ebp),%eax cmp 0x8(%ebp),%eax jae 8048456 mov -0x4(%ebp),%eax mov 0x0(,%eax,4),%edx R_386_32 fEgeEF mov %edx,%eax and $0x7,%eax这段代码对应的C代码大致是for(int i 0; i size; i) { int val TRAN_ARRAY[i]; // fEgeEF switch(val 0x7) { // ... } }通过这样的模式匹配我们就能逐步重建出原始的代码逻辑。逆向工程就像是在解一个精心设计的谜题每个线索都隐藏在二进制文件的各个角落。那次分析phase5.o的经历让我深刻体会到即使面对高度混淆的代码通过系统性的分析和合理的推理我们仍然能够还原出程序的本意。最令我兴奋的时刻是当补全最后一个重定位条目后程序突然输出了预期的编码字符串——那一刻所有的猜测和验证都得到了完美的证实。

相关文章:

逆向工程趣谈:如何通过残缺的重定位表‘猜’出C代码中的秘密数组名?

逆向工程趣谈:如何通过残缺的重定位表‘猜’出C代码中的秘密数组名? 当你面对一个被故意混淆了符号名的目标文件时,那种感觉就像拿到了一张被墨水涂改过的藏宝图。最近我在分析一个名为phase5.o的目标文件时,就遇到了这样的挑战—…...

KMS_VL_ALL_AIO激活工具应用指南:从问题解决到高效部署

KMS_VL_ALL_AIO激活工具应用指南:从问题解决到高效部署 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 在现代办公环境中,软件授权管理是系统维护的重要环节。无论是个人…...

网盘直链解析工具:突破下载限制的技术方案与实践指南

网盘直链解析工具:突破下载限制的技术方案与实践指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云…...

别再只会点鼠标了!用ComfyUI节点搭建你的第一个AI绘画工作流(附避坑清单)

别再只会点鼠标了!用ComfyUI节点搭建你的第一个AI绘画工作流(附避坑清单) 想象一下,你面前摆着一盒乐高积木——每个零件都有特定功能,但真正的魔法发生在你把它们组合起来的瞬间。ComfyUI正是这样一个数字化的创意积木…...

FasterRCNN训练完别急着关!用predict.py批量预测并保存结果的完整配置指南

FasterRCNN模型预测实战:从批量推理到结果保存的全流程解析 当你终于完成FasterRCNN模型漫长的训练过程,看着损失曲线平稳下降,验证集指标达到预期,那种成就感不言而喻。但很多开发者在这里犯了一个常见错误——直接关闭项目转向下…...

不用装软件!这款MicroPython浏览器 IDE :让你在手机上也能调试树莓派 Pico弛

1、普通的insert into 如果(主键/唯一建)存在,则会报错 新需求:就算冲突也不报错,用其他处理逻辑 回到顶部 2、基本语法(INSERT INTO ... ON CONFLICT (...) DO (UPDATE SET ...)/(NOTHING)) 语…...

【权威实测|2026.03.15 CPython核心团队签发】:Python原生AOT插件下载失败率骤降92%,但90%开发者仍卡在第2步安装验证

第一章:Python原生AOT编译方案2026插件下载与安装概览Python原生AOT(Ahead-of-Time)编译方案2026是CPython官方实验性路线图中的关键演进,旨在为Python代码提供零运行时依赖的二进制输出能力。该方案不依赖PyInstaller或Nuitka等第…...

进口水漆全屋定制,亲测这家源头厂

一、行业痛点分析在进口水漆全屋定制领域,存在诸多核心技术挑战。首先是环保标准方面,数据显示,部分传统油漆中挥发性有机化合物(VOCs)含量可高达每升几百克,远高于国际先进标准的每升几十克以内。这不仅对…...

Phimp.me性能优化实践:如何提升图片处理速度的10个技巧

Phimp.me性能优化实践:如何提升图片处理速度的10个技巧 【免费下载链接】phimpme-android Phimp.me Photo Imaging and Picture Editor https://play.google.com/store/apps/details?idorg.fossasia.phimpme 项目地址: https://gitcode.com/gh_mirrors/ph/phimpm…...

别再暴力搜索了!用动态规划优化旅行商问题,C++代码效率提升实战

暴力搜索 vs 动态规划:旅行商问题的C效率革命 当城市数量超过10个时,传统的暴力搜索方法在解决旅行商问题(TSP)时就像试图用算盘计算宇宙中的原子数量——理论上可行,实际上完全不切实际。作为一名长期在算法竞赛中摸爬滚打的选手&#xff0c…...

《Signal, Image and Video Processing》投稿避坑指南:从LaTeX排版到审稿全流程解析

1. 投稿前的准备工作 投稿到《Signal, Image and Video Processing》这类专业期刊,准备工作做得好能省去后期很多麻烦。首先得确认你的研究方向是否符合期刊范围,这个期刊主要接收信号处理、图像处理和视频处理相关的论文,主编的研究方向是深…...

二叉树层序遍历与高度计算详解

一、先解答上次的思考题Day12 已经给出练习答案,这里不再重复,我们直接进入层序遍历。二、今天学习目标理解层序遍历(按一层一层打印)用队列实现层序遍历(BFS 思想)递归 迭代两种方式求二叉树高度完整可运…...

【YOLOv5】损失函数设计思想与工程实现剖析

1. YOLOv5损失函数的设计哲学 目标检测模型的性能很大程度上取决于损失函数的设计。YOLOv5作为单阶段检测器的代表作,其损失函数设计体现了三个核心思想:多任务平衡、样本分配优化和尺度适应性。与早期版本相比,v5的损失函数在保持YOLO系列简…...

第一篇博客:从新开始学习C语言

这是我的第一篇博客,也算是从0开始了。不仅是写博客的起点,也是我下定决心以更加认真的态度学好编程语言的起点。大家好,我是一名来自双非学校大二的学生。虽然已经大二了但是仍有很多方面未接触过,很多东西还不懂。说从新开始学习…...

别再踩坑了!SQL Server数据类型那点事儿,看懂这篇少背三个锅蹬

从0构建WAV文件:读懂计算机文件的本质 虽然接触计算机有一段时间了,但是我的视野一直局限于一个较小的范围之内,往往只能看到于算法竞赛相关的内容,计算机各种文件在我看来十分复杂,认为构建他们并能达到目的是一件困难…...

终极Windows和Office激活指南:KMS_VL_ALL_AIO完整教程

终极Windows和Office激活指南:KMS_VL_ALL_AIO完整教程 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows和Office激活烦恼吗?每次系统提示"产品未激活&q…...

Go Channel 缓冲区溢出问题

Go Channel 缓冲区溢出问题解析 在Go语言中,Channel是协程间通信的核心机制,但其缓冲区溢出问题常被开发者忽视。当写入数据的速度超过读取速度时,缓冲区可能溢出,导致程序阻塞或数据丢失。理解并解决这一问题,对构建…...

Java final关键字与抽象类深度解析

二、final关键字各位同学,接下来我们学习一个在面向对象编程中偶尔会用到的一个关键字叫final,也是为后面学习抽象类和接口做准备的。2.1 final修饰符的特点(面试题)我们先来认识一下final的特点,final关键字是最终的意思,可以修饰…...

6月PMP紧急预警:错过这次,下次难度让你哭!附60天极简通关计划

大家好,我是去年差点错过“末班车”的大头。 今天是4月6日。看到这个日期,我知道很多人心里在想什么:“还有两个月呢,急什么?” 我必须泼一盆冷水:留给你的时间真的不多了。 如果说之前还有机会摸鱼&…...

MIKEURBAN几种错误解决方法

今天小编给大家总结关于MIKEURBAN计算中常见的几种错误吧!错误一MIKE URBAN出现以上的错误时候,我们按照错误提示找出错误点的编号,此时的错误点是由于没有和汇水区做链接导致,重新手动做链接即可解决。错误二MIKE URBAN出现以上的…...

终极模组管理器:XXMI启动器让多游戏模组管理变得简单高效 [特殊字符]

终极模组管理器:XXMI启动器让多游戏模组管理变得简单高效 🚀 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 你是否曾经为《原神》《星穹铁道》《鸣潮》等…...

突破端侧极限!让 Gemma 4 在手机不仅能跑,还能“用中文张口说话” —— 安卓端侧大模型

2026 年 4 月初,Google 抛下了一枚重磅炸弹:Gemma 4 终于来了!更令人震撼的是,他们真的把多模态大模型完完整整塞进了手机里 —— 这一次,完全不需要联网、不需要传数据到云端,真正的零延迟隐私拉满的端侧离…...

STM32CubeMX 6.4+ 配置FreeRTOS+LWIP避坑实录(正点原子探索者V2 + LAN8720A)

STM32CubeMX 6.4高版本FreeRTOS与LWIP配置全攻略:从PHY复位到网络调试 最近在给正点原子探索者V2开发板移植FreeRTOSLWIP时,发现网上大部分教程都停留在CubeMX 5.x时代。当我用6.4版本按照老教程操作时,从时钟配置到PHY复位处处碰壁。经过三天…...

DDR5 SDRAM中的DQS间隔振荡器:原理、应用与误差分析

1. DDR5 SDRAM中的DQS间隔振荡器是什么? 如果你拆开过电脑内存条,可能会注意到那些排列整齐的黑色芯片——这就是SDRAM。而DDR5作为最新一代的内存标准,在速度和能效上都比前代有了显著提升。但今天我们要聊的不是这些宏观特性,而…...

告别重复搬砖!OpenClaw从零搭建可操作系统级AI智能体,自动化提效10倍实战指南

做开发、运维、办公的同学,是不是每天都在被重复的系统操作折磨?每天上班先开固定的5个软件、批量重命名上百个项目文件、服务器日常巡检查日志、Excel数据处理生成周报、重复的键鼠操作填OA表单,这些机械重复的工作,占了每天60%以…...

访问控制漏洞深度拆解(含代码)

在区块链安全事件中,访问控制漏洞(Access Control)已成为损失最高的攻击类型之一。攻击者无需复杂技术,只要找到“未加权限限制”的关键函数,就能直接接管合约甚至清空资金🔍 漏洞原理解析该漏洞本质是“谁都能调用本该受限的函数…...

【PyTorch 3.0静态图分布式训练权威指南】:20年炼成的7大避坑法则与吞吐量提升2.8倍实测方案

第一章:PyTorch 3.0静态图分布式训练的演进逻辑与核心范式PyTorch 3.0标志着从动态图主导范式向“动静统一”架构的关键跃迁。其静态图能力不再依赖独立编译器(如TorchScript或JIT的有限优化),而是通过原生集成的torch.compile()后…...

CLion 2025.1.1 + CubeMX + CMake:一站式配置STM32调试与烧录环境(以F103C8T6为例)

1. 为什么选择CLion开发STM32? 第一次用CLion开发STM32时,我整个人都是懵的——之前用Keil习惯了那种"配置5分钟,编译2小时"的节奏,突然切换到CLion这种现代IDE还真有点不适应。但用顺手之后发现真香定律再次应验&#…...

纽约州校园数据泄露激增背景下的安全治理与技术防御研究

摘要 2026 年 4 月 6 日,databreaches.net发布报道显示,2025 年纽约州校园数据安全事件同比大幅上升72%,其中长岛地区报告数量达44 起,揭示美国 K-12 教育机构在数据安全防护、账号权限管理、威胁监测与应急响应等方面存在系统性短…...

【Linux开发】01多线程编程:线程的创建与运行

一、为什么需要线程? 1.1 回顾多进程的缺点 我们之前学习了多进程服务器:父进程 fork 出子进程来处理客户端请求。这种方式虽然能实现并发,但存在一些问题: 资源开销大:每个进程都有独立的地址空间,创建和切…...