← back to /home
GEMASTIK XIX: Reverse Printer & firmware.rom
GEMASTIK XIX • 2026-08-23 • Hardware / Firmware Reverse Engineering
#GEMASTIK19
#Firmware
#ROM
#Custom Arch
#Disassembly
WRITEUP REVERSE ENGINEERING: PRINTER_EMU & FIRMWARE.ROM
Overview Tantangan
- Target File:
printer_emu(ELF 64-bit Executable) &firmware.rom(Binary Data / Custom Firmware) - Kategori: Reverse Engineering / VM CTF Challenge
- Tujuan: Menemukan input key firmware yang valid dan mengekstrak Flag dari output cetakan emulator.
Step 1: Identification & Metadata Analysis
Langkah awal adalah memeriksa properti binary, keamanan, dan karakteristik file.
Perintah Terminal:
file printer_emu firmware.rom
readelf -h printer_emu
Hasil Data:
printer_emu: ELF 64-bit LSB executable, x86-64, statically linked, stripped. Entry point:0x402540.firmware.rom: Raw data file sebesar 931 byte.
Step 2: Static Reconnaissance & String Inspection
Memeriksa string bawaan dalam binary untuk memahami fungsionalitas umum program.
Perintah Terminal:
strings printer_emu | grep -i "printer"
hexdump -C firmware.rom | head -n 20
Hasil Data:
- Terdapat pesan keluaran:
[printer] halaman kosong — tidak ada yang tercetak. firmware.rommemuat byte instruksi kustom yang akan di-load oleh emulator ke memori VM.
Step 3: Entry Point & Main Function Recovery
Menelusuri _start di GDB untuk menemukan lokasi fungsi main.
Perintah Terminal:
gdb -batch -ex "x/20i 0x402540" printer_emu
gdb -batch -ex "disass 0x4016c0, 0x401800" printer_emu
Hasil Data:
- Fungsi
mainberada pada alamat0x4016c0. - Di dalam
main, program membaca filefirmware.romdan memasukkannya ke alamat memori VM0x4b0420. - Jika argumen
argv[2]diberikan, string tersebut di-copy ke buffer input VM di0x4ab2e0. - Terdapat instruksi Jump Table:
jmp QWORD PTR [rcx*8 + 0x47d110]. Ini menandakan arsitektur Virtual Machine (VM) Emulator.
Step 4: Virtual Machine Architecture Mapping
Melakukan inspection memori dan handler opcode untuk memetakan arsitektur VM 8-bit ini.
Perintah Terminal:
# Dump Opcode Jump Table di memori
gdb -batch -ex "x/98gx 0x47d110" printer_emu
# Inspeksi handler opcode penting
gdb -batch -ex "x/25i 0x4017d2" printer_emu # Opcode 0x11 (ADD)
gdb -batch -ex "x/25i 0x4019cd" printer_emu # Opcode 0x16 (CMP)
gdb -batch -ex "x/25i 0x401acc" printer_emu # Opcode 0x23 (XOR)
gdb -batch -ex "x/30i 0x402175" printer_emu # Opcode 0x60/0x61 (IN/OUT)
Pemetaan Arsitektur VM:
- Memory (RAM/ROM):
0x4b0420(64 KB) - Register Array:
0x4b0410(16 register 8-bit: ) - Program Counter (PC):
0x4b0408 - Stack Pointer (SP):
0x4b040a - Memory Pointer (ADDR_PTR):
0x4b040c - Flags:
FLAG_Z(0x4b0404),FLAG_C(0x4b0400) - I/O Ports:
- Port
0x20(IN): Membaca byte input dariargv[2] - Port
0x10(OUT): Menggambar 8-bit kolom piksel vertikal ke layar bitmap grid.
- Port
Step 5: Firmware Bytecode Disassembly & Analysis
Menginspeksi byte pada firmware.rom mulai dari offset 0x0041 hingga 0x0059 untuk memahami algoritma validasi key.
Hexdump Opcode Offset 0x0041:
0x0041: 20 02 5a 40 00 80 45 00 00 11 20 23 02 3f 40 a5 02 45 01 00 16 21 52 f5 00
Transkripsi Instruksi Assembly (VM):
0x0041: MOV R2, 0x5a ; Set nilai awal R2 = 90 (0x5a)
0x0044: ADDR_PTR = 0x8000 ; Arahkan ke buffer input user
0x0047: MOV R0, [ADDR_PTR + 0] ; Ambil Byte Input Pertama
0x004a: ADD R2, R0 ; R2 = R2 + Input
0x004c: XOR R2, 0x3f ; R2 = R2 XOR 0x3f
0x004f: ADDR_PTR = 0x02a5 ; Arahkan ke buffer target di ROM
0x0052: MOV R1, [ADDR_PTR + 0] ; Ambil Byte Target Pertama (0x81)
0x0055: CMP R2, R1 ; Bandingkan R2 dengan R1
0x0057: JNE 0x00f5 ; Lompat ke HALT jika tidak cocok
Step 6: Target Bytes Extraction & Key Calculation
Mengambil 8 byte target dari firmware.rom pada offset 0x02a5.
Perintah Terminal:
hexdump -s 0x02a5 -n 8 -C firmware.rom
Target Bytes: [0x81, 0xd1, 0x36, 0x5c, 0xb1, 0xde, 0x2f, 0x5a]
Formula Matematika (Hitung Mundur):
| Byte Index | Target Byte | Target XOR 0x3F | Karakter Hasil | |
|---|---|---|---|---|
| 1 | 0x81 | 190 (0xBE) | 90 (0x5A) | d (0x64) |
| 2 | 0xD1 | 238 (0xEE) | 129 (0x81) | m (0x6D) |
| 3 | 0x36 | 9 (0x09) | 209 (0xD1) | 8 (0x38) |
| 4 | 0x5C | 99 (0x63) | 54 (0x36) | - (0x2D) |
| 5 | 0xB1 | 206 (0xCE) | 92 (0x5C) | 2 (0x32) |
| 6 | 0xDE | 225 (0xE1) | 177 (0xB1) | 0 (0x30) |
| 7 | 0x2F | 16 (0x10) | 222 (0xDE) | 2 (0x32) |
| 8 | 0x5A | 101 (0x65) | 47 (0x2F) | 6 (0x36) |
Firmware Key Valid: dm8-2026
Step 7: Execution & Flag Extraction
Perintah Jalankan Terminal:
./printer_emu firmware.rom dm8-2026
Hasil Output Banner ASCII Art:
### ##### # # ### #### ##### #### # # # # ### ## ##### # # ## ### #### #### # # # ##### ##### #### #### #### ##### # # # #### #### ### ##### # # # ##### #### # # # ##
# # # ## ## # # # # # # # ## # # # # # # # # # # # # ## ## # # # # # # # # # ## # # # # # # # # ## ## ## # # # ## # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ## # # # # # # # # # # # # #
# ### #### # # # ##### ### # # ## # #### ## # ##### # # #### #### # # ## # # #### ### #### # # # ## ### # # # # # # # # # # # # #### # # ##
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##### # # # # # ## # # # # ##### # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
### ##### # # # # #### # #### # # # ### ## ## # # # # ## # # # ### # # # ### # # ##### #### # ### # # # #### ##### #### ### # ##### # # # # # # ### # # ##
Flag Resmi
GEMASTIK13{TH3_PR1NT3R_SP34KS_D0T_M4TR1X}