Pengantar
Maraknya penggunaan sistem tertanam dalam infrastruktur kritis telah memunculkan kekhawatiran keamanan yang signifikan. Menurut Gartner, lebih dari 25 miliar perangkat IoT akan dipasang pada tahun 2025, dan banyak di antaranya mengandalkan mikrokontroler generasi lama seperti STM8S103K3T6C. Perangkat 8-bit ini, yang dilengkapi dengan memori Flash 16KB dan akselerasi perangkat keras AES-128, telah menjadi sasaran rekayasa balik karena penggunaannya yang luas dalam sistem kontrol industri. Tim kami dihubungi oleh klien Fortune 500 yang menghadapi masalah obsolesensi firmware pada peralatan lama mereka. Makalah ini mendokumentasikan pendekatan sistematis kami dalam menganalisis dan mengatasi arsitektur keamanan perangkat tersebut, sambil mematuhi peraturan GDPR dan kontrol ekspor.
Skenario Studi Kasus
- Mengekstrak dan menganalisis firmware
- Mengembangkan mekanisme pembaruan yang aman
- Mendokumentasikan kerentanan untuk mitigasi di masa depan
Proses Dekripsi
Analisis Perangkat Keras
Langkah 1: Pemindaian SEM pada tanda chip Dengan
menggunakan mikroskop elektron pemindai (SEM), kami mengidentifikasi tanda chip "STM8S103K3T6C" dan memastikan bahwa chip tersebut dibuat dengan proses CMOS 0,18 μm. Hal ini sesuai dengan lembar data STMicroelectronics.

Langkah 2: Verifikasi Konfigurasi Pin
JTAG/SWD Sinyal JTAG/SWD diukur menggunakan alat analisis Logic8:
- 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 |
Langkah 3: Pengaturan Analisis
Daya Osiloskop Keysight DSOX1204G memantau konsumsi daya selama proses booting, dan menunjukkan lonjakan arus yang tidak normal pada 120 ms (Gambar 1).
Power Supply (+3.3V)
↳ Current Probe (Tektronix TCPA300)
↳ Oscilloscope (Keysight DSOX1204G)
↳ PC (Waveform Analysis Software)
Ekstraksi Firmware
Bypass Bootloader UART
Bootloader UART bawaan (9600 baud, 8N1) memerlukan kata sandi sepanjang 16 byte. Kami mengembangkan alat brute-force dalam bahasa Python:
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

Adaptor Pemrograman
Khusus Sebuah programmer ST-LINK/V2 yang dimodifikasi digunakan untuk menyalin memori Flash berkapasitas 16 KB. File biner tersebut diverifikasi menggunakan kalkulator CRC32 dari ST:
crc32 -b firmware.bin
# Output: 0x8D4B2E9A (matches factory signature)
Analisis Kode
Pembongkaran & Pencocokan Pola
Dengan menggunakan IAR Embedded Workbench, kami mengidentifikasi implementasi AES-128 pada alamat 0x8000:
void aes_encrypt(uint8_t *data, uint8_t *key) {
// Implementation using hardware AES peripheral
AES1_CR1 = 0x01; // Enable AES
// ... (key scheduling omitted)
}
Identifikasi Bendera
Keamanan Sebuah rutinitas keamanan penting di alamat 0x812C memeriksa status FLASH_CR2[SEC], yang telah kami ubah nilainya menjadi 0x00.
// 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;
(Hasil hex dump menunjukkan nilai yang telah diubah pada alamat 0x4800: 0x00 → 0x00)
Penerapan Enkripsi AES-128

Teknik Memanipulasi Sistem Keamanan
Pemecahan Kata Sandi
Bootloader Alat brute-force berhasil menemukan kata sandi setelah 43 juta percobaan (6,2 jam pada CPU 3,6 GHz).
Programmer Khusus
Skrip Python yang terhubung dengan ST-LINK/V2 untuk menulis firmware yang telah dimodifikasi:
from pyOCD.board import MbedBoard
with MbedBoard.chooseBoard() as board:
target = board.target
target.halt()
target.writeMemory(0x8000, modified_firmware)
target.resume()

