实践2.3 程序破解
2.3 程序破解
我使用的程序代码如下:
//passwd.c
#include <stdio.h>
int main()
{
int passwd = 950914;
int enter = 0;
printf("please input your passwd:\n");
scanf("%d",&enter);
if (enter == passwd)
printf("Right.\n");
else
printf("Wrong.\n");
return 0;
}
编译后结果如图:
然后反汇编:
objdump -d passwd
找到main函数,如下图所示:
红色方框中的就是判断跳转指令,JNE的指令码为75,当前指令的地址为8048476,eip=8048478,如果判断条件为不相等,就要跳转到eip+0x0e即8048486处。
这里我想让无论输入密码是否为真都要提示正确,只需要把“不相等时跳转的目的”和相等时一致即可,也就是把0e改为00.
修改方式为:
vi passwd //打开可执行文件
:%!xxd //进入十六进制编辑方式
/75 0e //定位到这一条指令,并把0e改为00
:%!xxd -r
:wq
这时候再反汇编查看时:
可以看到已经变成了7500
然后运行后,结果对比如下:
修改之前vs修改之后:
各汇编指令的机器码:
-
NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
-
JNE:条件转移指令,如果不相等则跳转。(机器码:75)
-
JE:条件转移指令,如果相等则跳转。(机器码:74)
-
JMP:无条件转移指令。
- 段内直接短转Jmp short(机器码:EB)
- 段内直接近转移Jmp near(机器码:E9)
- 段内间接转移Jmp word(机器码:FF)
- 段间直接(远)转移Jmp far(机器码:EA)
-
CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。