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 bytesA 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.
Then I used stegsolve to find the flag.
I found the flag in the alpha plane 4.
Flag
0xfun{TMDS_D3C0DED_LIKE_A_PR0}