当前位置:网站首页>Stm32 Reverse Introduction to CTF Competition Interpretation
Stm32 Reverse Introduction to CTF Competition Interpretation
2022-07-04 23:08:00 【Hefei tiannian Security Laboratory】
Sécurité du firmware
Un.、Préface
Dossier d'étude de la journée
2.、Réapparition
1、SCTF 2020 Password Lock
Description du sujet
C'est unSTM32F103C8T6 MCUVerrouillage par mot de passe4Touches,Respectivement:1, 2, 3, 4. Correspondant séparémentGPIO_PA1, GPIO_PA2, GPIO_PA3, GPIO_PA4flag1Le format estSCTF{Mot de passe correct}Saisissez le mot de passe correct, Il passera par le port série(PA9–TX)Envoyerflag2
Comment résoudre le problème
L'annexe au titre donne un aperçuIntel hexDocumentation,Nous pouvons déterminer la disposition de la mémoire du programme et la correspondance entre le registre périphérique et la mémoire..La clé de l'inversion est de lire le Code du programme.,Ensuite, nous allons analyser ceci étape par étapehexDocumentation.
1. hexStructure du fichier
Intel hexLe format de fichier se compose de texte simple,Il contient des informations telles que l'adresse de chargement du programme et l'adresse d'entrée du programme.,La lecture de ces informations nous aide à localiser rapidement l'entrée de départ du programme au lieu deidaConfigurer.
Compris.Intel hexDocumentation
Nous pouvons utiliser l'éditeur de texte pour ouvrir la pièce jointe du sujet,Les principaux messages sont les suivants::
:020000040800F2 ... ... :04000005080000ED02 :00000001FF
L'adresse de chargement du programme est
0x08000000
L'adresse d'entrée du programme est
0x080000ED
Procédure
:00000001FF
FinLe reste est plein de données de fichiers
2、Disposition de la mémoire
Site Web pour trouver le Manuel des puces :https://www.alldatasheet.com/On peut y trouverSTM32F103C8T6
Manuel, La première page contient quelques informations dont nous avons besoin
Flash memory:32-to-128 Kbytes
SRAM:6-to-20 Kbytes
31PageMemory Map Peut nous donner un aperçu plus intuitif de la disposition détaillée de la mémoire
En résumé, nous obtenons des informations complètes sur la disposition de la mémoire du programme :
Flash Memory: 0x8000000 ~ 0x801FFFF (128K)
SRAM: 0x20000000 ~ 0x20004FFF (20K)
Peripherals: 0x40000000 ~ 0x40023400
【---- Aide à l'apprentissage en ligne , Tous les documents d'étude suivants sont reçus gratuitement !Plusweix:yj009991,Remarques“ csdn ”Accès!】
① Carte mentale du chemin de croissance de l'apprentissage en ligne
② 60+ Kit d'outils classiques pour la sécurité du réseau
③ 100+SRCRapport d'analyse de vulnérabilité
④ 150+ E - Book of net security attack and Defense Practical Battle Technology
⑤ Autorité suprêmeCISSP Guide d'examen de certification+Banque de questions
⑥ Super.1800(En milliers de dollars des États - Unis)CTF Manuel des techniques de combat
3、IDAAnalyse
Après l'analyse précédente, nous avons appris la disposition de la mémoire du programme ,Parmi euxFlash Le segment contient le Code , Et la table des vecteurs d'interruption .Periphers Le Registre dans le segment est que nous avons besoin d'une compréhension générale de l'alignement dans le processus inverse .Et pourhex Analyse des fichiers nous avons appris qu'en plus des adresses de chargement et d'entrée , Tout le reste n'est pas là hexDans le document, Donc nous devons configurer manuellement ces informations de mise en page de mémoire pour dire IDAComment reconnaître. Ouvre.idaOutils, D'après le manuel, la puce est arm32 Armv7-MArchitecture, Faites une sélection de configuration comme indiqué ci - dessous et cliquez sur ok
Vous pouvez voir qu'une partie de la fonction a été reconnue ,Parmi euxstart L'adresse de la fonction et nous analysons hex L'adresse d'entrée du programme trouvée lors de la structure du fichier est la même .
Sihex Aucune information sur l'adresse d'entrée n'est donnée dans le fichier. Nous pouvons également trouver RESET Interrompre le gestionnaire pour déterminer la fonction d'entrée du programme .Parmi euxRESET L'adresse de la fonction d'interruption peut être STM32Manuel de référence chinoisV10.pdf Pour plus d'informations
RÉFÉRENCES STM32 Emplacement de la table vectorielle d'interruption 、Redirection Nous pouvons voir que dans la table des vecteurs d'interruption RESETAdresse0x8000004
L'adresse est fixe , Et la variable est l'adresse de chargement du programme .On a sauté à0x8000004
À cette adresse,Appuyez sur le clavierD La clé divise les données ci - dessus en 4 Octets trouvés resetL'adresse de0x8000101
Passer àRESETGestionnaire d'interruption, Il y a deux sauts . Premier saut vers nullsub_1 Vers le haut et placer l'adresse de l'instruction suivante dans LRRegistres,nullsub_1 Le but de la fonction est de revenir en arrière LRAdresse dans le registre, Donc le premier saut n'a aucun sens . Le deuxième saut est à nous startAdresse, Il est donc tout à fait possible de localiser l'adresse d'entrée du programme de cette façon .
Suivez l'adresse d'entrée pour trouver ce programme mainOù se trouve la fonction, Mais à l'intérieur, vous pouvez trouver cette grande marque rouge sur la gauche , Regarder ces zones rouges est en fait IDA Aucune adresse reconnue , C'est - à - dire le segment de mémoire que nous avons dû ajouter avant d'analyser la disposition de la mémoire .
On est là.IDANouveauSegment,Comme le montre la figure ci - dessous:
En ce moment, tant qu'on clique à nouveau F5 Ces marques rouges peuvent être transformées en mémoire d'identification normale
4、 Réparer la table des vecteurs d'interruption
UtiliserIDApython Récupérer les informations avant l'adresse d'entrée du programme
for i in range(0x8000000,0x80000eb,1): del_items(i) for i in range(0x8000000,0x80000eb,4): create_dword(i)
Une fois la réparation terminée, nous observerons l'adresse à l'intérieur , Il y a beaucoup d'adresses en double 0x800016D
, Il n'y a pas de fonction définie dans ces adresses . Si vous continuez à regarder la table des vecteurs d'interruption, vous trouverez les adresses de mémoire suivantes
RÉFÉRENCES STM32Manuel de référence chinoisV10.pdf Ce qu'on peut trouver, c'est que EXTI Adresse du gestionnaire d'interruption pour
stm32-EXTI
Suivez ces adresses de fonctions et vous verrez IDA Il n'est pas reconnu comme une fonction , Donc, on va d'abord appuyer à l'adresse de départ de la fonction PClé, Ces gestionnaires d'interruption sont ensuite démontés pour voir ,Ici, jeEXTI_4 Par exemple, les fonctions de gestion d'interruption pour .
int EXTI_4() { int result; // r0 EXTI_LINE = 16; switch ( sum ) { case 1: unk_20000006 = 116; return sum++ + 1; case 2: unk_20000010 = 95; return sum++ + 1; case 4: unk_2000000E = unk_20000001; return sum++ + 1; default: result = 0; sum = 0; break; } return result; }
Le programme a d'abord réglé l'interruption /Ligne d'événements,EXTI_4Interruption de/ La ligne de l'événement est 0x10, Et ensuite utiliser un morceau de mémoire (C'est écrit ici.sum) Pour enregistrer le nombre cumulatif .On peut voir quandsumLa valeur dans est1、2、4HeuresumLa valeur de+1, Sinon, ça recommence .Pour qu'on puisse juger1、2、4C'estEXTI_4 Nombre de chiffres apparaissant dans le mot de passe , De même que les trois autres boutons , Grâce à ces séquences, nous pouvons obtenir le résultat final flagPourflag{1442413}
, Et nous pouvons le trouver dans main Dans la fonction, le programme a d'abord simulé l'entrée d'un mot de passe , En comparant les valeurs ci - dessus avec EXTI_LINE La correspondance donne aussi flagValeur.
2、2021 HWS Entrée au camp -STM32
Après l'introduction à la question précédente, nous passons à la question suivante pour nous entraîner ,Ouvre.IDA Sélection du type de segment arm32,Sélection du schémaARMv7-MArchitecture.
Ensuite, définissez l'adresse de chargement et l'adresse de lecture du programme à 0x8000000
, L'adresse de chargement est IDA Quelle est l'adresse d'analyse chargée ,EtInput File Est l'endroit où le firmware doit être chargé , Après le réglage, on clique sur OKConfiguration complète.
Vous trouverez IDA Aucune fonction reconnue , Ne vous inquiétez pas, on peut localiser reset Pour trouver mainPosition de la fonction.Oui.0x8000004
L'octet à l'adresse devient 4Octets,Je l'ai.reset Adresse du gestionnaire d'interruption 0x8000101
.
L'adresse se termine par un chiffre impair ,Inarm Ça représente thumbMode.Nous pouvons0x8000101
Adresse pressée C Clé pour générer le Code
Suivez le flux du programme et nous trouverons main Position de la fonction sub_80003C0
, Et j'ai trouvé une fonction qui devait être inversée sub_8000314
_BYTE *sub_8000314() { _BYTE *v0; // r4 char *v1; // r5 int v2; // r6 char v3; // t1 v0 = (_BYTE *)sub_80003F0(48); v1 = &byte_8000344; v2 = 0; while ( v2++ != 0 ) { v3 = *v1++; *v0++ = (v3 ^ 0x1E) + 3; sub_8000124(v1); } return v0; }
Écrivez un script de résolution de problèmes pour obtenir flagValeur
li = [0x7D, 0x77, 0x40, 0x7A, 0x66, 0x30, 0x2A, 0x2F, 0x28, 0x40, 0x7E, 0x30, 0x33, 0x34, 0x2C, 0x2E, 0x2B, 0x28, 0x34, 0x30, 0x30, 0x7C, 0x41, 0x34, 0x28, 0x33, 0x7E, 0x30, 0x34, 0x33, 0x33, 0x30, 0x7E, 0x2F, 0x31, 0x2A, 0x41, 0x7F, 0x2F, 0x28, 0x2E, 0x64] print(''.join(chr((i ^ 0x1E) + 3) for i in li))
边栏推荐
- Servlet服务器端和客户端中文输出乱码问题
- 【ODX Studio編輯PDX】-0.2-如何對比Compare兩個PDX/ODX文件
- mamp下缺少pcntl扩展的解决办法,Fatal error: Call to undefined function pcntl_signal()
- Redis getting started complete tutorial: publish and subscribe
- 【图论】拓扑排序
- Photoshop batch adds different numbers to different pictures
- qt绘制网络拓补图(连接数据库,递归函数,无限绘制,可拖动节点)
- A complete tutorial for getting started with redis: hyperloglog
- 图片懒加载的原理
- 刷题指南-public
猜你喜欢
Redis入门完整教程:GEO
Redis getting started complete tutorial: Key Management
S32 Design Studio for ARM 2.2 快速入门
[graph theory] topological sorting
Redis入门完整教程:发布订阅
【机器学习】手写数字识别
A complete tutorial for getting started with redis: getting to know redis for the first time
debug和release的区别
一次edu证书站的挖掘
cout/cerr/clog的区别
随机推荐
Redis getting started complete tutorial: publish and subscribe
Excel 快捷键-随时补充
Attack and defense world misc advanced area can_ has_ stdio?
Redis getting started complete tutorial: hash description
qt绘制网络拓补图(连接数据库,递归函数,无限绘制,可拖动节点)
Feature scaling normalization
The solution to the lack of pcntl extension under MAMP, fatal error: call to undefined function pcntl_ signal()
Three stage operations in the attack and defense drill of the blue team
UML diagram memory skills
【ODX Studio编辑PDX】-0.3-如何删除/修改Variant变体中继承的(Inherited)元素
图片懒加载的原理
高通WLAN框架学习(30)-- 支持双STA的组件
Basic use and upgrade of Android native database
A complete tutorial for getting started with redis: understanding and using APIs
SPH中的粒子初始排列问题(两张图解决)
The small program vant tab component solves the problem of too much text and incomplete display
One of the commonly used technical indicators, reading boll Bollinger line indicators
Servlet服务器端和客户端中文输出乱码问题
【ODX Studio编辑PDX】-0.2-如何对比Compare两个PDX/ODX文件
Redis:Redis的事务