Martin Rozariyo
Back to writeups

CTF_Writeups

Digital Transition - Writeup

2026/0xfun/Hardware/DigitalTransition/writeup.md

Digital Transition - Writeup

Challenge Description

We were given a raw signal capture from an HDMI display adapter: signal.bin. The hint mentioned it contained a single digitized frame from a 640x480 HDMI output.

Step-1 Analysis

First, I analyzed the file size:

ls -l signal.bin
# 1680216 bytes

A standard 640x480 HDMI signal often includes blanking intervals, resulting in a total frame size of 800x525 pixels. Calculated size: 800 * 525 * 4 bytes/pixel (RGBA) = 1,680,000 bytes. The file size (1,680,216) is slightly larger than the raw data, suggesting a small header or footer. 1680216 - 1680000 = 216 bytes.

Using xxd, I saw a header and some metadata. The raw pixel data likely starts after this header.

Step-2

I wrote a Python script to extract the raw pixel data and save it as an image. I assumed a standard 32-bit RGBA format.

solve.py

import struct
from PIL import Image
 
def solve():
    with open('signal.bin', 'rb') as f:
        data = f.read()
 
    # Dimensions for 640x480 with blanking
    width = 800
    height = 525
    bpp = 4 # RGBA
    
    # Calculate offset
    expected_data_size = width * height * bpp
    total_size = len(data)
    header_size = total_size - expected_data_size # 216 bytes
 
    # Extract pixel data
    pixel_data = data[header_size:]
    
    # Create image
    img = Image.frombuffer('RGBA', (width, height), pixel_data, 'raw', 'RGBA', 0, 1)
    img.save('frame.png')
    print("Saved frame.png")
 
if __name__ == "__main__":
    solve()

Step-3 Image Analysis

Running the script generated frame.png. Opening this image in a steganalysis tool like StegSolve (or simply viewing the color planes) reveals the hidden flag clearly in the noisy active area.

frame

Then I used stegsolve to find the flag.

image

I found the flag in the alpha plane 4.

Flag

0xfun{TMDS_D3C0DED_LIKE_A_PR0}