STM32在CTF中的应用和快速解题

题目给的是bin文件,基本上就是需要我们手动修复的固件逆向。

如果给的是hex文件,我们可能需要使用MKD进行动态调试

主要还是以做题为目的

详细的可以去看文档:https://pdf1.alldatasheet.com/datasheet-pdf/view/201596/STMICROELECTRONICS/STM32F103C8T6.html

SVD文件下载:https://github.com/posborne/cmsis-svd

image

本文参考了网上多篇文章,最终汇总在一篇,对这道新的STM32题进行解题。

IDA分析设置

1、基础设置

STM32主要信息:

  • 内核:ARM32位Cortex-M3 CPU
  • ARM Little-endian
  • Cortex-M架构属于ARMv7-M

IDA32位打开

image​​​

ARM little-endian

image

image

点击ok之后进入

  • flash的映射地址是 0x08000000 ~ 0x0807ffff (512KB)

flash就是我们装代码的地方,也是STM32入口

image

下面这张图来自STM32中文参考手册

image

从这张表中,可以了解的信息是,在偏移4的位置存储的是RESET,并且是固定的。

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

Reset就是充电就会执行并进入的地方,因此将其当做固件入口

image

在IDA偏移为4的地方,按下“D”键进行转换

得到了RESET的地址:0x80004D1

可以看到为奇数,说明是thumb指令

按下 “G” 键进行跳转

image

然后神奇的一幕发生了

image

自动识别了很多函数

image

其实这没有固定的套路,我们跟踪跳转,一步一步的分析,最终会到达关键步骤

image

分析函数 :sub_8000260

image

发现爆红了,需要我们手动添加一些段

  • Flash Memory: 0x8000000 ~ 0x801FFFF (128K)
  • SRAM: 0x20000000 ~ 0x20004FFF (20K)
  • Peripherals: 0x40000000 ~ 0x40023400

2、添加段-SRAM

image​​

单片机内存被总分为flash(rom)和sram(ram),flash里面的数据掉电可保存,sram中的数据掉电就丢失,sram的执行速度要快于flash,flash容量大于sram

单片机的程序存储分为code(代码存储区)、RO-data(只读数据存储区)、RW-data(读写数据存储区) 和 ZI-data(零初始化数据区)
Flash 存储 code和RO-data
Sram 存储 RW-data 和ZI-data

所以,SRAM段需要我们自己添加

[0x20000000,0x2000ffff]
SRAM: 0x20000000 ~ 0x20004FFF (20K) 存放程序动态执行时的变量

image

image​​

3、添加段-Peripherals

Peripherals: 0x40000000 ~ 0x400234ff    #这里还是改为了0x400234ff 而不是 0x40023400 在实战中发现多有多余的爆红,因此范围扩大总没错
外设寄存器的映射地址,程序通过读写这些内存地址实现对外围设备的控制

Peripherals 段中包含了我们要了解的寄存器

image

4、恢复中断向量表

地址0x8000000​-0x80000eb​ 存储了中断向量表的相关信息

使用python脚本,主要功能是删除旧的分析,添加dword类型分析

for i in range(0x8000000,0x80000eb,1): del_items(i)
for i in range(0x8000000,0x80000eb,4): create_dword(i)
print("ok")

image

可以看到均已恢复

image

修复完成后,发现了很多重复的地址,比如:0x8000519 这些函数并没有定义

image

跳转过去,将其全部生成对应的函数,使用(P 键)

image

官方图:

image

5、恢复符号

bindiff来恢复符号表

如果有闲工夫或者是对stm32的开发非常上手,就可以自己写一个demo,尽可能多的使用到各种库函数,然后编译出一个axf文件。我这里的话,由于好久没有用stm32了,开发起来有些生疏,所以就不自己手写了,我选择捡现成的项目,编译出axf文件

可以多选几个例程,能涵盖更多的库函数,将这些axf文件用IDA打开,然后生成idb文件。然后在我们的目标bin文件中,使用bindiff加载idb文件。

image

网上随便找一个,下载axf文件

image

选择一个idb文件,然后会出现这样一个比较界面:

image

选取similarity大的函数导入到bin文件中

image

导入之后实际上就能恢复大部分的函数名了。

image

6、恢复外设

导入SVD文件,恢复外设结构

在IDA7.5以后,就自带SVD文件加载插件了,如下图:

image

打开之后如下:

我们可以自行下载相应的SVD文件,或者加载GitHub上的仓库,我这里选择自行下载然后在本地加载。

下载链接是这个:

stm32-svd-main.zip

image

选中想要加载的svd文件之后,IDA就会自动恢复bin文件中的外设结构,体现在伪代码中就是这样:

image

image

(在这题中好像没什么用)

2、解题

基本上做完上面的操作后

STM32就能看了

进入main函数

image

继续分析

image

image​​

题目说的是要找key

image

但是发现Key没有值。。。也就是说要么动调要么爆破,给了密文,就差了key

image

因此写出解密脚本

先转换一下

