В качестве ведущего инженера-реверс-инженера в Well Done Technology я недавно возглавил миссию по дешифрованию микроконтроллеров STM8S105K6, встроенных в датчики критически важной инфраструктуры. В этом примере из практики описывается наш технический подход к обходу функций безопасности с сохранением целостности системы.
Введение
STM8S105K6 (32 КБ флэш-памяти, 8-разрядное ядро с тактовой частотой 16 МГц) является рабочей лошадкой в устаревших промышленных системах. Однако сочетание защиты от чтения (уровень 2) и настраиваемого шифрования создало значительные препятствия, когда наш клиент столкнулся с незапланированным устареванием своей сенсорной сети. В этом документе подробно описана наша успешная методология дешифрования.
Характеристики чипа и функции безопасности
Ключевые параметры
| 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 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 |
Анализ безопасности
Механизмы защиты
// 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;
}
}
Стратегия дешифрования
Обратное проектирование программного обеспечения
Анализ дампа памяти:
# 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
Настройка аппаратной атаки
Параметры глюков напряжения:
// 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;
}
Пример из практики: восстановление сенсорной сети
Вызов
- Система: более 500 датчиков окружающей среды с STM8S105K6
- Проблема: Производитель — заблокированная прошивка, препятствующая обновлению безопасности
- Цель: восстановление алгоритмов калибровки датчиков
Техническое исполнение
Основные этапы восстановления ключа:
Скрипт проверки:
bool validate_calibration() {
uint16_t checksum = calculate_checksum(calibration_data);
return checksum == *(uint16_t*)(FLASH_BASE + 0x7FFE);
}
Стратегии смягчения последствий
Повышенная безопасность
// 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;
}
Улучшение процессов
- Двухфакторная аутентификация для обновления прошивки
- Скремблирование памяти во время работы
- Динамическая ротация ключей каждые 24 часа
Заключение

Главный инженер:
д-р Билли Чжэн
Well Done PCB Technology
billy@reversepcb.com
Экстренная поддержка: +86-157-9847-6858




