Linux课题实践三——程序破解

2.3   程序破解

20135318 刘浩晨

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

NOPNOP指令即“空指令”。执行到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 name,找到main函数:

(objdump是gcc工具,用来查看编译后目标文件的组成)

Linux课题实践三——程序破解

在main函数的汇编代码中可以看出程序在调用“scanf”函数请求输入之后,对 [esp+0x1c] 和 [esp+0x18]
两个内存单元的内容进行了比较,其作用应该是对比用户输入和预设口令。

esp+0x1c为首地址被定义为:0x963d3301

esp+0x18为首地址被定义为:0x00000000

如果从低地址往高地址连续的就是01 33 3d 96,即为20135318(密码)

(2)修改可执行文件,玩转密码登陆

实践目的:不管密码输入正确与否都可以正常登陆。

代码name.c:

Linux课题实践三——程序破解

运行测试:

Linux课题实践三——程序破解

Linux课题实践三——程序破解

使用objdump
-d a.out查看main:

Linux课题实践三——程序破解

为了跳过口令检查,也就是无论比较的结果如何,都正常登陆。

jne是条件跳转,如果条件满足,则跳转到80484b7;

jne下两行可知是输出内容;

jmp是跳转语句(没有条件,则直接跳转),直接跳到80484ca;

jmp下两行也是输出内容。

jne表示当比较不相等时,跳转。也就是说,当输入与已存口令不相等时,跳转到jmp下一行mov(80484be),如果比较结果相等,则执行jne下两行mov、callq行,说明,执行mov、callq行输出的为“OK!”。

现在可以明确,需要修改红线处,使其在比较结果不等时也跳转到下一行。

所以,将0e改为00即可。

使用vi编辑器进入a.out,输入:%!xxd

Linux课题实践三——程序破解

输入/750e,找到其位置

Linux课题实践三——程序破解

将0e改为00:,然后输入:%!xxd –r,保存退出。

Linux课题实践三——程序破解

Linux课题实践三——程序破解

再次查看main:

Linux课题实践三——程序破解

测试结果:(无论输入什么,都表示正确)

Linux课题实践三——程序破解

3、掌握可执行文件的基本格式

Linux可执行文件格式为ELF即Executable and Linkable Format。

ELF格式:

ELF header

program header table

.txt .rodata .data

Section header table

详细内容可以见ELF文件格式分析。

 

上一篇:Python xml模块


下一篇:Nginx的session一致性问题