int main() {int  v19[8] = { 0 };v19[0] = 0xF4DD0F64;v19[1] = 0x5173B9F8;v19[2] = 0xC7D238B2;v19[3] = 0x9B9FCA8;v19[4] = 0x286D3C51;v19[5] = 0x429DE399;v19[6] = 0x8084307B;LOWORD(v19[7]) = 0x9175;for (size_t i = 0; i < 8; i++){for (size_t j = 0; j < 4; j++){printf("%02x ", (v19[i] >> 8 * j)&0xff);}}return 0;
}

写出解密脚本:

from itertools import product
from Crypto.Cipher import ARC4
xorkey ="flag{tH14.l4_F@kKkEeeE---f41g}"
enc = bytearray([0x64,0x0f,0xdd,0xf4,0xf8,0xb9,0x73,0x51,0xb2,0x38,0xd2,0xc7,0xa8,0xfc,0xb9,0x09,0x51,0x3c,0x6d,0x28,0x99,0xe3,0x9d,0x42,0x7b,0x30,0x84,0x80,0x75,0x91])
l = list(range(0x20,0x7f))
for k in product(l, repeat=4):key = bytearray(k)res = ARC4.new(key).decrypt(xorkey.encode())if res == enc:print('get')print(key)exit(0)

使用C语言爆破会更快

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>#include <openssl/arc4.h>#define XOR_KEY "flag{tH14.l4_F@kKkEeeE---f41g}"
#define ENC_SIZE 29int main() {uint8_t enc[ENC_SIZE] = {0x64, 0x0f, 0xdd, 0xf4, 0xf8, 0xb9, 0x73, 0x51, 0xb2, 0x38, 0xd2, 0xc7, 0xa8, 0xfc, 0xb9, 0x09, 0x51, 0x3c, 0x6d, 0x28, 0x99, 0xe3, 0x9d, 0x42, 0x7b, 0x30, 0x84, 0x80, 0x75, 0x91};int l[] = {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f};int l_size = sizeof(l) / sizeof(int);uint8_t key[4];uint8_t dec[ENC_SIZE];for (int i = 0; i < l_size; i++) {for (int j = 0; j < l_size; j++) {for (int k = 0; k < l_size; k++) {for (int m = 0; m < l_size; m++) {key[0] = l[i];key[1] = l[j];key[2] = l[k];key[3] = l[m];ARC4_CTX ctx;ARC4_set_key(&ctx, 4, key);ARC4(&ctx, ENC_SIZE, enc, dec);if (memcmp(dec, XOR_KEY, ENC_SIZE) == 0) {printf("get\n");printf("%c%c%c%c\n", key[0], key[1], key[2], key[3]);exit(0);}}}}}return 0;
}

爆破出秘钥:

d4@d

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/222968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五、Java核心数组篇

1.数组 概念&#xff1a; ​ 指的是一种容器&#xff0c;可以同来存储同种数据类型的多个值。 ​ 但是数组容器在存储数据的时候&#xff0c;需要结合隐式转换考虑。 比如&#xff1a; ​ 定义了一个int类型的数组。那么boolean。double类型的数据是不能存到这个数组中的&…

23.Java程序设计--基于SSM框架的移动端家庭客栈管理系统的设计与实现

第一章&#xff1a;引言 1.1 背景 客栈业务背景移动端应用需求增长趋势 1.2 研究动机 移动端管理系统的需求SSM框架的选择和优势 1.3 研究目的与意义 提高家庭客栈管理效率移动端解决方案的创新 第二章&#xff1a;相关技术和理论综述 2.1 SSM框架简介 Spring框架Spri…

swagger的ApiModelProperty设置字段的顺序

需求 让前端可以直接通过swagger就能知道各个字段是什么意思 如何配置 比如&#xff0c;我们设置了ApiModelProperty ApiModelProperty("用户主键")private Long userId;在swagger页面能直接看到注释 但是这个顺序是按照字母排序的&#xff0c;明显不符合我们的要…

在IDEA中使用Git 、远程仓库克隆工程到本地

4.1 在IDEA中配置Git 安装好IntelliJ IDEA后&#xff0c;如果Git安装在默认路径下&#xff0c;那么idea会自动找到git的位置&#xff0c;如果更改了Git的安装位置则需要手动配置下Git的路径。 选择File→Settings打开设置窗口&#xff0c;找到Version Control下的git选项&…

Java 基础学习(十)包装类、异常

1 包装类 1.1 包装类概述 1.1.1 什么是包装类 在进行类型转换时&#xff0c;有一种特殊的转换&#xff1a;将 int 这样的基本数据类型转换为对象&#xff0c;如下图所示&#xff1a; 所有基本类型都有一个与之对应的类&#xff0c;即包装类&#xff08;wrapper&#xff09;。…

机器学习--归一化处理

归一化 归一化的目的 归一化的一个目的是&#xff0c;使得梯度下降在不同维度 θ \theta θ 参数&#xff08;不同数量级&#xff09;上&#xff0c;可以步调一致协同的进行梯度下降。这就好比社会主义&#xff0c;一小部分人先富裕起来了&#xff0c;先富带后富&#xff0c…

微服务 Nacos服务注册与发现

一、Nacos 功能介绍 在微服务架构下&#xff0c;一个业务服务会被拆分成多个微服务&#xff0c;各个服务之间相互通信完成整体的功能。另外&#xff0c;为了避免单点故障&#xff0c;微服务都会采取集群方式的高可用部署&#xff0c;集群规模越大&#xff0c;性能也会越高&…

为什么需要分库分表,如何实现?

本文我们主要讲解“为什么需要分库分表&#xff0c;如何实现”。 在前文中讲到了读写分离&#xff0c;读写分离优化了互联网读多写少场景下的性能问题&#xff0c;考虑一个业务场景&#xff0c;如果读库的数据规模非常大&#xff0c;除了增加多个从库之外&#xff0c;还有其他…

WaitGroup并发控制原理及底层源码实现

WaitGroup并发控制原理及底层源码实现 1.1实现原理 1.2底层源码 type WaitGroup struct {noCopy noCopy// 64-bit value: high 32 bits are counter, low 32 bits are waiter count.// 64-bit atomic operations require 64-bit alignment, but 32-bit// compilers only guaran…

态势感知是什么?在网络安全中有什么作用

态势感知是一种基于环境的、动态的、全面的洞察安全风险的能力。它以安全大数据为基础&#xff0c;从全局的角度&#xff0c;提高对安全威胁的发现识别、理解分析和处理反应能力。目的在于在大规模网络环境下&#xff0c;对能够引起网络态势变化的安全要素进行获取、理解、显示…

L1-041:寻找250

题目描述 对方不想和你说话&#xff0c;并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。 输入格式&#xff1a; 输入在一行中给出不知道多少个绝对值不超过1000的整数&#xff0c;其中保证至少存在一个“250”。 输出格式&#xff1a; 在一行中…

程序员视角体验快速搭建智能客服中心

本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 目录 前言基本概念工作原理浅试体验体验收获最后 前言 Amazon Connect是亚马逊云科技…

2 - Electron 核心概念

Electron 核心概念 主进程 通过Node.js、Electron提供的API与系统底层打交道启动项目时运行的 main.js 脚本就是我们说的主进程。在主进程运行的脚本可以以创建 Web 页面的形式展示 GUI。主进程只有一个 渲染进程 每个 Electron 的页面都在运行着自己的进程&#xff0c;这样…

检查字符串是否以指定的字符串结尾str.endswith()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 检查字符串是否以指定的字符串结尾 str.endswith() [太阳]选择题 请问以下代码输出的结果是&#xff1f; s "I love China!" print("【执行】print(s.endswith(!))") p…

Redis设计与实现之双端链表

目录 一、Redis为什么选择双端链表作为底层数据结构&#xff1f; 二、双端链表 1、双端链表的应用 实现Redis的列表类型 Note: Redis列表使用两种数据结构作为底层实现&#xff1a; Redis自身功能的构建 2、双端链表的实现 ​编辑3、迭代器 三、双端链表在Redis中的应用…

亚信科技AntDB数据库——深入了解AntDB-M元数据锁的实现(二)

5.5 防止低优先级锁饥饿 AntDB-M按照优先级将锁又分了两类&#xff0c;用于解决低优先级锁饥饿问题。 ●独占型(hog): X, SNRW, SNW; 具有较强的不兼容性&#xff0c;优先级高&#xff0c;容易霸占锁&#xff0c;造成其他低优先级锁一直处于等待状态。 ●暗弱型(piglet): SW; …

加速数据采集:用OkHttp和Kotlin构建Amazon图片爬虫

引言 曾想过轻松获取亚马逊上的商品图片用于项目或研究吗&#xff1f;是否曾面对网络速度慢或被网站反爬虫机制拦截而无法完成数据采集任务&#xff1f;如果是&#xff0c;那么本文将为您介绍如何用OkHttp和Kotlin构建一个高效的Amazon图片爬虫解决方案。 背景介绍 亚马逊&a…

【MySQL】MySQL库的增删查改

文章目录 1.库的操作1.1创建数据库1.2创建数据库案例 2.字符集和校验规则2.1查看系统默认字符集以及校验规则2.2查看数据库支持的字符集2.3查看数据库支持的字符集校验规则2.4校验规则对数据库的影响 3.操纵数据库3.1查看数据库3.2显示创建语句3.3修改数据库3.4数据库删除3.5备…

KUKA机器人如何在程序中编辑等待时间?

KUKA机器人如何在程序中编辑等待时间&#xff1f; 如下图所示&#xff0c;如何实现在P1点和P2点之间等待设定的时间&#xff1f; 如下图所示&#xff0c;可以直接输入wait sec 2&#xff08;等待2秒&#xff09;&#xff0c; 如下图所示&#xff0c;再次选中该程序后&#…

python学习1

大家好&#xff0c;这里是七七&#xff0c;今天开始又新开一个专栏&#xff0c;Python学习。这次思考了些许&#xff0c;准备用例子来学习&#xff0c;而不是只通过一大堆道理和书本来学习了。啊对&#xff0c;这次是从0开始学习&#xff0c;因此大佬不用看本文了&#xff0c;小…