【发布时间】:2012-01-27 09:53:03
【问题描述】:
这是我的程序:
#include <stdio.h>
int main(){
int var=5;
if(var==5) printf("Accesso effettuato!");
else printf("Access denied");
}
我更改了操作代码...在此图像中的十六进制编辑中,但是当我运行我的程序时出现分段错误。
【问题讨论】:
这是我的程序:
#include <stdio.h>
int main(){
int var=5;
if(var==5) printf("Accesso effettuato!");
else printf("Access denied");
}
我更改了操作代码...在此图像中的十六进制编辑中,但是当我运行我的程序时出现分段错误。
【问题讨论】:
您会遇到分段错误,因为操作码83 05 表示指令ADD DWORD PTR [address],constant,其中address 和constant 由接下来的五个字节05 89 45 F4 75 确定。所以在这种情况下,指令是ADD DWORD PTR [F4458905],75。所以你引用了一个无效的内存地址。
【讨论】:
原来的指令是:
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
【讨论】: