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

输出目标文件的所有段概括
objdump -h obj

输出反汇编源代码结果
objdump -d obj

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

二、程序破解实践
1. login程序简述
基本功能:模拟登陆过程。
初始密码:2046
登陆成功:

登陆失败:

2. 使用反汇编查看login程序
objdump -d login
找到main函数部分,可以看到:

密码:07feH(即十进制2046)
输入比较:
- 若成功,继续执行后面的代码(804858),打印成功信息。
- 若失败,则跳转到8048466处的代码,打印失败信息。
3. 修改程序
基本步骤:
- 用编辑器打开
- 使用命令 `:%!xxd` 转换显示十六进制
- 进行修改
- 使用命令 `:%!xxd -r` 还原显示
- 保存退出
(1)实现任何输入都成功登录
找到比较
750e处:
将
e更改为0,不判断条件而是直接执行下面登录成功的代码:
运行,任意输入密码验证:

(2)实现任何输入都无法成功登陆
找到比较
750e处:
将
75更改为eb,将条件跳转更改为无条件跳转,直接执行登陆失败的代码:
运行,输入密码2046:

(3)实现密码更改
找到密码
07fe处:
将
07fe更改为14c5(即十进制的5317),注意使用大端法写入:
运行,输入原密码2046和新密码5317:

Linux课程实践三:简单程序破解的更多相关文章
- 20135337——Linux实践三:程序破解
程序破解 查看 运行 反汇编,查看汇编码 对反汇编代码进行分析: 在main函数的汇编代码中可以看出程序在调用"scanf"函数请求输入之后,对 [esp+0x1c] 和 [esp ...
- Linux实践三:程序破解
一.汇编指令机器码 二.反汇编与十六进制编程器 三.可执行文件的基本格式 hexdump -x login 用16进制数字显示login内容 objdump -x login 显示login中各个段以 ...
- 20135302魏静静——linux课程第三周实验及总结
linux课程第三周实验及总结 一.实验:跟踪分析Linux内核的启动过程 使用gdb跟踪调试内核从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxKer ...
- Linux课题实践三——程序破解
2.3 程序破解 20135318 刘浩晨 1. 掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即“空指令”.执行到NOP指令时,CPU什么也不做,仅仅当做一 ...
- 信息安全系统设计基础课程实践:简单TUI游戏设计
简单TUI游戏设计 目 录 一 Curses库简介与基本开发方法 ...
- Linux课程实践一:Linux基础实践(SSH)
一.SSH服务 1. 安装SSH (1)查看是否已经安装过ssh服务 rpm -qa |grep ssh (2)进行安装 sudo apt-get install openssh-server Ubu ...
- Linux课程实践一:Linux基础实践(基础操作)
一.软件源维护 1. 基本操作 (1)查看源列表 sudo vim /etc/apt/sources.list deb:二进制软件安装包 deb-src:源码包 (2)备份软件源列表 sudo cp ...
- linux实践——简单程序破解
一.运行login可执行程序,屏幕显示需要输入密码,随便输入一串字符,结果是Drop dead! 二.objdump -d login,对login进行反汇编,找到main函数,找到含有scanf的那 ...
- Linux多线程实践(9) --简单线程池的设计与实现
线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以 ...
随机推荐
- React组件的分类
* 1.statelessComponent 不包含任何state的组件 例如:AntDesign的 :Button,Input组件 * 2.viewComponent 包含少量ui state的组件 ...
- Object.defineproperty实现数据和视图的联动
Object.defineproperty语法 var o = {}; // 创建一个新对象 // Example of an object property added with definePro ...
- C#程序实现动态调用DLL的研究(转)
摘 要:在<csdn开发高手>2004年第03期中的<化功大法——将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资 ...
- JAVA编程规范(下)
JAVA编程规范(下) 2016-03-27 6. 代码的格式化 6.1 对代码进行格式化时,要达到的目的 1. 通过代码分割成功能块和便于理解的代码段,使代码更容易阅读和理解: 2. ...
- echo同时输出到多个文件中
echo "test"| tee -a file1 file2 如果想去掉在屏幕上的显示 echo "test"| tee -a file1 file2 > ...
- Google Authenticator
Google Authenticator 现在越来越多的网站采用两步验证,实现方式可能有所区别,一般来说是 1+? (1 即 普通的用户名和密码, ?可能是实物如U盾.手机短信验证码或其他).?的重点 ...
- QTP操作txt文档
QTP可以在txt文件(文本文件中读取数据) 首先创造一个文档对象 set fso = createObject("scripting.filesystemobject") 然后用 ...
- JS-获取URL请求参数
前言:原来做过一个项目,需要实现一个页面打印的功能,由于项目中使用了AngularJS+Bootstrap等前端框架,需要打印的页面又在弹出框中,使用了Bootstrap的模态框后发现打印的效果不太好 ...
- MongoDB(七)MongoDb数据结构
首先,向数据库插入一条bjson数据 首先是定义文档,然后使用admin用户名密码登录,进入test数据库,向test数据库中插入此文档("表名称和表中的记录") 插入结果,查看m ...
- Ninject之旅之一:理解DI
摘要: DI(IoC)是当前软件架构设计中比较时髦的技术.DI(IoC)可以使代码耦合性更低,更容易维护,更容易测试.现在有很多开源的依赖反转的框架,Ninject是其中一个轻量级开源的.net DI ...