实践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;
}

编译后结果如图:

enter description here
然后反汇编:

objdump -d passwd

找到main函数,如下图所示:

enter description here
红色方框中的就是判断跳转指令,JNE的指令码为75,当前指令的地址为8048476,eip=8048478,如果判断条件为不相等,就要跳转到eip+0x0e即8048486处。
这里我想让无论输入密码是否为真都要提示正确,只需要把“不相等时跳转的目的”和相等时一致即可,也就是把0e改为00.
修改方式为:

vi passwd   //打开可执行文件
:%!xxd  //进入十六进制编辑方式
/75 0e  //定位到这一条指令,并把0e改为00

enter description here

:%!xxd -r
:wq

这时候再反汇编查看时:

enter description here
可以看到已经变成了7500
然后运行后,结果对比如下:
修改之前vs修改之后:

enter description here

各汇编指令的机器码:

  • 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指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

posted @ 2016-05-27 16:16  20135202闫佳歆  阅读(165)  评论(0编辑  收藏  举报