zoukankan      html  css  js  c++  java
  • 实践2.3 程序破解

    2.3 程序破解

    我使用的程序代码如下:

    //passwd.c
    #include <stdio.h>
    int main()
    {
    	int passwd = 950914;
    	int enter = 0;
    	printf("please input your passwd:
    ");
    	scanf("%d",&enter);
    	if (enter == passwd)
    		printf("Right.
    ");
    	else 
    		printf("Wrong.
    ");
    	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指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

  • 相关阅读:
    UVaLive 7362 Farey (数学,欧拉函数)
    UVaLive 7361 Immortal Porpoises (矩阵快速幂)
    UVaLive 7359 Sum Kind Of Problem (数学,水题)
    CodeForces 706D Vasiliy's Multiset (字典树查询+贪心)
    负载均衡服务器
    集群-如何理解集群?
    架构规划
    领域模型
    状态图
    E-R图
  • 原文地址:https://www.cnblogs.com/20135202yjx/p/5535032.html
Copyright © 2011-2022 走看看