En tant qu'ingénieur en chef en rétro-ingénierie chez Well Done Technology, j'ai récemment mené une mission visant à décrypter les microcontrôleurs STM8S105K6 intégrés dans les capteurs d'infrastructures critiques. Cette étude de cas décrit notre approche technique pour contourner ses fonctionnalités de sécurité tout en préservant l'intégrité du système.
Introduction
Le STM8S105K6 (32 Ko de mémoire Flash, cœur 8 bits à 16 MHz) est un pilier des systèmes industriels traditionnels. Cependant, sa combinaison de protection en lecture (niveau 2) et de cryptage personnalisé a posé des obstacles importants lorsque notre client a été confronté à l'obsolescence imprévue de son réseau de capteurs. Ce document détaille notre méthodologie de décryptage réussie.
Spécifications de la puce et caractéristiques de sécurité
Paramètres clés
| Parameter | Value |
|---|---|
| Architecture | STM8S (8 - bit) |
| Memory | 32KB Flash / 2KB SRAM |
| ADC Resolution | 10 - bit |
| Security Levels | Read Protection (Level 2) |
| Encryption | Proprietary XOR Scheme |
Pins critiques pour l'attaque
| Pin Location | Pin Details |
|---|---|
| Left Side (Pins 1 - 20) | 1 - PC7 • 2 - PC8 • 3 - PC9 • 4 - PC10 • 5 - PC11 6 - BOOT1 • 7 - PH3 • 8 - PH2 • 9 - VDD • 10 - VSS 11 - PA0 • 12 - PA1 • 13 - PA2 • 14 - PC3 • 15 - PC2 16 - PC1 • 17 - PC0 • 18 - NRST • 19 - PH1 • 20 - PH0 |
Analyse de sécurité
Mécanismes de protection
// Protection configuration
FLASH->CR2 |= FLASH_CR2_LP; // Level 2 protection
FLASH->OPTR |= FLASH_OPTR_RDP; // Read protection enable
void encrypt_data(uint8_t *data, uint16_t len) {
uint8_t key = get_hardware_id();
for(int i = 0; i < len; i++) {
data[i] ^= key;
}
}
Stratégie de décryptage
Rétro-ingénierie logicielle
Analyse du vidage mémoire :
# Python script for XOR key detection
def find_xor_key(encrypted_data):
for key_candidate in range(256):
decrypted = bytes([b ^ key_candidate for b in encrypted_data])
if b'INIT' in decrypted:
return key_candidate
return None
Configuration de l'attaque matérielle
Paramètres de glitching de tension :
// Glitch generation code
void apply_glitch() {
DAC->DHR12R1 = 0x0000; // Initial voltage
delay_us(100);
DAC->DHR12R1 = 0x03FF; // Glitch voltage
delay_us(50);
DAC->DHR12R1 = 0x0000;
}
Étude de cas : Récupération d'un réseau de capteurs
Défi
- Système : plus de 500 capteurs environnementaux avec STM8S105K6
- Problème : fabricant – micrologiciel verrouillé empêchant les mises à jour de sécurité
- Objectif : récupérer les algorithmes d'étalonnage des capteurs
Exécution technique
Processus de récupération des clés :
Script de validation :
bool validate_calibration() {
uint16_t checksum = calculate_checksum(calibration_data);
return checksum == *(uint16_t*)(FLASH_BASE + 0x7FFE);
}
Stratégies d'atténuation
Sécurité renforcée
// Dual - key implementation
void secure_keygen() {
uint8_t temp = ADC1->DR;
uint16_t rtc = RTC->CNTH << 16 | RTC->CNTL;
session_key = crc16((uint8_t*)&rtc, sizeof(rtc)) ^ temp;
}
Améliorations des processus
- Authentification à deux facteurs pour les mises à jour du micrologiciel
- Brouillage de la mémoire pendant l'exécution
- Rotation dynamique des clés toutes les 24 heures
Conclusion

Ingénieur principal :
Dr Billy Zheng
Well Done PCB Technology
billy@reversepcb.com Assistance
d'urgence : +86-157-9847-6858




