~/tiramisaks
← 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.rom memuat 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 main berada pada alamat 0x4016c0.
  • Di dalam main, program membaca file firmware.rom dan memasukkannya ke alamat memori VM 0x4b0420.
  • Jika argumen argv[2] diberikan, string tersebut di-copy ke buffer input VM di 0x4ab2e0.
  • 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: R0R15R_0 \dots R_{15})
  • 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 dari argv[2]
    • Port 0x10 (OUT): Menggambar 8-bit kolom piksel vertikal ke layar 320×64320 \times 64 bitmap grid.

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):

Input[i]=((Target[i]0x3F)R2_lama)(mod256)\text{Input}[i] = ((\text{Target}[i] \oplus 0\text{x3F}) - R_{2\text{\_lama}}) \pmod{256}

Byte IndexTarget ByteTarget XOR 0x3FR2_lamaR_{2\text{\_lama}}Karakter Hasil
10x81190 (0xBE)90 (0x5A)d (0x64)
20xD1238 (0xEE)129 (0x81)m (0x6D)
30x369 (0x09)209 (0xD1)8 (0x38)
40x5C99 (0x63)54 (0x36)- (0x2D)
50xB1206 (0xCE)92 (0x5C)2 (0x32)
60xDE225 (0xE1)177 (0xB1)0 (0x30)
70x2F16 (0x10)222 (0xDE)2 (0x32)
80x5A101 (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}