安全矩阵

 找回密码
 立即注册
搜索
查看: 959|回复: 0

Igor的本周小贴士#167:添加和分割段

[复制链接]

18

主题

18

帖子

134

积分

注册会员

Rank: 2

积分
134
发表于 2023-12-5 15:19:30 | 显示全部楼层 |阅读模式
翻译:梦幻的彼岸
在分析固件二进制文件时,合理的内存布局相当重要。加载原始二进制文件时,IDA 通常会为整个二进制文件创建一个代码段。当您只需要分析该代码时,这就足够了,但情况并非总是如此。例如,例如,代码可以引用外部硬件作为MMIO(内存映射I/O),或者使用不属于二进制映像的额外内存。如何处理这种情况?
创建段
要在数据库中添加额外地址,请通过如下步骤: Edit > Segments > Create segment… 操作。

输入段名、起始/结束地址和可选类别。类通常只是提供信息,但可能会影响反编译器的行为。“Use sparse storage option”适用于大部分为空且数据项相对较少的数据段(如 BSS 或 MMIO)。启用该选项后,IDA 将使用针对此类情况优化的存储空间,因此即使新的数据段非常大,IDB 也不会增长太多。
注意:段的结束地址是排他的,即段的最后一个字节的地址为 end_ea-1。
段创建后,最好重新分析数据库,以便发现对新可用地址的引用。
分割段
如果您指定的地址范围与现有段有部分交叉,IDA 将自动截断该段,为新段腾出空间。例如,假设你有一个从 0 到 0x80000 的 ROM 固件段,但后来发现代码区域似乎在 0x60000 处结束。若要将最后一部分分割为只读数据,可创建一个边界为 0x60000 至 0x80000 的新段(如命名为 .rodata),ROM 段将自动截断为 0x60000 结尾。
移动段边界
比方说,在进一步分析二进制文件后,你发现 .rodata 实际上应该从 0x70000 开始。你可以通过以下步骤快速移动分割点:
  • 导航到新的分割点 (e.g. 0x70000);
  • Invoke Edit > Segments > Edit segment (或使用快捷键 Alt–S);
  • 在起始地址(或终止地址,取决于移动的方向)中,在此处输入。
  • 确保“Move adjacent segments” 已启用,然后单击 OK.
由于 IDA 中的大多数数字输入字段都接受IDC 表达式,此处将转换为当前地址(0x70000),因此 .rodata 段边界将调整为 0x70000-0x80000,相邻 ROM 段扩展为 0-0x70000。

知识扩展(非原文内容)
segments单词解析:
一个"节"或"段"通常是指一个具有特定属性或用途的数据或代码的集合。例如,在某些操作系统中,内存可以被划分为不同的段,每个段用于不同的目的(例如,一个段用于执行程序代码,另一个段用于存储数据等)。在病毒分析中,"segments"可能指的是被病毒恶意利用的计算机资源的部分。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 01:44 , Processed in 0.012553 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表