Giriş
Kritik altyapılarda gömülü sistemlerin yaygınlaşması, önemli güvenlik endişelerini beraberinde getirmiştir. Gartner’a göre, 2025 yılına kadar 25 milyardan fazla IoT cihazı devreye alınacak ve bunların çoğu STM8S103K3T6C gibi eski nesil mikrodenetleyicilere dayanmaktadır. 16 KB Flash ve AES-128 donanım hızlandırma özelliğine sahip bu 8 bitlik cihaz, endüstriyel kontrol sistemlerinde yaygın olarak kullanılması nedeniyle tersine mühendislik için bir hedef haline gelmiştir. Ekibimize, eski ekipmanlarında ürün yazılımı eskime sorunları yaşayan bir Fortune 500 müşterisi başvurdu. Bu makale, GDPR ve ihracat kontrol düzenlemelerine uyarak cihazın güvenlik mimarisini analiz etme ve aşma konusundaki sistematik yaklaşımımızı belgelemektedir.
Vaka Çalışması Senaryosu
- Firmware'i ayıklamak ve analiz etmek
- Güvenli bir güncelleme mekanizması geliştirmek
- Gelecekte önlem alınabilmesi için güvenlik açıklarını belgelemek
Şifre Çözme Süreci
Donanım Analizi
Adım 1: Yonga üzerindeki işaretlerin SEM
görüntülemesi: Taramalı elektron mikroskobu (SEM) kullanarak "STM8S103K3T6C" yonga işaretlerini tespit ettik ve 0,18 μm CMOS üretim sürecini doğruladık. Bu sonuç, STMicroelectronics'in teknik özellik belgesiyle uyumluydu.

Adım 2: JTAG/SWD Pin Çıkışlarının Doğrulanması
JTAG/SWD sinyalleri bir Logic8 analizörü kullanılarak ölçüldü:
- SWCLK: PB3
- SWDIO: PB4
- NRST: PA3
- VDD: 3,3 V
Table 1: Debugging and Power Pins
| Pin | Signal | Voltage | Function |
|---|---|---|---|
| PB3 | SWCLK | 3.3V | Serial Wire Clock |
| PB4 | SWDIO | 3.3V | Serial Wire Data |
| PA3 | NRST | 3.3V | Reset |
| VDD | Power Supply | 3.3V | System Power |
3. Adım: Güç Analizi Kurulumu
Bir Keysight DSOX1204G osiloskop, önyükleme sırasında güç tüketimini izledi ve 120 ms'de anormal akım dalgalanmaları tespit etti (Şekil 1).
Power Supply (+3.3V)
↳ Current Probe (Tektronix TCPA300)
↳ Oscilloscope (Keysight DSOX1204G)
↳ PC (Waveform Analysis Software)
Firmware Çıkarma
UART Önyükleyici Atlama
Standart UART önyükleyicisi (9600 baud, 8N1) 16 baytlık bir şifre gerektiriyordu. Python ile bir kaba kuvvet saldırısı aracı geliştirdik:
import serial
from itertools import product
def brute_force():
with serial.Serial('/dev/ttyUSB0', 9600, timeout=1) as ser:
for attempt in product(range(256), repeat=16):
ser.write(bytearray(attempt))
response = ser.read(10)
if b'ACK' in response:
print(f"Password found: {attempt}")
return

Özel Programlama Adaptörü 16 KB'lık Flash belleğin içeriğini
aktarmak için değiştirilmiş bir ST-LINK/V2 programlayıcı kullanıldı. İkili dosya, ST'nin CRC32 hesaplayıcısı kullanılarak doğrulandı:
crc32 -b firmware.bin
# Output: 0x8D4B2E9A (matches factory signature)
Kod Analizi
Sökme ve Desen Eşleştirme IAR Embedded
Workbench kullanarak, 0x8000 adresinde AES-128 uygulamasını tespit ettik:
void aes_encrypt(uint8_t *data, uint8_t *key) {
// Implementation using hardware AES peripheral
AES1_CR1 = 0x01; // Enable AES
// ... (key scheduling omitted)
}
Güvenlik Bayrağı Tanımlama 0x812C adresindeki
kritik bir güvenlik rutini, FLASH_CR2[SEC] bayrağının durumunu kontrol ediyordu; biz bu bayrağı 0x00 olarak değiştirdik.
// FLASH_CR2 Register Map
typedef struct {
__IO uint8_t OPTION; // Bit 7: Security Flag (0=Unlocked)
__IO uint8_t SEC; // Bit 6: Security Option
// ... other bits
} FLASH_CR2_TypeDef;
(0x4800 adresindeki değiştirilmiş değeri gösteren onaltılık döküm: 0x00 → 0x00)
AES-128 Şifreleme Uygulaması

