nullcon2023-chall-bmpass

AES-ECB bitmap encryption challenge for NullCon 2023 Berlin
git clone https://git.sinitax.com/sinitax/nullcon2023-chall-bmpass
Log | Files | Refs | sfeed.txt

recover.py (1440B)


      1#!/usr/bin/env python3
      2
      3from pyray import *
      4import struct
      5import sys
      6
      7img_enc = open(sys.argv[1], "rb").read()
      8
      9
     10blocksize = 16
     11
     12pix = img_enc[0x480:] # offset needs to be blocksize aligned
     13img_off = 0x0a
     14
     15print(len(pix) - img_off, 1920 * 1080)
     16
     17blocks = {}
     18for i in range(0, len(pix)-blocksize+1, blocksize):
     19    block = pix[i:i+blocksize]
     20    if block not in blocks:
     21        blocks[block] = []
     22    blocks[block].append(i)
     23blocks_items = [(k,len(v)) for k,v in blocks.items()]
     24blocks_sorted = sorted(blocks_items, key=lambda x: x[1], reverse=True)[8:]
     25blocks_top = {k:v for k,v in blocks_sorted}
     26
     27imgbuf = []
     28for i in range(0, len(pix)-blocksize+1, blocksize):
     29    block = pix[i:i+blocksize]
     30    if block not in blocks_top:
     31        imgbuf += [Color(255, 255, 255, 255)] * blocksize
     32    else:
     33        imgbuf += [Color(0, 0, 0, 255)] * blocksize
     34
     35width = 1920
     36init_window(1920, 1080, "bmpass")
     37while not window_should_close():
     38    while key := get_key_pressed():
     39        if key == KEY_LEFT:
     40            width -= 1
     41        elif key == KEY_RIGHT:
     42            width += 1
     43        elif key == KEY_UP and img_off > 0:
     44            img_off -= 1
     45        elif key == KEY_DOWN:
     46            img_off += 1
     47    begin_drawing()
     48    clear_background(GRAY)
     49    height = len(imgbuf) // width
     50    for y in range(height):
     51        for x in range(width):
     52            draw_pixel(x, height - 1 - y, imgbuf[img_off + y * width + x])
     53    end_drawing()
     54close_window()
     55