zoukankan      html  css  js  c++  java
  • Linux实践:文件破解

    Linux实践:文件破解

    标签(空格分隔): 20135321余佳源


    一、掌握NOP、JNE、JE、JMP、CMP汇编指令的机器码

    1. NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
    2. JNE:条件转移指令,如果不相等则跳转。(机器码:75)
    3. JE:条件转移指令,如果相等则跳转。(机器码:74)
    4. JMP:无条件转移指令。
      • 段内直接短转Jmp short(机器码:EB)
      • 段内直接近转移Jmp near(机器码:E9)
      • 段内间接转移Jmp word(机器码:FF)
      • 段间直接(远)转移Jmp far(机器码:EA)
    5. CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

    二、掌握反汇编与十六进制编程器

    1. 通过反汇编求出用户名、密码
      --

    1.编写一个简单的需要验证密码的程序

    代码相当简单,对应密码是20135321。

    2.编译并运行查看其结果

    3.在终端使用指令objdump -d fish进行反汇编查看

    4.找到main函数

    可以看到图中有一句cmp的比较语句,然后使用了一个jne即不符合条件时跳转,这里就是比较输入密码和设定密码,不等就跳转。而这两个密码对应存放的寄存器则是,0x1c和0x18。而0x1c中的16进制数对应的十进制数就是设定的密码20135321,0x18中的值是原定的0。

    而0x75 0e表示jne指令的跳转量为0x0e,从0x8048456跳转到0x8048464一行(即imp一行)。也就是说,当输入与已存口令不相等时,就不会执行函数调用(call)。

    那么,如果要破解程序使得无论输入的口令是否是正确的,都可以实现函数调用,就需要将这条jne指令修改一下,使得其跳转到0x8048458行的movl处,从而顺利执行call语句。也就是说其实这个jne被修改成原地回旋跳。

    5.程序破解

    • vi打开login,输入“:%!xxd”
    • 输入指令“/750e”查找到那个位置,确定位置后“INSERT”将其修改为7500

    • 输入“:%!xxd -r”并输入“:wq”保存

    • 成功破解

    • 开启反汇编验证修改

    三、其他的破解方式

    1. 把不相等时跳转到输入错误的处理语句jne改成相等时跳转到输入错误的处理语句je。找到即将修改的750e字段,将表示jne的75修改为74(表示je,即相等时跳转),可以将程序修改成输入正确密码时,输出Failed!输入错误密码时输出Hello Fish!

    2. 修改cmp指令的对象,使得比较结果永远相等,就是把要对比的两个寄存器数值0x1c和0x18进行修改,把两者修改同为1c或者18。使得不管输入什么,对比的结果都将是一样,而程序的输出结果都是Hello Fish!

  • 相关阅读:
    作为一个前端,可以如何机智地弄坏一台电脑?
    Mysql数据库字符集问题
    代码扫描工具 SonarQube Scanner 配置 & Jenkins 集成
    【C++】统计代码覆盖率(四)
    【Jenkins】各项配置
    python小知识点汇总
    MobaXterm使用
    PHP代码覆盖率
    golang代码覆盖率
    压测工具Locuse的使用
  • 原文地址:https://www.cnblogs.com/brotherlittlefish/p/5553928.html
Copyright © 2011-2022 走看看