# 基于密码访问的门锁系统
# 一、功能描述
本次实验选题为基于密码访问的门锁系统,类似于现代智能家居中的智能门锁。在本次实验中,我实现了通过键盘输入密码,若正确开启门锁(电机),若错误给出提示;并通过LED显示提示语以及密码输入的结果;还可以通过连续敲击特殊键,输入正确密码和新密码实现密码的更改。
# 二、设计方案
为了达到实验目标,在本次实验中我编写了两个程序:主程序 mylock 以及监控程序 lock_guard,接下来分开介绍两个程序的设计方案。
### mylock 程序
使用了双线程,其中主线程负责接受输入以及进行 hash 校验等,led 线程负责控制led输出相应的提示语及结果。
主线程的主要架构如下(mylock/main.c):
![](https://www.writebug.com/myres/static/uploads/2022/3/9/04ba43c88299ce3e57c3e8b87803f1bc.writebug)
### lock_guard 监控程序
功能有检查 mylock 程序的完整性,软件看门狗,检查密钥文件使用次数。(lock_guard/main.c)
![](https://www.writebug.com/myres/static/uploads/2022/3/9/9ba8511931c0219fc8fabb839346f5b7.writebug)
# 三、安全设计描述
接下来从抗干扰设计、容错设计、抗攻击设计三个方面来介绍安全设计描述:
### 抗干扰设计
#### 复位
因为本次实验的选题为基于密码访问的门锁系统,结合现实情况考虑,采取了软件复位,没有使用人工复位。
软件复位在lock_guard/main.c main函数中实现,复位分为两种:mylock 进程重启、整个系统重启。
当看门狗缓冲区达到 WCD_RESTART_TIME 次未发生变化时,lock_guard 将重新启动mylock进程;当连续重启mylock进程MAX_TIME_RESTART_FAIL次仍未成功时,lock_guard将记录日志并重新启动系统。
![](https://www.writebug.com/myres/static/uploads/2022/3/9/0c14761ead24432baf5ee607380688ae.writebug)
#### 睡眠避干扰
当检测到一定时间键盘没有按键按下时,mylock 将进入到睡眠模式,LED 也进入 sleep 模式,节能并延长 LED 的寿命。
相关代码在 mylock/main.c 中实现:
![](https://www.writebug.com/myres/static/uploads/2022/3/9/b25da342cd1a2f2adc2a3d4cdf5814f6.writebug)
#### 指令冗余及软件陷阱捕获程序
由于 arm 指令集是定长指令集,所有机器指令向一个 Word(4Byte)对齐,EIP 即使跑飞,其末两位也只能为 0。
为了减少 EIP 跑飞后的影响,我在函数与函数之间留了一定间隔并使用 NOP+CALL error_handel() 异常处理函数来进行填充。由于目前生成的 ELF 达到 3MB+,故只选取了几个函数的间隔进行填充。
填充的方式是使用一个较长的无用函数在两个目标函数之间占位,编译成可执行文件后再使用脚本进行 Patch。
接下来使用 mylock/main_misc.c 中 checkpwd()与 markdown_newpassword() 中间的函数间隙进行举例说明。三个函数的位置如下所示:
![](https://www.writebug.com/myres/static/uploads/2022/3/9/00217e9ec4dbd982d2d04fc8147ae442.writebug)
Nop_call_1()占位函数使用相同的指令进行填充(为了在编译后生成相同的机器码,方便 Patch),在最后加上一条 call 异常处理函数(因为 call 使用间接寻址,让编译器帮助我们找到异常处理函数的相对地址无疑更加方便)。
![](https://www.writebug.com/myres/static/uploads/2022/3/9/0c19edba595f662670a43017574b05eb.writebug)
在 IDA 中查看生成未剥离符号表的可执行文件:可以看到我们的填充指令具有相同的格式,我们就可以依此把这些指令的机器码都更改为 movs r0,r0(00 00
等价于 NOP。
**据此,编写出用来 patch 的 python 脚本(嵌入式-Patch_nop+call.py):**
![](https://www.writebug.com/myres/static/uploads/2022/3/9/6ec91faa2dd7dcd485c3c5f8f628055a.writebug)
**查看 patch 后的可执行文件**
![](https://www.writebug.com/myres/static/uploads/2022/3/9/4ea6c60fc97bf34a091ad467ca779853.writebug)
这样实现了函数间隙软件陷阱捕获。
#### 看门狗及运行监视程序
**在本次实验中,lock_guard 具有软件看门狗的功能,在 lock_guard 中进行看门狗缓冲区的检验,在 mylock 中每次循环时,更改看门狗缓冲区的内容。**
下图为Lock_guard ,下下张图为mylock
![](https://www.writebug.com/myres/static/uploads/2022/3/9/599ed35f22b7812f11c5ee0945ce4a57.writebug)![](https://www.writebug.com/myres/static/uploads/2022/3/9/e4dddce05738d091d5f550d8f9158157.writebug)
#### 冷热启动及初始化
由于在对于密钥文件具有较为完善的修复机制使用时也有检查机制保障,使得在系统运行的任何时候断电或进程被 kill 掉,都不会有太大的影响。不过我还是将写密钥及其备份文件当作“原子操作”(只是在设置了文件标志位,但并不能保证其不被打断),在写文件前设置标志,写完文件后清除标志。并在 mylock 初始化时对标志进行检查,若标志存在,则对密钥文件进行恢复。
Mylock/mylock_init.c 中在 mylock 进行初始化时进行检查标志。
![](https://www.writebug.com/myres/static/uploads/2022/3/9/23c480e4baddb7b265b7698704c00fb8.writebug)
#### 数据备份
以磁盘上储存的 keyfile 及其备份文件,以及 mylock 可执行文件及其备份文件举例说明。
- Keyfile 在每次读之前都会进行与其备份文件的对比并修复其中发生错误的文件,在 mylock/file_check/file_cmp.c 中实现。对比算法:程序进行对比并维护一个 f_num 大小的数组,数组用来记录与其内容相同的最先一个文件的编号,当相同数量超过 f_num/2 时,即认为此文件是正确的,并恢复其他不相同的文件。
- Mylock 在每次启动前,也会由 lock_guard 对 mylock 可执行文件进行检查,以避免其代码段或数据段发生错误而带来危害。
- Keyfile 及其备份储存的路径为 mylock/keyfile/
- Mylock 的备份位置在 bak1/, bak2/中。
因为本次实验是基于 linux 操作系统,linux 文件管理是基于 inode,若是自己在裸机上实现,数据备份应考虑在磁盘不同的位置进行存储,并保持较大的间隔。为了避免磁盘的一块内存区域损坏而导致全部的备份文件丢失。
#### 重要数据包含校验码
重要数据包括:刚输入进来的明文密码、经过 hash 后的密码、文件密钥、电机转速等。
明文密码、hash 密码、文件密钥的压码规则如下,以初始密码 123456 为例:
![](https://www.writebug.com/myres/static/uploads/2022/3/9/50271170ad17eccc365e3eb44659a5af.writebug)
**电机转速校验,位于启动电机前(motor/motorup.c):**
![](https://www.writebug.com/myres/static/uploads/2022/3/9/8fb05476e624920bb7e0dc389a4db8a2.writebug)
### 容错设计
#### 自检
检查程序源代码完整性的工作是在 lock_guard 中实现(lock_guard/main.c),在每次启动 mylock 前都会对 mylock 的 elf 文件进行完整性检验
![](https://www.writebug.com/myres/static/uploads/2022/3/9/2827f4d5dc27ca63f3276a255322a15f.writebug)
#### 参数输入容错设计
在输入时对缓冲区进行了限制,可以指定最长的密码长度,不会出现缓冲区溢出,(mylock/main.c)
![](https://www.writebug.com/myres/static/uploads/2022/3/9/1bfc99bbd62f7487c91e8c1e1d6e3400.writebug)
#### 输入界面的安全性设计
#### 状态转移的条件审核
设计的状态转换图如下所示:在进入相关状态时都会进行状态的检查:
![](https://www.writebug.com/myres/static/uploads/2022/3/9/36a5cc30efcd600f7a402be027d32fb9.writebug)
如在进入 motor_up 时:
![](https://www.writebug.com/myres/static/uploads/2022/3/9/0422c8d70d6b2d0f57b77231018afe5c.writebug)
在验收时经老师提醒,应使用状态转移序列�
甜辣uu
- 粉丝: 9484
- 资源: 1102
最新资源
- 学校办公系统文件起草审批项目资源.zip
- springboot585高校毕业生离校管理系统ttxcu.zip
- 第三方支付对接全能支付Java开发工具包优雅的轻量级支付模块集成支付对接支付整合微信支付宝银联友店富友跨境支付payp.zip
- ssm044基于java和mysql的多角色学生管理系统jsp.zip
- ssm056基于Java语言校园快递代取系统的设计与实现jsp.zip
- python爬虫开发与项目实战书籍配套源码和说明项目资源H.zip
- ssm505教师办公管理系统的设计与实现jsp.rar
- weixin270客运自助售票小程序的设计与实现ssm.rar
- The enterpriseready webhooks service 项目资源.zip
- ssm163神马物流vue.rar
- springboot572大学生助学贷款管理系统w659v--论文pf.zip
- 基于Java的开源内容管理系统Content Management System项目资源H.zip
- springboot教师考勤系统.zip
- 基于 Django 实现问答社区system项目资源.zip
- 基于Vue和SpringBoot的高校固定资产管理系统用于实现高校对固定资产的管理需求包含资产品类资产单位资产仓.zip
- python爬虫开发与项目实战书籍配套源码和说明项目资源.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