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!

原文地址:https://www.cnblogs.com/brotherlittlefish/p/5553928.html