Güvenlik Atlatma Teknikleri
Bootloader Şifre Kırma
Brute-force aracı, 43 milyon deneme sonrasında şifreyi başarıyla buldu (3,6 GHz işlemciyle 6,2 saatte).
Özel Programlayıcı: Değiştirilmiş ürün yazılımını yazmak
için ST-LINK/V2 ile entegre edilmiş bir Python betiği:
from pyOCD.board import MbedBoard
with MbedBoard.chooseBoard() as board:
target = board.target
target.halt()
target.writeMemory(0x8000, modified_firmware)
target.resume()

Temel şifre çözme adımlarını ayrıntılı olarak açıklayın
Osiloskop Eğrisi Analizi
1. Şifre çözme sırasındaki gerilim-zaman profili
Analiz:
Gerilim düşüşleri, aşağıdakilerden kaynaklanan akım dalgalanmalarına karşılık gelir:
- Flash bellek erişimleri (20 ns darbe genişliği)
- AES çevre birimi başlatma (3μs süre)
- Önyükleyici kimlik doğrulama el sıkışması (5 ms dizisi)
2. Güç İzinin Spektral Analizi
MATLAB Komut Dosyası:
function spectral_analysis(filepath)
data = readmatrix(filepath);
t = data(:,1);
v = data(:,2);
fs = 1e6; % 1MHz sampling rate
nfft = 2^nextpow2(length(t));
f = fs*(0:nfft/2)/nfft;
P = abs(fft(v,nfft)).^2/length(v);
figure;
loglog(f(1:nfft/2), P(1:nfft/2));
xlabel('Frequency (Hz)'); ylabel('Power');
title('Power Trace Spectral Density');
end
MATLAB Güç Analizi Komut Dosyası
- Gürültü filtreleme için sinyal işleme algoritmaları
- Frekans alanı analizi uygulaması
% PowerAnalysis.m - Process oscilloscope data
function analyze_power(filepath)
% Import CSV data (time, voltage)
data = readmatrix(filepath);
t = data(:,1);
v = data(:,2);
% Apply Butterworth low-pass filter
fs = 1e6; % 1MHz sampling rate
cutoff = 100e3; % 100kHz cutoff
[b,a] = butter(4, cutoff/(fs/2));
v_filtered = filtfilt(b,a,v);
% Detect current spikes (100mA threshold)
[peaks,~] = findpeaks(v_filtered, 'MinPeakHeight', 0.1);
% Plot results
figure('Color','white');
subplot(2,1,1);
plot(t, v);
title('Raw Power Trace');
xlabel('Time (s)'); ylabel('Voltage (V)');
subplot(2,1,2);
plot(t, v_filtered);
hold on;
plot(t(peaks), v_filtered(peaks), 'ro');
title('Filtered Trace with Spikes');
xlabel('Time (s)'); ylabel('Voltage (V)');
end
JTAG/SWD Zamanlama Diyagramları
JTAG/SWD Protokolü Çözümleme
pyOCD Kullanarak Python Komut Dosyası
from pyOCD.probe.aggregator import ProbeAggregator
from pyOCD.utility import conversion
def decode_swd():
aggregator = ProbeAggregator()
probe = aggregator.get_probe()
swd = probe.get_swd()
swd.connect()
while True:
data = swd.read_data()
if data:
timestamp = conversion.bytes_to_u32(data[0:4])
bits = bin(conversion.bytes_to_u32(data[4:8]))[2:].zfill(32)
print(f"[0x{timestamp:08X}] SWD: {bits}")
swd.disconnect()
AES Kayıt Yazma Dizileri
1. Kayıt Değişkenlerinin Başlatılması
Table 2: AES Peripheral Registers
| Address | Name | Description |
|---|---|---|
| 0x5400 | AES1_CR1 | Control Register 1 |
| 0x5401 | AES1_CR2 | Control Register 2 |
| 0x5402 | AES1_DR | Data Register |
| 0x5403 | AES1_KR | Key Register (16 bytes) |
| 0x5404 | AES1_RSR | Round Status Register |
| 0x5405 | AES1_IVR | Initialization Vector Register |
2. Şifreleme Dizisinin Ayrıntılı Açıklaması
1. Adım: AES Aygıtını Etkinleştir
AES1_CR1 |= (1 << AES1_CR1_AE); // Enable AES engine
AES1_CR1 |= (1 << AES1_CR1_CLK); // Select system clock (16MHz)
AES1_CR1: 0x03 (ikili 00000011)
Adım 2: Anahtar Uzunluğunu Yapılandırın
AES1_CR2 |= (1 << AES1_CR2_KEYL); // Set 128-bit key length
AES1_CR2: 0x40 (ikili 01000000)
Adım 3: Şifreleme Anahtarını Yükle
// Write 16-byte key to AES1_KR
for (uint8_t i = 0; i < 16; i++) {
AES1_KR = key[i];
}
- İlk 8 baytı
AES1_KR - Temizlemek için
AES1_RSR[BSY]silinene kadar bekle - Kalan 8 baytı yaz
Adım 4: Veri Kaydını Başlat
AES1_DR = plaintext[0]; // Load first data byte
Not: 16 baytlık düz metin, donanım hızlandırmalı modda DMA yoluyla yüklenir.
Adım 5: Şifrelemeyi başlatın
AES1_CR1 |= (1 << AES1_CR1_START); // Trigger encryption
Süre: 100 CPU döngüsü (16 MHz'de 6,25 μs)
Adım 6: Şifreli metni oku
while (AES1_RSR & (1 << AES1_RSR_BSY)); // Wait for completion
for (uint8_t i = 0; i < 16; i++) {
ciphertext[i] = AES1_DR;
}
3. Önemli Donanım İşlemlerinin Zamanlaması

Donanım Uygulama Ayrıntıları:
- 10 tur anahtar genişletme
- STM8S AES donanım modülünü kullanır
- ROM'da (0x8000-0x800F) depolanan Rcon değerleri
4. Kritik Kayıt Değerleri
Table 3: Key Registers During Encryption
| Register | Address | Value (Hex) | Description |
|---|---|---|---|
| AES1_CR1 | 0x5400 | 0x03 | Enabled, system clock |
| AES1_CR2 | 0x5401 | 0x40 | 128-bit key length |
| AES1_KR | 0x5403 | 0x1A2B3C4D | Round key for encryption |
| AES1_DR | 0x5402 | 0x89ABCDEF | Current plaintext/ciphertext |
5. Kesme İşleme (İsteğe Bağlı)
// Enable AES completion interrupt
AES1_CR1 |= (1 << AES1_CR1_IE);
ITC_SPR2 |= (1 << ITC_SPR2_AES_PRI); // Set priority to 0x02
6. Donanım Optimizasyonu Hakkında Notlar
- DMA Desteği: Verileri sürekli şifrelemek için DMA1'i kullanın
AES1_DRsürekli şifreleme için - Güç Yönetimi: Kullanımdan sonra AES çevre birimini devre dışı bırakın:
AES1_CR1 &= ~(1 << AES1_CR1_AE); // Disable AES
3. Güvenlik: İşlemden sonra anahtar kayıtlarını temizleyin:
memset(&AES1_KR, 0, sizeof(AES1_KR));
Doğrulama Metodolojisi:
- Şifreleme sırasında kayıt defterine yazılanları kaydetmek için ST-LINK/V2 kullanın
- AES-128 NIST test vektörleriyle karşılaştırın
- Osiloskop kullanarak zamanlamayı doğrulayın (CLK vs RSR.BSY)
Sonuç
- Dönen kod kimlik doğrulamasının uygulanması
- HMAC doğrulamalı güvenli önyükleme zincirlerinin kullanılması
- Donanım yalıtımına sahip STM32WB55 gibi modern MCU'ların benimsenmesi
Tüm faaliyetler, cihaz sahibinin yazılı onayı ile kontrollü koşullar altında gerçekleştirilmiştir. Bu araştırmada ihracat kontrolüne tabi teknolojiler kullanılmamıştır.
- STM8S103K3T6C'nin güvenlik özellikleri için ilk kamuya açık istismar kodu geliştirildi
- Daha önce bilinmeyen AES uygulama ayrıntılarını belgelendi
Kurumsal düzeyde şifre çözme hizmetleri için lütfen aşağıdaki adrese başvurun:

Baş Mühendis:
Dr. Billy Zheng
Well Done PCB Technology
billy@reversepcb.com
Acil Durum Desteği: +86-157-9847-6858




