使用IDA PRO修补简单的c程序会导致分段错误

时间:2012-01-26 21:49:21

标签: patch ida

这是我的计划:

#include <stdio.h>

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

}

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

image1

image2

enter image description here

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

原始说明是:

83 F9 05  cmp ecx, 5

看起来您正在尝试将其更改为常量的comaparison,例如:

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