Linux实践:文件破解
Linux实践:文件破解
标签(空格分隔): 20135321余佳源
一、掌握NOP、JNE、JE、JMP、CMP汇编指令的机器码
- 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指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
二、掌握反汇编与十六进制编程器
- 通过反汇编求出用户名、密码
--
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”保存
- 成功破解
- 开启反汇编验证修改
三、其他的破解方式
-
把不相等时跳转到输入错误的处理语句jne改成相等时跳转到输入错误的处理语句je。找到即将修改的750e字段,将表示jne的75修改为74(表示je,即相等时跳转),可以将程序修改成输入正确密码时,输出Failed!输入错误密码时输出Hello Fish!
-
修改cmp指令的对象,使得比较结果永远相等,就是把要对比的两个寄存器数值0x1c和0x18进行修改,把两者修改同为1c或者18。使得不管输入什么,对比的结果都将是一样,而程序的输出结果都是Hello Fish!