In qualità di lead reverse engineer presso Well Done Technology, ho recentemente guidato una missione per decrittare i microcontrollori STM8S105K6 integrati in sensori di infrastrutture critiche. Questo case study delinea il nostro approccio tecnico per aggirare le sue funzionalità di sicurezza mantenendo l’integrità del sistema.
Introduzione
L’STM8S105K6 (32KB Flash, 16MHz 8 – bit core) è un cavallo di battaglia nei sistemi industriali legacy. Tuttavia, la sua combinazione di protezione in lettura (Livello 2) e crittografia personalizzata ha posto ostacoli significativi quando il nostro cliente si è trovato di fronte all’obsolescenza imprevista della sua rete di sensori. Questo documento illustra in dettaglio la nostra metodologia di decrittazione di successo.
Specifiche del chip e funzionalità di sicurezza
Parametri chiave
| 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 |
Pin critici per l'attacco
| 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 |
Analisi della sicurezza
Meccanismi di protezione
// 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;
}
}
Strategia di decrittazione
Reverse engineering del software
Analisi dello scarico di memoria:
# 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
Configurazione dell'attacco hardware
Parametri di glitching della tensione:
// 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;
}
Case Study: Recupero della rete di sensori
Sfida
- Sistema: 500+ sensori ambientali con STM8S105K6
- Problema: Firmware bloccato dal produttore che impedisce gli aggiornamenti di sicurezza
- Obiettivo: Recuperare gli algoritmi di calibrazione dei sensori
Esecuzione tecnica
Flusso di recupero della chiave:
Script di convalida:
bool validate_calibration() {
uint16_t checksum = calculate_checksum(calibration_data);
return checksum == *(uint16_t*)(FLASH_BASE + 0x7FFE);
}
Strategie di mitigazione
Sicurezza avanzata
// 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;
}
Miglioramenti del processo
- Autenticazione a due fattori per gli aggiornamenti del firmware
- Scrambling della memoria durante l’esecuzione
- Rotazione dinamica della chiave ogni 24 ore
Conclusione

Ingegnere principale:
Dr. Billy Zheng
Well Done PCB Technology
billy@reversepcb.com
Supporto di emergenza: +86-157-9847-6858




