【HUST】网络攻防实践|6_物联网设备固件安全实验|flag2~5速通指南
写在最前:最近没空写报告,实验原理虽然已经摸清了但是没空写。flag2到4是一些大胆的想法的通关方式,flag5是正经通关的。之后写报告的时候会补发正经的实验原理,和flag2到4正常的通关方式。
记得修改学号。
安装Keil
安装破解过程:
-
安装
Keil5
:一路Next
就行,名称邮箱全部任意填,安装驱动什么的一律选是,安装路径最好不要包含中文,或者直接默认。 -
破解
Keil5
:以管理员权限打开刚刚安装的Keil5
,关掉弹出来的让安装包的窗口,然后点击File-License Management
,复制CID
到破解软件中。破解软件填写CID
、设置Target
为ARM
之后,点击Generate
生成LIC
,粘贴到Keil5
的LIC
输入框中。点击Add LIC
就行。(日期过期没事) -
安装
ARM CMSDK_CM4_FP
:老师发的Keil5
默认是没有我们要的ARM CMSDK_CM4_FP
。不过老师还发了两个.pack
文件,双击安装就行。一路Next
,安装路径要和Keil5的安装目录相对应。
新建项目并添加文件:
Project-New uVersion Project
,然后配置直接按实验指导书就行,后面也直接按指导书。添加文件可以直接拖进去。编译就是Project-build
。
注意:如果之前装过其他版本的
Keil
,并新建了项目,记得删掉项目目录中的Listings、Objects、RTE
,否则它会自动优先从这些目录下读取配置,版本就不对。
如果你配置项完全正确,和指导书完全一致,就直接0 Error。有错误就自行检查。
然后就会生成在Objects/
下,运行如下指令运行:
~/qemu-7.0.0/build/qemu-system-arm -M mps2-an386 -cpu cortex-m4 -m 16M -nographic -d in_asm,nochain -kernel ~/exp6/task2/task2.axf -D log.txt
注意:任务2和3都要用架构mps2-an386
。
flag2和3
添加头文件的麻烦,贴个硬编码的,不用加头文件:
volatile unsigned int * pCTRL=(volatile unsigned int *)0xE000ED94;
*pCTRL=4;
0xE000ED94
就是MPU的CTRL地址。
CTRL赋值为4
就是关MPU。
还有种方法,改RNR,直接切换MPU让原来用的那块作废。
老师就只是更新了一点点内容,假如用的是最新版lib:
先加头文件:#include "CMSDK_CM4_FP.h"
,:
for(int i=0;i<8;i++){
MPU->RNR=i;
MPU->RASR&=0xFFFFFFFE;
}
MPU->CTRL=5;
与运算之后,MPU的末位是0,代表使MPU禁用。而当MPU全部被禁用时,作为特权级任务,这个Task就不受区域的限制了。在《权威指南》11章有说。
特权级的默认背景区域就是全部。
flag4
在StartFreeRTOS(id, vTask3);
上方添加这一行:
xTaskCreate( vTask3, "Test3", 100, NULL, ( 1 | ( 0x80000000UL ) ), NULL );
这时候,就有人要问了~为什么这一行能行呢?
之前我试成功的时候也没想到能行,后来写报告的时候看了一下流程就懂了。
先创建任务并放到任务序列里,再调用StartFreeRTOS。StartFreeRTOS的过程是先创建权限较低的vTask3任务,并在创建过程中完成对学号id的处理。在启动任务序列的时候,也有一部分对id的处理。但是!这些对id的处理,全部都在启动任务序列之前。因此,只要提前在任务序列中添加特权级的任务,并调用打印函数,即可完成打印。
ps:任务序列是并行执行的,第二个约束任务会挂掉。挂了就挂了,第一个已经打印了flag了。
老师要是想解决我这个绕过方式,就需要在启动任务序列之后,对id再进行一些变化,并延缓打印flag的速度。或者添加约束任务成功结束或返回后,才能打印flag的限制条件。
修改vTask3:
注意0x000029A9
改为你的axf反汇编的vTaskRemove
(也就是输出flag的函数)的地址加1。
注意:修改后编译的axf的函数地址会发生变化,先随便填一个,然后再逆向找这个函数的地址。
flag5
先逆向,看下你自己的栈空间和各种函数的地址。具体分析就和实验一一模一样的。
我的HelperBuffer大小是12,对应仨寄存器r1,r2,r3。类似的,如果你的大小是8,就对应俩寄存器。具体原因其实看ida的反汇编的最后一条pop指令就行,加3就是3个,加2就是2个。
xPortRaisePrivilege
(提权函数)地址是000086E2
。
但从这开始不行,因为它会先push,把push的作为返回值,所以要跳过push这一条指令,从000086E4
进。
vTaskDelayBackup
(输出flag的函数)地址是00001C7C
。
输入学号。
长度24(是r1,r2,r3,pc+r4,pc)。
输入地址(记得加1):
(分别对应function的r1,r2,r3,pc、提权函数的r4,pc)
4个0 4个0 4个0 e5 86 0 0 4个0 7d 1c 0 0
log.txt里找Function和提权函数,看它pop后的情况就行。
先跳转提权:
再跳转flag函数:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix