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

这篇具有很好参考价值的文章主要介绍了STM32在CTF中的应用和快速解题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

主要还是以做题为目的

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

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

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

IDA分析设置

1、基础设置

STM32主要信息:

内核:ARM32位Cortex-M3 CPU

ARM Little-endian

Cortex-M架构属于ARMv7-M

 

IDA32位打开

​​​

ARM little-endian

点击ok之后进入

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

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

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

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

【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】

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

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

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

得到了RESET的地址:0x80004D1

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

按下 "G" 键进行跳转

然后神奇的一幕发生了

自动识别了很多函数

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

分析函数 :sub_8000260

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

Flash Memory: 0x8000000 ~ 0x801FFFF (128K)

SRAM: 0x20000000 ~ 0x20004FFF (20K)

Peripherals: 0x40000000 ~ 0x40023400

2、添加段-SRAM

​​

单片机内存被总分为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) 存放程序动态执行时的变量

​​

‍3、添加段-Peripherals

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

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

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")

可以看到均已恢复

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

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

官方图:

5、恢复符号

bindiff来恢复符号表

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

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

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

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

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

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

‍6、恢复外设

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

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

打开之后如下:

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

下载链接是这个:

stm32-svd-main.zip

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

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

‍7、解题

基本上做完上面的操作后

STM32就能看了

进入main函数

继续分析

​​

题目说的是要找key

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

因此写出解密脚本

先转换一下

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 29
​
int 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

更多网安技能的在线实操练习,请点击这里>>

  文章来源地址https://www.toymoban.com/news/detail-759960.html

到了这里,关于STM32在CTF中的应用和快速解题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络安全ctf学习资源/解题工具整理,解题工具,推荐收藏!

    对于想学习或者参加CTF比赛的朋友来说,CTF工具、练习靶场必不可少,今天给大家分享自己收藏的CTF资源,希望能对各位有所帮助。 CTF在线工具 首先给大家推荐我自己常用的3个CTF在线工具网站,内容齐全,收藏备用。 1、CTF在线工具箱:http://ctf.ssleye.com/ 包含CTF比赛中常用的

    2024年02月10日
    浏览(42)
  • 【WinDbg】学习以及在CTF中解题

    WinDbg是一款Windows强大的调试器,可以调试0和3环的程序。 在实际开发中,可以调试我们的错误程序,从而定位关键代码,进行程序代码修复。 WinDbg 是一种调试器工具,由微软公司开发,用于分析和调试 Windows 操作系统和应用程序。它提供了强大的调试功能,可以帮助开发人

    2024年02月04日
    浏览(45)
  • 数字取证学习之内存取证CTF解题实例

    之前做了几道偏向取证的CTF题目,特此分享下,对于内存取证学习有一定的帮助 volatility2: 一款开源的内存取证框架工具,能够对导出的内存文件进行取证分析 Github开源地址:https://github.com/volatilityfoundation/volatility TA在KALI的低版本有自带 高版本移除了需要自己单独安装 安装

    2023年04月23日
    浏览(57)
  • CTF-[Web] MD5解题思路

    写在前面:最近练习了一些CTF中关于md5绕过的题目,总结了几种思路,本质没有太大变化,就是各种组合绕过,也是比较考察基础的,前段时间太摆烂了,好久没有更新了,革命尚未成功,同志仍需努力!!!   md5是一种信息摘要算法(目标是用于证明原文的 完整性 ),其

    2024年02月13日
    浏览(46)
  • 物联网毕设 STM32题目项目汇总 - 100例

    🥇 更新单片机嵌入式选题后,不少学弟学妹催学长更新STM32和C51选题系列,感谢大家的认可,来啦! 以下是学长亲手整理的STM32相关的毕业设计选题,都是经过学长精心审核的题目,适合作为毕设,难度不高,工作量达标,对毕设有任何疑问都可以问学长哦! 学长整理的题

    2024年02月04日
    浏览(46)
  • 记录一次CTF解题PHP反序列化

    序列化通俗来讲就是将对象转化为可以存储、传输的字符串,反序列化就是把那串字符串再变回对象。 例如: 这里序列化结果中的O就是object对象的意思,数字7代表着对象的函数名长度为7,然后就是对象名\\\"chybate\\\",然后这个数字 1表示对象有一个变量,大括号里的s代表的是

    2024年04月22日
    浏览(32)
  • [CTF/网络安全]攻防世界 easyupload 解题详析

    题目描述:一名合格的黑客眼中,所有的上传点都是开发者留下的后门 惯例,上传一句话木马 回显如下: 也就是说文件被过滤 抓包改后缀,.php1~.php9、.htaccess均被过滤(.htaccess 文件是一个用于配置 Apache Web 服务器的配置文件。它通常位于网站根目录或特定目录中,用来为该

    2024年02月08日
    浏览(59)
  • [CTF/网络安全] 攻防世界 backup 解题详析

    题目描述:X老师忘记删除备份文件,他派小宁同学去把备份文件找出来,一起来帮小宁同学吧! PHP 脚本文件的备份文件名,通常采用以下命名方式: 在原始文件名后添加日期时间戳。例如,如果要备份名为 index.php 的文件,则可以将其备份文件命名为 index_20230521_004017.php。这

    2024年02月05日
    浏览(66)
  • [CTF/网络安全] 攻防世界 cookie 解题详析

    题目描述:X老师告诉小宁他在cookie里放了些东西,小宁疑惑地想:这是夹心饼干的意思吗? 根据提示,获取页面Cookie中的数据即可 页面提示 look here:cookie.php ,于是GET /cookie.php : 提示 查看HTTP响应 method 1 HTTP响应通常可以在浏览器的开发者工具中找到。 按下F12键打开浏览器

    2024年02月05日
    浏览(46)
  • 网络安全ctf比赛/学习资源整理,解题工具、比赛时间、解题思路、实战靶场、学习路线,推荐收藏!...

       对于想学习或者参加CTF比赛的朋友来说,CTF工具、练习靶场必不可少,今天给大家分享自己收藏的CTF资源,希望能对各位有所帮助。 CTF在线工具 首先给大家推荐我自己常用的3个CTF在线工具网站,内容齐全,收藏备用。 1、CTF在线工具箱:http://ctf.ssleye.com/    包含CTF比赛

    2023年04月24日
    浏览(92)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包