【问题标题】:Patching a simple c program with IDA PRO get segmentation fault用 IDA PRO 修补一个简单的 c 程序得到分段错误
【发布时间】:2012-01-27 09:53:03
【问题描述】:

这是我的程序:

#include <stdio.h>

int main(){
  int var=5;
  if(var==5) printf("Accesso effettuato!");
  else printf("Access denied");

}

我更改了操作代码...在此图像中的十六进制编辑中,但是当我运行我的程序时出现分段错误。

【问题讨论】:

    标签: patch ida


    【解决方案1】:

    您会遇到分段错误,因为操作码83 05 表示指令ADD DWORD PTR [address],constant,其中addressconstant 由接下来的五个字节05 89 45 F4 75 确定。所以在这种情况下,指令是ADD DWORD PTR [F4458905],75。所以你引用了一个无效的内存地址。

    【讨论】:

      【解决方案2】:

      原来的指令是:

      83 F9 05  cmp ecx, 5
      

      您似乎正试图将其更改为恒定的比较,例如:

      83 05 05  cmp 5, 5     ; not what you think it is!
      

      我怀疑这样的野兽是否存在,因为它的用处充其量是值得怀疑的。比较两个常数似乎是浪费硅。

      实际上将其更改为几乎可以肯定取消引用无效地址的指令。

      作为选项一,您可以用一个设置零位的字节序列替换那个三字节序列(因为向下检查几条指令是一条jnz 指令),并用足够的nop 操作填充它以使其大小一样。

      或者,查找cmp ecx, ecx 语句(再次使用适当的nop 填充),以便确定所有 标志设置正确。这是,根据 GNU 汇编器as

      39 c9      cmp  %ecx, %ecx
      90         nop
      

      【讨论】:

      • Cmp ecx,ecx 是 83 F9 F9?无论如何谢谢你的回答,我明白我的错误
      • @Usi,操作码没那么简单,你需要一个汇编程序,否则 IDA Pro 应该可以为你完成。
      猜你喜欢
      • 2014-08-15
      • 2012-01-28
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      相关资源
      最近更新 更多