1

这是我的程序:

#include <stdio.h>

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

}

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

图像1

图2

在此处输入图像描述

4

2 回答 2

5

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

于 2012-01-26T21:57:43.693 回答
1

原来的指令是:

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
于 2012-01-26T22:01:06.293 回答