这是我的计划:
#include <stdio.h>
int main(){
int var=5;
if(var==5) printf("Accesso effettuato!");
else printf("Access denied");
}
我在十六进制编辑中更改操作代码...就像在此图像中一样,但是当我运行程序时,我遇到了分段错误。
答案 0 :(得分:4)
您会收到细分错误,因为操作码83 05
表示ADD DWORD PTR [address],constant
和address
由下一个五个字节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