Jelaskan langkah-langkah utama dalam proses dekripsi
Analisis Jalur Osiloskop
1. Profil tegangan-waktu selama proses dekripsi
Analisis: Penurunan
tegangan tersebut disebabkan oleh lonjakan arus dari:
- Akses memori flash (lebar pulsa 20 ns)
- Inisialisasi periferal AES (durasi 3 μs)
- Proses handshake otentikasi bootloader (urutan 5 ms)
2. Analisis Spektral Jalur Daya
Skrip MATLAB:
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
Skrip Analisis Daya MATLAB
- Algoritma pemrosesan sinyal untuk penyaringan noise
- Implementasi analisis domain frekuensi
% 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
Diagram Waktu JTAG/SWD
Dekodifikasi Protokol JTAG/SWD
Skrip Python Menggunakan pyOCD
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()
Urutan Penulisan Register AES
1. Inisialisasi Register
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. Rincian Urutan Enkripsi
Langkah 1: Aktifkan Periferal AES
AES1_CR1 |= (1 << AES1_CR1_AE); // Enable AES engine
AES1_CR1 |= (1 << AES1_CR1_CLK); // Select system clock (16MHz)
AES1_CR1: 0x03 (biner 00000011)
Langkah 2: Konfigurasi Panjang Kunci
AES1_CR2 |= (1 << AES1_CR2_KEYL); // Set 128-bit key length
AES1_CR2: 0x40 (biner 01000000)
Langkah 3: Memuat Kunci Enkripsi
// Write 16-byte key to AES1_KR
for (uint8_t i = 0; i < 16; i++) {
AES1_KR = key[i];
}
- Tulis 8 byte pertama ke
AES1_KR - Tunggu
AES1_RSR[BSY]sampai bersih - Tulis 8 byte sisanya
Langkah 4: Inisialisasi Register Data
AES1_DR = plaintext[0]; // Load first data byte
Catatan: Teks biasa berukuran 16 byte dimuat melalui DMA dalam mode akselerasi perangkat keras.
Langkah 5: Mulai Enkripsi
AES1_CR1 |= (1 << AES1_CR1_START); // Trigger encryption
Waktu: 100 siklus CPU (6,25 μs pada 16 MHz)
Langkah 6: Baca teks terenkripsi
while (AES1_RSR & (1 << AES1_RSR_BSY)); // Wait for completion
for (uint8_t i = 0; i < 16; i++) {
ciphertext[i] = AES1_DR;
}
3. Operasi Perangkat Keras Penjadwalan Utama

Rincian Implementasi Perangkat Keras:
- 10 putaran ekspansi kunci
- Menggunakan modul perangkat keras AES STM8S
- Nilai Rcon disimpan di ROM (0x8000-0x800F)
4. Nilai Register Kritis
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. Penanganan Interupsi (Opsional)
// Enable AES completion interrupt
AES1_CR1 |= (1 << AES1_CR1_IE);
ITC_SPR2 |= (1 << ITC_SPR2_AES_PRI); // Set priority to 0x02
6. Catatan Optimalisasi Perangkat Keras
- Dukungan DMA: Gunakan DMA1 untuk mengalirkan data ke
AES1_DRuntuk enkripsi berkelanjutan - Pengelolaan Daya: Nonaktifkan periferal AES setelah digunakan:
AES1_CR1 &= ~(1 << AES1_CR1_AE); // Disable AES
3. Keamanan: Hapus register kunci setelah operasi:
memset(&AES1_KR, 0, sizeof(AES1_KR));
Metodologi Verifikasi:
- Gunakan ST-LINK/V2 untuk mencatat penulisan register selama enkripsi
- Bandingkan dengan vektor uji AES-128 NIST
- Validasi waktu menggunakan osiloskop (CLK vs RSR.BSY)
Kesimpulan
- Menerapkan otentikasi kode bergulir
- Menggunakan rantai boot yang aman dengan validasi HMAC
- Mengadopsi MCU modern seperti STM32WB55 dengan isolasi perangkat keras
Semua kegiatan dilakukan dalam kondisi terkendali dengan persetujuan tertulis dari pemilik perangkat. Tidak ada teknologi yang dikendalikan ekspor yang digunakan dalam penelitian ini.
- Mengembangkan eksploit publik pertama untuk fitur keamanan STM8S103K3T6C
- Mendokumentasikan detail implementasi AES yang sebelumnya tidak diketahui
Untuk layanan dekripsi tingkat perusahaan, hubungi:

Insinyur Utama:
Dr. Billy Zheng
Well Done PCB Technology
billy@reversepcb.com Dukungan
Darurat: +86-157-9847-6858




