程序破解
1、 掌握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指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
2、掌握反汇编与十六进制编程器
(1)通过反汇编求出用户名、密码
打开终端,输入objdump –d 01,找到main函数:
(objdump是gcc工具,用来查看编译后目标文件的组成)
(此时使用的是实验一的代码,包含用户名和密码的输入)
在main函数的汇编代码中可以看出程序在调用“scanf”函数请求输入之后,对 [rbp-0x20] 和 [rbp-0x10] 两个内存单元的内容进行了比较,其作用应该是对比用户输入和预设口令。
esp+0x20为首地址被定义为:0x00746e6c
esp+0x10为首地址被定义为:0x00333231
如果从低地址往高地址连续的就是6c 6e 74 00 31 32 33 00
转换为字符表示为lnt 123 (用户名 密码)
(2)修改可执行文件,玩转密码登陆
①不管输入正确与否都可以正常登陆。
②不管输入正确与否都可以不可以正常登陆。
③输入正确密码不能登录,输入错误密码能够登陆。
首先,重新编写一个简单的代码11.c:
使用objdump –d 11查看main:
①为了跳过口令检查,也就是无论比较的结果如何,都正常登陆。
jne是条件跳转,如果条件满足,则跳转到4005e0;
jne下两行可知是输出内容;
jmp是跳转语句(没有条件,则直接跳转),直接跳到4005f1;
jmp下两行也是输出内容。
jne表示当比较不相等时,跳转。也就是说,当输入与已存口令不相等时,跳转到jmp下一行mov(4005e7),如果比较结果相等,则执行jne下两行mov、callq行,说明,执行mov、callq行输出的为“right”。
现在可以明确,需要修改红线处,使其在比较结果不等时也跳转到下一行。
所以,将0e改为00即可。
使用vi编辑器进入11,
输入:%!xxd
输入/750c
将0c改为00:,然后输入:%!xxd –r
输入:wq
使用objdump –d 11查看main:
测试结果:(无论输入什么,都表示正确)
②不可以正常登陆,即需要无条件跳转到错误的地方,无条件跳转为jmp,则同理需要将750c改成eb0c.(eb为无条件跳转);
测试结果:(输入正确,表示错误)
③同理若需要出现相反效果,即输入正确密码不能登录,输入错误密码能够登陆。则需要将其改为740c。
测试结果: