程序破解

一、掌握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)通过反汇编求出用户名、密码

首先,使用EXP进行分析,输入指令 objdump -d exp后,找到MAIN函数

这里的截图是刚好在scanf函数之后的,因为我们是要比较输入的和提前设置好的变量相比较。我又找到strcmp这个函数之前的几句有两个lea语句,也就是找了两个地址。那么strcmp比较的应该就是这两个为首地址的两个字符串。先看esp+0x38这里在前面有没有定义:



那么可以看到:

esp+0x38为首地址被定义为:0x696d6461

esp+0x3c为首地址被定义为:0x0000006e

如果从低地址往高地址连续的就是61 64 6d 69 6e 00 00 00

转换为字符表示为:admin



同样的我们看到另外一个比较的地址是esp+0x42和esp+0x46

Esp+0x42是0x79736165,由低到高就是65 61 73 79

转换为字符表示为:easy

登录成功后,如下图

(2)修改可执行文件

我主要实现任何密码都可以登录,使用的是老师上课使用的login代码

objdump –d login 查看main:



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

  1. jne是条件跳转,如果条件满足,则跳转到8048466jne下两行可知是输出内容;
  2. jmp是跳转语句(没有条件,则直接跳转),直接跳到8048472jmp下两行也是输出内容。

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

现在可以明确,需要修改使其在比较结果不等时也跳转到下一行。所以,将0e改为00即可。下一步,使用vi进入login,输入:%!xxd



输入/750c,将0c改为00:,然后输入:%!xxd –r,最后再输入:wq

发现其已经被改正。



测试结果如下,发现输入任何东西都可以输出正确的结果

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

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

ELF格式:

  1. ELF header
  2. program header table
  3. .txt .rodata .data
  4. Section header table

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

补充

①不可以正常登陆,即需要无条件跳转到错误的地方,无条件跳转为jmp,则同理需要将750e改成eb0e.(eb为无条件跳转);

②同理若需要出现相反效果,即输入正确密码不能登录,输入错误密码能够登陆。则需要将其改为740e。

20135323符运锦----LINUX第三次实践:程序破解的更多相关文章

  1. 20135323符运锦----LINUX第二次实践:内核模块编译

    Linux实践二--模块 一.知识点总结 ①Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个单内核.单内核由于所有内容都集成在一起,效率 ...

  2. 20135323符运锦----第三周:构建一个简单的Linux系统MenuOS

    相关知识点 1.arch目录 占据相当庞大的空间,X86目录下代码需要重点关注. 2.init目录 内核启动的相关代码基本都在此目录下,内含MAIN.C,文件中START_KERNEL是整个LINUX ...

  3. 20135323符运锦期中总结----Linux系统的理解及学习心得

    一.网易云课堂 1.各章节总结 第一周:计算机是如何工作的http://www.cnblogs.com/20135323fuyunjin/p/5222787.html 第二周:操作系统是如何工作的ht ...

  4. 20135323符运锦----第七周:Linux内核如何装载和启动一个可执行程序

    可执行程序的装载 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 ①编译器预处理 gcc -E -o XX.cpp XX.c (-m32)// 注:把include的文件包含进来, ...

  5. LINUX第三次实践:程序破解

    LINUX第三次实践:程序破解 标签(空格分隔): 20135328陈都 一.掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即"空指令".执行到NOP ...

  6. linux第三次实践:ELF文件格式分析

    linux第三次实践:ELF文件格式分析 标签(空格分隔): 20135328陈都 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文 ...

  7. linux专题三之如何悄悄破解root密码(以redhat7.2x64为例)

    root用户在linux系统中拥有至高无上的权限.掌握了root密码,差不对可以对linux系统随心所欲了,当然了,root用户也不是权限最高的用户. 但是掌握了root密码,基本上够我们用了.本文将 ...

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

    一.基本知识 1. 常用指令机器码 不同版本对应机器码不同,这里以我做实验的kali(Intel 80386)为例. 指令 作用 机器码 nop 无作用(no operation) 90 call 调 ...

  9. LINUX实践--程序破解

    实验思想 本次实验的主要思想有两个,第一个是修改跳转指令,把它变成无条件跳转使得无论输入什么用户名都跳转到失败的那个选项中去,第二个思想是修改比对的内容,即不判断条件,从而成功 实验步骤 1.首先从老 ...

随机推荐

  1. 4.9Python数据类型(5)列表(新版)

    前言 列表是一种python类似数组的数据结构,操作灵活,可存储多种类型的数据. 目录 1.列表的基础知识 2.列表的增删改查并操作 3.列表的其他操作 4.基本方法表 (一)列表的基础知识 1.说明 ...

  2. 第3章 Git使用人门

    [初识Github] 首先让我们大家一起喊一句“Hello Github”.YEAH!就是这样. Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理 ...

  3. 从头学Android之RelativeLayout相对布局

    http://blog.csdn.net/worker90/article/details/6893246 相对布局对于做Web开发来说再熟悉不过了,我们在用CSS+DIV的时候经常会用到这些类似的相 ...

  4. java通过传入的日期,获取所在周的周一至周日

    public static void main(String[] args) { try { SimpleDateFormat sdf=new SimpleDateFormat("yyyy- ...

  5. [题目] Luogu P5038 [SCOI2012]奇怪的游戏

    学习资料 -----1----- -----2----- P5038 [SCOI2012]奇怪的游戏 一道甚神但没用到高深模型的题 思路 没思路,看题解吧 代码 #include <iostre ...

  6. P1387 最大正方形

    2018-08-16 https://www.luogu.org/problemnew/show/P1387 题意: 略. 4 4 0 0 1 1      把这个翻译成dp的形式   0 0 1 1 ...

  7. 手把手教你Chrome浏览器安装Postman(含下载云盘链接)(转)

    文章转自http://www.ljwit.com/archives/php/278.html 说明: Postman不多介绍,是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件.本文主要 ...

  8. mongodb数据库中插入数据

    mongodb数据库中插入数据 一:connection 访问集合: 在mongodb数据库中,数据是存储在许多数据集合中,可以使用数据库对象的collection方法访问一个集合.该方法使用如下: ...

  9. Linux kernel Programming - Advanced Char Driver Operations

    ioctl //user space int ioctl(int fd,unsigned long cmd,...); //kernel space int (*ioctl)(struct inode ...

  10. ASP.NET quartz 定时任务

    1.下载 2.使用例子 Demo 概述:Quartz 是开源的定时任务工具类,默认每隔10秒执行一次任务,相当于C#的Timer,不断的循环执行(Start 方法),也可以随时停止(ShutDown方 ...