Linux课程实践三:简单程序破解

一、基本知识

1. 常用指令机器码

  • 不同版本对应机器码不同,这里以我做实验的kali(Intel 80386)为例。
指令作用机器码
nop无作用(no operation)90
call调用子程序,子程序以ret结尾e8
ret返回程序c3
cmp比较c3
jmp无条件跳转eb
je/jz若相等则跳转74/84
jne/jnz不相等则跳转75/85
mov传值89
movl长字传值c7
  • 实际上使用更改的主要是跳转指令。

2. 修改工具

(1)反汇编:objdump
  • 输出目标文件的符号表:

      objdump -t obj

    744787-20160527130435741-1199636464.png

  • 输出目标文件的所有段概括

      objdump -h obj

    744787-20160527130440772-895181496.png

  • 输出反汇编源代码结果

      objdump -d obj

    744787-20160527130451147-630646712.png

(2)十六进制编程器
  • 查看文件的十六进制编码(输出规范的十六进制和ASCII码):

      hexdump -C obj

    744787-20160527131124381-1676667896.png

二、程序破解实践

1. login程序简述

  • 基本功能:模拟登陆过程。
  • 初始密码:2046
  • 登陆成功:

    744787-20160526150450413-1498961989.png

  • 登陆失败:

    744787-20160526150454506-1596915446.png

2. 使用反汇编查看login程序

objdump -d login
  • 找到main函数部分,可以看到:

    744787-20160526150705725-1021298879.png

  • 密码:07feH(即十进制2046)
  • 输入比较:
    • 若成功,继续执行后面的代码(804858),打印成功信息。
    • 若失败,则跳转到8048466处的代码,打印失败信息。

3. 修改程序

  • 基本步骤:

      - 用编辑器打开
      - 使用命令 `:%!xxd` 转换显示十六进制
      - 进行修改
      - 使用命令 `:%!xxd -r` 还原显示
      - 保存退出
(1)实现任何输入都成功登录
  • 找到比较 750e 处:

    744787-20160526181310006-2102600907.png

  • e更改为 0,不判断条件而是直接执行下面登录成功的代码:

    744787-20160526181313709-2142176179.png

  • 运行,任意输入密码验证:

    744787-20160526181316444-1405332995.png

(2)实现任何输入都无法成功登陆
  • 找到比较 750e 处:

    744787-20160526181310006-2102600907.png

  • 75更改为 eb,将条件跳转更改为无条件跳转,直接执行登陆失败的代码:

    744787-20160526185421678-104177038.png

  • 运行,输入密码2046:

    744787-20160526185425491-1464674108.png

(3)实现密码更改
  • 找到密码 07fe 处:

    744787-20160526183934663-165943110.png

  • 07fe 更改为 14c5(即十进制的5317),注意使用大端法写入:

    744787-20160526183938506-71942442.png

  • 运行,输入原密码2046和新密码5317:

    744787-20160526183942084-620033291.png

转载于:https://www.cnblogs.com/hyq20135317/p/5534280.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值