【问题标题】:Removing assembly instructions from ELF从 ELF 中删除汇编指令
【发布时间】:2016-10-28 05:54:35
【问题描述】:

作为破解挑战的一部分,我正在研究一个模糊的二进制文件。它有一系列pushpopnop 指令(重复数千次)。从功能上讲,这些块对程序没有任何影响。但是,它们使 CFG 的生成和反转过程非常困难。

有关于如何将指令更改为 nop 的解决方案,以便我可以删除它们。但就我而言,我想完全去掉这些说明,以便更好地了解 CFG。如果指令被剥离,我知道内存偏移也必须修改。据我所知,没有工具可以直接实现这一点。

我正在使用 IDA Pro 评估版。我也对使用其他逆向工程框架的解决方案持开放态度。如果它是可编写脚本的,则它是可取的。

我通过了similar question,但是建议的解决方案不适用于我的情况。

【问题讨论】:

  • 有 r2 (radare.org) 用于 unix 世界的框架,带有脚本、CLI、WEB、简单的 TUI 和尚未完成的 GUI。你也可以试试reverseengineering.stackexchange.com
  • 并非总是可以做到这一点。代码可能以难以自动检测的方式依赖于事物的相对偏移量。 (例如,比仅修复跨越已删除insns的跳转地址上的位移更复杂)。但我想值得尝试看看它是否能在不破坏程序的情况下工作。
  • 或者我想,在生成 CFG 时,我应该只考虑部分代码(如 pushpopnop 序列的裂缝)寻找丢弃方法。我应该编辑问题来解决这个问题还是应该打开一个新问题?
  • 您可以考虑在有效 NOP 的开头到 NOP 的结尾插入一个jmp。至少您的 IDA 显示看起来更合乎逻辑。
  • @DavidHoelzer 谢谢。这是一个非常巧妙的想法。

标签: linux assembly x86 reverse-engineering elf


【解决方案1】:

我想完全去掉那些指令...我知道内存偏移也必须修改...

一般来说,这几乎是不可能的:

  1. 如果二进制导出任何动态符号,则必须更新 .dynsym(这些可能是您正在考虑的偏移量)。

  2. 您必须找到每个静态分配的函数指针,并使用新地址对其进行更新,但没有有效的方法来找到此类指针。

  3. 计算的GOTOs 和 switch 语句会创建函数指针表,即使程序源中不存在任何指针表。

  4. 正如 Peter Cordes 所指出的,可以编写在两个汇编标签之间使用 delta 的程序,并使用此类 delta(直接编码为指令的小立即数)来控制程序流。

您的目标程序可能没有上述所有复杂情况,但在仅适用于该程序的技术上花费大量精力似乎是浪费。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 2020-07-09
    • 2012-02-27
    • 2011-11-22
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多