Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ky28059/747618991296df76fa586bb2cf24d7ec to your computer and use it in GitHub Desktop.
Save ky28059/747618991296df76fa586bb2cf24d7ec to your computer and use it in GitHub Desktop.

PatriotCTF 2024 — Let's Play [steg]Hide & Seek

Not much of a backstory here... there is an embedded flag in here somewhere, your job is to find it.

We're given a "QR code mosaic" looking like this:

qr_mosaic

Plugging it into Aperi'Solve, we can extract a patriotCTF.bmp resembling the logo on their website:

image

image

From the original image, we can extract each 58x58 QR code in the 25x40 grid to generate 1000 individual images like so:

image image image image image image image

Ideally, we could just scan each QR code programmatically and concat them together to get something relating to the flag. However, due to the sometimes terrible color contrast within QR codes, not every QR code is scannable in its original palette.

Furthermore, each QR code has some sort of noise applied to it:

image

Thus, we can't do a simple algorithm of mapping the (0, 0) color to white and the (8, 8) color to black to retrieve a scannable QR code.

Neither can we do an algorithm that relies on static color thresholding with inRange:

bg_color = np.array(img[0, 0])
mask = cv2.inRange(img, bg_color - 10, bg_color + 10)

While the RGB or HSV thresholds can be adjusted so that the color variance of the noise generally falls within it, the same thresholds won't work for a low-contrast QR code where the color of the QR code itself falls within the threshold from the background color.

Instead, we can use the more robust method of Otsu's binarization.

As a final hitch, Otsu's binarization works on single-channel (grayscale) images; if we just tried to grayscale all the QR codes, though, QR codes where the background and foreground have almost the same brightness / saturation (and the only difference is their color) won't yield desireable results. As a hacky bandaid solution for this, though, we can try to run binarization on all 3 color channels of the image.

Here's a script that does just that,

import os
import re

import cv2
import numpy as np

qcd = cv2.QRCodeDetector()
arr = list(range(25 * 40))

cv2.namedWindow('img', cv2.WINDOW_NORMAL)


def binarize(img):
    # mask = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 55, 0)
    ret2, mask = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

    if mask[1, 1] == 0:
        mask = np.invert(mask)

    return mask


for file in os.listdir("./qr"):
    img = cv2.imread(f'./qr/{file}')
    b, g, r = cv2.split(img)

    mask = binarize(b)
    ret, _, _ = qcd.detectAndDecode(mask)

    if not ret:
        mask = binarize(g)
        ret, _, _ = qcd.detectAndDecode(mask)

    if not ret:
        mask = binarize(r)
        ret, _, _ = qcd.detectAndDecode(mask)

    if not ret:
        cv2.imshow('img', img)
        cv2.waitKey()

    i, j = re.fullmatch(r'(\d+)_(\d+).bmp', file).groups()

    print(f'{file} ({int(i) * 40 + int(j)}): {ret}')
    arr[int(i) * 40 + int(j)] = ret or f"{{{file}}}"

print(arr)
print(''.join(arr))

producing the following output:

0_0.bmp (0): C5Nre0R8Tau6T
0_1.bmp (1): 5ibKMsiQv6R1z
0_10.bmp (10): IrbdDdEzxJXuB
0_11.bmp (11): UJHUl6qoiOSiv
0_12.bmp (12): CrCYV1k7Tqmxk
0_13.bmp (13): 5LffsyU3EWH54
...
9_25.bmp (385): sqr9VnmDvvYOh
9_26.bmp (386): ZyogQWH1Lhxg0
9_27.bmp (387): QqWRrkjd0CWuF
9_28.bmp (388): o7IjnUkEXMB1n
9_29.bmp (389): 7OCllWHhZrQPw
9_3.bmp (363): a2I2qdYAwoled
9_30.bmp (390): zRHdVosstJbXM
9_31.bmp (391): bnpZiGgsJ3atp
9_32.bmp (392): N4nSM7rvfpwDX
9_33.bmp (393): mvu4JCnF2ivSK
9_34.bmp (394): drQDg1d5X5hZu
9_35.bmp (395): kyIXQBmEb7TFI
9_36.bmp (396): 44bs8hnymdncb
9_37.bmp (397): 58cqnkcofOrQw
9_38.bmp (398): ljfdYo2c7uVPl
9_39.bmp (399): IXyaGmwbRytcp
9_4.bmp (364): znXCurXSSmcJT
9_5.bmp (365): vrpF3q1OTbTHq
9_6.bmp (366): OYD0QCjE3JuKC
9_7.bmp (367): 12E0fw65DbNNh
9_8.bmp (368): VBIBSwEWt7Bkv
9_9.bmp (369): s7x5GBXOBEqs8
['C5Nre0R8Tau6T', '5ibKMsiQv6R1z', 'R6HFrITlh3JUI', 'lMIm8lqRAgiUx', 'VrI9S8bAxSoqv', 'oQ7CDhBvG0IED', 'BVKGnxJufK7Ql', '1NK9VTab5DR4s', 'BHsu3MqaGWDgV', '2KZrGPq4zMSEf', 'IrbdDdEzxJXuB', 'UJHUl6qoiOSiv', 'CrCYV1k7Tqmxk', '5LffsyU3EWH54', 'jzIfLFVGheyi3', 'zh7dqmzVwiyEC', 'H7kVSQbaWKba5', '7RHnujut4ggi9', 'tm5RLEa8Fh0uL', 'PfQ37DzyBrCkt', 'pf7L5DvncxSt2', 'wn63bIAVHk4VN', 'o1y66dkXNOxSQ', 'nlWsDsyejt5Cc', 'sX9vlDLhJjoSN', '67dnB7lh96adC', 'CpraQLTl6rWVM', 'w3KDA1mPvXS8J', 'HluNPGUW7qbLa', 'hiFuzUaOk7kbs', 'hB8wxojdRqbfn', 'LjkHdlcAkEP0v', 'cx7ixvSJRPWBn', 'AcrD1mhg66hEK', 'wZSjkMRE7f09H', 'zPMNpmw54o1jM', '6vBLIk9nPVXwd', '4H6JMPN9QisfC', '6iv5d3VVq7sbg', 'jIzXIbtVCTlmd', 'BVeclREVLIDFD', 'yIfZ0wrcyB7CN', 'Ese3ETBHInJlZ', '5UZjthMowT9iS', 'h9tztPb1Jecil', '8kyVCkZZPQXWx', 'JNZM1qgm0fn35', 'hFfVTHR1U76KS', 'UYGEwHQWHjxU1', 'aiAuKDxeEnJYX', '8RL7QkIsoGbtk', 'ovdJWCkhpuiBy', 'MDVHgNdAYUcGZ', 'Ckrb6O05k9mJn', 'Yiuejsu6n0vjd', 'P387EGCRwPTci', 'WWmNfBoQdttfJ', 'WxuikLDXbS9Xt', '0v4QdieXWQuev', 'auTmftByKDQfL', 'SR0P6hnc0khg2', 'zmTLvUFVJ5moK', 'vTaue4j5sQn68', 'ZCTPAonvbWlSk', 'jG9mtsp5UoD28', 'Ox9hCiMmEAjw7', 'oCpZeqdyiPHSP', 'bdevnIu17HypQ', 'j54UUqej2AtMI', 'LBj9MDM28hLLO', '6cQqsoXkproxy', 'l5ZFLnWxyTO25', 'OvykXyjEU8kXX', 'baKXWigLr2ffY', 'EXts8GrFGxCms', 'bjLSRsGipSoV2', 'wxj2EHmPErGn7', 'E781IGbCNNClj', 'UWd2qC668QKto', 'aF1PgqZxI0PsE', 'n51V3HCl75Ze8', '90dUrNV1naq1v', 'aO2zv1l46lPUh', '2HOCt4ghX5Lgb', 'Uc8sOWAtEnfCa', 'bkOEV2vTT9076', '0Kd5Oy0NLZVnU', 'XSAErYtG1q8NS', 'JnWz3Wo1a26hc', '05CSHGk1c2p64', 'bpes2n9Fz4dQ4', 'AmywKnCEPXqot', 'NxdOaOgR6KdpY', '1UddNOVCoP0rN', 'xW2AGjcPAXdxm', 'ahh3I7lxgytZq', 'RmacHxKoAItFE', '7TTP9lq40DR8B', 'ekCf6SI52rMkx', 'D0qEyNMGpA2Co', 'lBOauVIeKYYwL', '4gSlr7NtLy7jn', '6e8x5cGmZaLA7', 'gnn7TcUw3ROVl', 'tqADxZRoBoNxj', 'RifmNL45in6Bd', 'INt1zvQ8iL0sF', 'G9LtQoXJbCQYK', 'odC4TLHelKC8j', 'tDlspZ81esv2R', 'okm6AfauP2kbW', 'eZ8GvTfIlHQ5r', 'GE3xu6N8v81fH', 'LwN1sRrU2Bsir', 'A9fSrZ3MECuwK', 'AnDRRIyWYtnNu', 'bdp1BlNSTwhFr', 'onAbS10mU14AF', 'AkeZ1wnTLn3NL', 'sjX94gkvprh6K', 'nwfpgGV8rUKpW', 'MOlXpIbyIUoRN', '3ldczndXaz9fK', 'zyAH95KIABzHI', 'yimDExZBZbgMc', 'FtrGSEZnSfjCj', 'bR69xh0kZ8Qbp', 'MO68kPXMMem6R', 'wqQ1U3Ra8XlDk', 'adIh6L7hfnwOZ', 'T7VlStFcHW3LL', 'AXk3hfmMekDbZ', 'UoaL0EmEL9g5n', 'pkwryvmWypWiA', 'QPtD33eQJegwk', 'siohbTg1n3MYG', 'IFdkUVAWXimcf', 'DEmiIqez4Uon6', 'Gh4rTfrdeJBFE', '0JYLcjP2VxZav', 'PfWV7LtgIJdi8', 'nc2ldbYlkwrdj', 'zwFWTclWL9W9j', 'EkkuadaDvdJBt', 'BPzR0FUQXzEc0', 'OCrORRwe5LwQ6', 'qXT8ltSG0FYT8', 'NHluKghW5phL8', 'q97cdc9iF9H0h', 'KV98nfU0w23Zv', 'zfzKgMdq9o5xQ', 'McwgLV6GHiVsC', 'WBpVt6LTLX5ZJ', 'lfaqmKNsbcN3t', '200xXaBY9d2k5', '50KgePXDSl4xp', 'PPik5t811CE1d', 'kCusoO1JMzFTV', 'FuJO3soPZAAPE', 'x1jQBkyntSQk1', 'F04igUi3ynf1r', 'SHJvndDlFCSIG', 'YLbkaLnpawCip', 'XW1gnFIBs5C6j', 'ryicxRiFMNvrK', 's04BURUG04lFr', 'T8APeUcMkBZlY', 'nVCcFsLdHY6cn', '5A3SuCFieFBPZ', 'RLRwY5dJVbsUz', 'Ql9ENWRpyC2D2', 'zwZU0ws4kRRW2', '{4_12.bmp}', 'L54T4DPw0J9TL', 'rT68Muo4XWVHy', 'eaKTFDLokJouA', 'lEy492568EGyl', 'K1EKXwZWyVTbc', 'qDKGv2XvJiEFj', 'qHlw3zCwtD2v1', 'sawkUJLmnW2oQ', 'zb5RU4fhLneqc', 'wPFnkiWYCngAE', 'tvBqiNTCJctHM', '6NSl4yI6XUuXm', 'ejpn8Trzo2kWh', 'rcnPK0LgPYzJi', 'f1SpDUY6RXOp5', '3iPJn8joAXOeP', 'hWwoPY6uMfa8u', 'vcjis6ZvcdWBZ', '0sE2bXKInh2dO', 'nOYugYOiMfcSf', 'o27i0yuEk6kwc', 'VkM0Nb5bmH8fv', 'rRst5eyTQ6QJM', '1iSxonKTPpvPd', 'cWV8Cpg1dsERs', '9yNH8WmfYnqAY', 'ueIbGaoeHD1xb', 'bLQbsCaAuXLei', '2B8nhPt275YDj', '5rZJpznFrMS9s', 'q2xJI3EdxvPgq', 'SFjzbscEVCP3t', 'PDOdbxN8u35Az', 'nMmf9Z7XyJpXx', 'l7bEEGkYUzebF', 'J74Qe8ZEbCM6O', 'd2LxuNyKcy3c1', 'HZF7KunUa1Tc8', '4Rhe72fs03AYw', 'BenBzbM0HWqfH', 'c8uFmFIb306nA', 'mR2L38gbF5jO6', 'QQoi7yOisI1nv', 'jpg9g3sVoeSx4', '0JXABm37w2swM', 'FL0i3IFEY5Vnv', 'tk1mWJKywgYl3', '7GHYKLEjVYkDD', 'eLdLbaFOSXTR0', 'JJh3afHhRuSQ5', '5IxcI16bryYTb', 'tAdqJgiYHJkhN', 'M3ZQpA7PdYNcJ', 'zsB1RIdhLojXL', 'iha3OqPqOUkJw', 'IbSDx6CCyIRYa', 'VkqPiyOOeuDZN', 'NnsjYB16okhCr', 'qWWSAhEdhQH2t', 'cI9cmQs6i2IUA', 'wpyENCi0mKYTq', 'PUx4bvsirGONL', 'jnEF5sWt063aT', 'e4wv8b0QMLynu', '0VdfMMiq2WTwy', 'LP4Xu3GKD0Tu2', '2AHS2ipodiTQI', '2qjLMGMdh7Z7x', 'GoEcTaAF3Exy7', 'MKrb1iARwCraa', 'heRsZyzqMuXMG', 'GeFftzGyHf0b7', 'EFeQyshWlQXgn', 'aeXm9Uzb8SMKW', '46AIhYtAiKWEf', 'b0ezkcBQaoxzy', 'z2UvCh9m51nC4', 'YeV0irnwbsXxt', 'ZVJwACXxvbI2k', 'tYUmbeV4HORN5', 'm4Qqc0HA6676b', 'tkAnRbX7sr0lA', 'lrKSvDgkbXzXg', 'LcXSQrCWDmSI2', 'xJwtw277bUcFn', 'feQf855N9h4sd', 'E7s01auRlimCq', 'RwSA3GpLRxYhH', 'VcRQgu0yykuWP', 'FwcDx7d0HsFjO', '46vkk7C7VfwA3', 'PbChRWUeBXZCD', 'SlF3YfiC2FV9r', 'hOq7TU5cAlNcw', 'DI5mfWPKIcRWZ', 'LlGAA0liF5R3H', 'E1OEyiTsFNERB', 'j0jDIAH3JgDno', 'PGacHNABqZTLc', 'RNVMduXwg5ssz', 'uytRQIbGlBr9G', 'yveIH0MTorM19', 'PzdM7nPAKkQz4', 'loEVpnGhyZOLI', '8WE2vVGLO9Prx', 'O3OazKCQrFITZ', 'Q9jdGYiawZr5B', 'BbSRFL0pmcRdh', 'AEMBj1YD1tUCO', 'XCGikrDr9nsea', 'dAjjFSMaTwGx4', 'dASGxK3hAk1mP', 'zEpCnenDxKHp9', 'YSUnJklXbqw4u', 'ejKYuY56wyfbo', 'YVQdK0dtmcT4h', 'FTFhTmcIHmjmq', 'RxALwhTjVr0jl', 'JyFQRKLobrbou', 'YK2U4MDoQdU8K', 'd1G682Tkmmc51', 'kAkpPIw4Ga0TE', '9GtLDoWtmIrKT', 'MIj4tOkB0V9kO', '12n2ESWe4KChy', '1uXSnaxK51RuY', 'AE9IklDYlesI5', 'KRq7tvjGgMxld', 'wAC6wXmncM6Cb', '5jPsmQo0MG6FT', 'jo9a1B2eZIUX3', 'g8ZUKyUDpxHMf', 'UJitOQg7RR8RW', 'TRCUtKMTjOLH0', '5SaLSCWo1I4Qo', 'saXfAD0gtkcKy', 'IiTrxauOtH01T', 'K2sG1hFBYkqwa', 'dQEOEHrhF0z4G', 'd2HvzRGXPUHYt', 'RpfklpdhRzly8', 'SA2N2RMHH8xmY', 's88EhvofdXrii', '829w2p2dqmW4O', 'rrrM3Bo36zFOU', 'wzxVfSGmRk2Kz', '04DjhwZpebyyW', 'rxlhabmYwB3s7', 'x0wyEddcaga2d', 'hvtCcqvE2GuRq', 'Z0ulVli5UIBPL', 'Ne6JIVtjnD3Oy', 'ptBZaP9gbtbNm', '0dNqF8rP5DAoi', 'UZDPaUeMCq8XC', '{8_8.bmp}', 'lh1OzTkqIb1pR', '8ltDo5iiiuCic', 'cV0aXvrmWkAem', 'bqgdYZ9MPJLBX', 'ch8LtKu9H326p', 'RfQdNVtJFC3MY', '1Yep3ONfT7dxi', 'aM1gKaOQmCoD4', 'KKGzixvDDqLLa', 'jtdvMptKFZz7E', 'AM8XwsefErn8T', 'BnXyIZi3MsUHu', 'xqegc3Yc9hzRS', 'FJb6O7pObmWlT', 'uVnqA0BTPoJX2', 'VncqzWF7cjzDr', '1M9ahNNlwvXo9', 'jHKxbquL4QTuO', 'd5LlKEtgrEjiB', 'UQHq70QREyCBN', 'hZt267KXT2hm3', 'RtcBmlbd1xuUc', 'c6ZNSC4hq2Nq4', 'dw1VErqPQxp81', '3PMGMAaegvWIU', 'IACXvFhLYcDvi', 'DrMuxyGenQ0gJ', 'BJ5mtyA2hiiHP', 'eJRccmX3ACmlc', 'UvUC3dpYKlGhg', 'XqzbaS9Ar3wCA', 'vLKwj6acuBYD5', 'gqoBfOXDSNS5J', 'w6BwRhDq0TjOP', 'a2I2qdYAwoled', 'znXCurXSSmcJT', 'vrpF3q1OTbTHq', 'OYD0QCjE3JuKC', '12E0fw65DbNNh', 'VBIBSwEWt7Bkv', 's7x5GBXOBEqs8', '6Mi9ftniXWP0g', 'hCOyOtoT3NJqX', 'AuQCbEQaBmsjb', 'RvP03sIervSXe', 'bCjRpSspC0N2E', 'hRS6ImHjLky6q', 'CETF7ahFVQdfE', '88fFIWR0LN9wA', '27cSTjw21kHGr', 'sn1DICTKZuI0c', '7ceJEQnHCshCV', 'uD5elezfu93h5', 'Vqg8TDBxQOhwI', 'hLG1HTUBKZb57', 'vQAxkFJDjGDuB', 'sqr9VnmDvvYOh', 'ZyogQWH1Lhxg0', 'QqWRrkjd0CWuF', 'o7IjnUkEXMB1n', '7OCllWHhZrQPw', 'zRHdVosstJbXM', 'bnpZiGgsJ3atp', 'N4nSM7rvfpwDX', 'mvu4JCnF2ivSK', 'drQDg1d5X5hZu', 'kyIXQBmEb7TFI', '44bs8hnymdncb', '58cqnkcofOrQw', 'ljfdYo2c7uVPl', 'IXyaGmwbRytcp', 'QU18YCpTfJO47', '4GsSbvT1YxYuZ', '8W59b5QKC854X', '6uT2xOrixTO4j', 'RGz2xHYe4UEhm', '9smrzPChJI9aB', 'ntGihFgkjtLtx', 'ZwFO8qI9HB9uN', 'kBCjfCjqJ6YPW', 'D7yo5c6SaESt3', 'JbNiRkAoqQT3Y', 'QwDXVzr360BUp', 'b2pWT62WnckH9', 'UGw9qHbbUWMSb', 'luzLR5uG4cNEh', 'aPA3Cfl2Pkg0U', '1TF61C3LDHTCI', 'vZUkzt35UpVWA', 'alUEqvZ00RGVb', 'U9ycvA8IYGfB9', 'zs3SINoeCJPXH', 'hD72ifj7tE83n', 'JjmRPdIGE6l84', 'YEM3uIlfoOjxS', '5mETbspP3ey7y', 'bZG9msO5uOy8I', 'lJWEAzimx6gmN', 'DImEQSI5KM9hu', 'PAQnfmNeHeDpI', 'fbZD0DpqeIlZe', 'V5JjxZbhaa2Vf', 'AecvyAqIxAn7x', 'eZfZUcgf8O6jM', 'RiWcjDBzoefEv', '6tHBIpEwLna61', 'bC0rKFf85LQz4', 'w6YZq7v61hKfS', '2RZv45NB8I3RV', 'ISdIGwqhs0nyf', 'CtMxTtEiVtZnf', 'BL4MOiWof9DKO', '8Xm33CHg6H7nU', 'nr4JoW3q3Wjg7', 'kaWJ8ME9pzR6p', 'G5MW2cuTj5nqm', 'sgML5dOnevkr9', '32Yztoe9ywWnX', 'xUs1leA4EcoaG', 'upt2EHcNyCxJ8', '5yY4xOy1y6zXD', 'JqDy4MBXqPR86', 'aqSqRJYfvSTqH', 'nFwRI2O4KEgtH', 'j0JMUOzn5ethY', 'W5S72yqrvy9dm', 'xUzdkmQ99UlYZ', 'eYZ2HttrJPOb8', '72p6bUzCavosH', 'qmMdQbpTZYLWe', 'VKlfbVf43pMNR', 'BUPScDi9GDLwT', 'b7abvyAuQ4e4t', '12ov4KZKRVBCL', 'OrnLyA66RRkOA', 'Zkl44gALBOQva', 'Ew9bo2eHsU7It', 'MOt0OfrPrF5Ds', '9qs5BKZEbnSXk', 'ZJKxkx7O7JQCM', 'UsmX40y3QmMBJ', 'MU1QpCsR4hZuD', '13Fkqy4DCgOvf', 'rTfWfD3ESxFeQ', '5mVwcW3gV1zka', 'VrpzuTP9OfoBZ', 'P0a4sn8IioYwk', 'ZbJWuwaR8Gu0v', 'nO4fEBek6N4Oc', '2Hxbzho5D0IcU', '8OpJUYOqx5GHJ', 'yTKjuylfzOmLM', 'fzhICoS9MuGXv', 'tKTCmmHwSL6kA', 'cffJB5K1pNQkI', 'Xww0466NXJQR8', 'ePiSLrEd0Tgzg', 'u5DNp6I2KzBmA', 'UBDLi1d2I5zFe', 'ZfVBSIcSuH1gp', 'GfezPneF5qxXB', 'obuPHbcUi4GmK', 'tD3mXB3q8qK1g', 'Qn2yLaYfF4tSZ', 'df7jRqpSY61ZK', 'W2q98QtVydBkV', 'JUcrBuqWcN13C', 'vACMRPrFNUdw1', 'KpXi0JSWa5Rx9', 'Nvop6FS3Xf9Xm', '2BRy8EjEW8rl8', 'iVHLE42plG7ZU', 'i95wJ8lHN61yB', '4pZf2tQelYvIa', 'nXggssPqIED1o', 'CXIEUthi6FNwY', 'nWJv3rzbpr5JZ', 'ZHKy0ruM0RpgM', 'i6PvCHT7e94cz', 'ZqQhx4s0fa1K4', 'mwfDKoVfgHfW0', 'zJzS14qYDQ5kE', 'S4IM2vAw2WfFk', 'M0ORFvnODssEd', 'DzuTRLvfqIAUm', 'hb7cQS8ADUXDv', 'GpFJ4GpACLMfy', 'RQO8Fd4u3LMvZ', 'prw9wuW30Y4ea', 'd1VZNv98VHGzl', 'DLjBNaMxoMzog', 'VidBMke6qfwJE', 'RbffgAip0W9nl', 'ujQrqSibJ6bzJ', 'Fxl2TkLFeAXCH', 'MbJNdNKeMLhEO', 'sKqf9DavZnL87', 'C8K9EWZddd1ZL', '6sjYmJ68L0PHH', 'Pkgn2l6r31kIh', 'F9hBxDNJHSFr5', 'RNLFZX1Gz7E9F', '4xbJHKtYPA0GY', 'JiCRRV0FoG3GD', '1c1rdxJJSgDYs', 'oWnfQ95ysJulZ', 'wg4IzsqdADIEr', 'brx26ylXN9lhs', 'Z5MpPzEgKcMAs', 'D4q5gpKICQgf5', 'L2VcFiLz3qsYT', '1MzfAcJHTg8pI', 'WJ4aITSZJtKUp', 'TOXqS2wsJ9Vyy', 'TL5WFzjLtkQZb', '0WhMDgVwGOL3M', 'CHvZXSq6OuydU', 'SwYtQvydILgBz', 'hByS97V6Dr5yJ', '4jYfreDNHYwPF', '4yxIrFmrCxSoY', 'W9oYRyEuf25xB', 'nFvg5XtbnqqFH', 'ClEgcolq0pwek', 'aq441ziSyGWHc', 'un8M7sNNpLrzM', 'luJkZfeO3m4DA', 'XYFwrQrSnGVbH', '8YJOTHGpPjhtB', 'Q4SeUvVVDKgL1', 'TuqZhkVFSw1EB', 'hb6ydENI1P3Yv', 'QMLPR8XQSgfQ8', 'qlxuVEI4Im6K9', 'sCjqBzIiql9vz', 'CP4citgtnq9h2', 'VpEzKKW7hnDGu', 'aHaSyTECdCas7', 'DRU2iK89tpiXD', 'xQESk7avThdlk', 'i7uVWMzy4AA7H', 'UEDexeaEzXSLS', 'oARtLMMGiYequ', 'EcklXzFjO6r2R', 'GzeSXpQdJghm4', 'zOcLAdiln436K', 'MXDj6SCUIOKt3', 'FtE9egFhPbNh3', 'bIz35LYyB8BzD', '1drJmYThGMuNe', 'uL40cpC7HvzA5', '0IF5pnR7AvEQy', 'NATvwg7SN4aZ8', 'pi1gTfcbNuhjZ', 'TLocMrHor3Um4', 'TbU9D5r0vZ5WM', 'YdEHzt4ahsqlp', 'D3Yxi2PkCS48E', 'eqqWe0ArmuMXR', 'dq9IDzvnZIsoJ', '5VCRs81M4YZ63', 'VFxrwwwSqKKLP', 'ZuAUkqJC4VkkI', 'yKOrn6e7JY5Wr', 'dXqnl3upwA5Zo', 'po2mGLa4XPqnC', 'Cy6mJ2Kwul0mR', '698mTdA7r5LnT', 'fmetKf3GNWhSj', 'obqUrfadg1kmk', 'GIaD4nbPSCMO4', 'Dy9FUQvUWQSlz', 'AmAQSXg2QdAcJ', 'pFxw1Vp896G8I', 'F4WhJ3k2wxfSo', 'MWdqLMZvskSbO', 'd4i7P6X82dgBt', 'pw2CJKQMxGBsY', 'lwOquCINgeN8Q', '95xUtvSi1ps6Q', '60mrvLYtWwej9', 'OHILxESisORfI', 'yyVqc3WvnDAck', 'OpU4WJZabYiG9', 'zQP5y8oDtuyWQ', 'k1CBUKYS9uWnc', 'oaJTew2TN0q6D', 'VcxCFfn3B8WN7', '4ABC2aP7L7xLW', 'IgR4ugp64NPQD', '0RHdHfqNK9xL4', 'vC5JotZAi7c6y', 'K1jtpRHERGjKU', 'adaiFRdbREbT6', 'W5r0EsfzSTqOS', 'Yje7tc2gD9bCm', '5e8GBBeSEEYJM', '9XRIpxehPADux', 'zeHC8jHNgWS2Z', 'B3XHmuTteoCGZ', 'Ds5ip5FcvxKjn', 'AIr2TOLs59el0', 'x3UzyUR4a9TGa', 'xqX2zVfO97jkb', 'TwguGTApzStn7', 'rqjGtIDpZuhrP', '5kofAOPCfiPY2', 'ukyL3Wb863c1h', 'ufQd43as8e81b', 'sYuWDaMkIYZFx', 'leMu2duZyEEII', 'ecGVVMoYxnPJL', 'PonWOuNLNreRJ', 'JPWlnYtAsVgZ2', '92HVEisRQKKJE', 'vwUIpH4usaPEz', 'xbIrJa0xLw5Zh', 'KhdcvLFmiQHwK', 'ZKKSUEcTMDEAu', 'xRJvg55Se0OrE', 'HQGfhvHXbYmqg', '1nrQau5uqZDs9', 'Qm6jh3LFGH0en', 'uC9D40L3Ema5b', 'yv50WZjFOI60Y', 'DDjo7zHHTkPxj', '6elAb0iow54kW', 'zPonlxYKmsjMd', 'jvLpAsTTv0yq4', 'eCQJqrBYotvEG', 'pTMPKUsw74UaX', 'vu7878Hevl6Id', 'cXReE4p636mMr', 'tJEzluCTGqXrz', '63wf5hPxflcJq', 'WDsO7HzFlT5GH', 'zn0wfUhjkkFzQ', 'AGHD3b9FtdNxn', 'iXOkunQn5VUTR', 'MHb8mapAeE7Vx', 'Yt9NImnlH6hKm', 'ihfPPAYBqlHX4', '04xtPJlIfFg15', '82ecWnMrvw410', 'WpouWK5N776Rz', 'gGMnBV8TsWjzL', 'qORBwwqDDHThU', 'AGUEdNigeTABD', 'oSWuDo7LWHayP', 'WOOuYsdIqq6Fv', 'xhXU6CsMuiwCk', 'ddBUCfwU8KQBD', 'q1hiZT4uSytx3', 'mp0lpynsTlfUO', 'uB2PzIgJqHfI3', 'WY3IV6tveqRas', '4YJZBcWAiTyeh', 'Yx7SCam8x4M0U', 'wyCVTat198fvG', 'Rff1aco6PZ4rb', '1yhvIZ4ftDcz9', '6qDQUXgTgyhIN', 'I4MOQ0gPlvgH9', 'PUmF198u0oO8R', 'oDAvpSkS22Fhx', 'mV9n4KQV2NT6p', 'GlnLeQ9PgvA6U', 'iwGk3XPtsBVJw', 'FwUxJdbSvkZT2', '5JPsH2rHUGtWO', 'AqiI0oUCmckee', 'Si8SqyxsyzCOe', 'jmCE3n0hOkwvz', 'GG2EGj2KdzZyp', 'b6CCzmIQ3I7Pc', 'jKJcZ8lrzDzqL', 'YDlbnatuC5B8r', 'utALpITX8bPlM', '4s2PWgV2bk58Z', 'Ri5wS3Np6EpgK', '8Ec8NATnl2zKn', 'Y63O6huTgmPKq', 'qR59kYS9p58zQ', 'V1U29rFP7oYY2', 'NfFx5e1l4XL26', 'K7veyEdTv5kML', 'J5bo3EjM3SMWz', 'VIaC9FtaPlqhX', 'eduetqYWDluo9', 'YpHdLnx4GpY4i', 'RpY2mPIglr1fo', 'EZs4L7bDuT5Vb', '9ROGPiPPEN4HX', '03FG3bZqMYCZS', '1z1ei3A6S5Ene', 'BVwcguj8Cq0Tx', 'Szr5QHmudE1jQ', 'RyFv1V3O2ykWR', '3Xl4cAhwHBKtL', 'D3a5uZRsDoFjy', 'HY8kcADzF8eQR', '7CT2QFrRrRzZl', 'X6immB2z5xoMQ', 'p2y6CX6CiJbVq', 'oiOyUO39evBXE', 'P8lEyZIEl4TBc', 'L5c27wG0as300', 's9QftIERmg2MX', 'QxColXCcUHAIO', '0k0nJwmnUkXC3', '8XxUmEaTKGS5u', 'SnAEdTtTzqmYL', 'xJi754p17aEAq', 'usWpXHJJsWwCZ', '7BDOMLuoFObx0', 'grO21uPX2bPCO', 'ix2YxXKjGtLBw', '7J6md2TY6Dscl', '0P6vOklLxiHsO', '9whtmCo45PWwK', 'DzLg8CEYn1yfU', 'd6SE8UxIzcaEq', 'G3pWbN1drS1rY', '1TNjgTUVvC9Lu', 'IpVhZuUdLzB8I', 'kqVxvikW2LNhI', 'kEXaq6N7om5gX', 'Hp57PjEarYvRT', 'IkhLXHVKAATsX', 'NrChQsn3c1vbb', '5YkSO287mMHrk', 'TtrcWLb8zl8BN', 'Kn5bGHJ6ab43l', 'QCB4j7FoeVzIv', 'GD8gjBBLhmzrB', 'n2d4fkm1y3BN2', 'VfrTA2sTY1It3', 'nbiIndF6w8kEW', 'chYoVamBkST0C', 'ZNv2AGUywHl5R', '3XXfVB7CpNKBu', 'jiwfZLU78qPKZ', 'rrsQzsoY3SuAS', 'sS41R3UxJnm2J', '7dO5591cr0lj5', 'Su9VM2WQg6Rlu', 'tYErNj7tyku6M', 'ZD1UweVKiHucS', 'C3Or3ifnZX4MQ', 'Y6ztTsVySHkse', 'OyA7GBw5eDpOy', '4KTrh23oVRKiu', '6P8L2QEeWwzg2', 'O1cSqpGjLFvz2', 'jJXqJ8dxrUlA5', 'S6ehmD6tdYjNm', 'LQa63WZ0WzYmY', 'vGipCgPjRde3p', 'uD4C0PJQDy6vS', 'Kz7z3MI1WRWwV', 'ucIb6bs33WYXG', 'OkdcVnnUXZnwh', 'UX6Glh2taEHFj', 'UmYh6Ue1yGebn', '2BVMxqt6Var3q', 'lleKWnq2LDvZT', 'Z2dP8RWpHbFdC', 'HcXUGrHvWxAJP', 'nrbAkRLLKKIs5', '1ni3CVu8KO88E', 'Z0pAPtozFJsdp', '5esj5a55COwJL', 'oxoVKOta5I12d', 'Ueiq2D6fD0Umd', '0VBJ3WyGTCy3b', 'xzUJRwk9CeJ75', 'Rsp51OJpt6v7N', 'eRhrTyU0iGAfN', '3Hc2L1lBGyJ70', 'l95INZ06EvCyC', 'bOg173iUxVdG2', 'NrNjDBZxGoGdn', 'oBZnuKeHCPnGe', 'gov5A5gkfESrs', 'zcEElbLXYEOPW', '449nnies4ua1P', 'XvRmn48N0QMwJ', '9NgARVqmzFiMe', 'SFG6nPsSXidfv', 'Cm2ddJ7QhAkxN', 'ema7sBbZ4pwlw', 'i4rUcFvFD8bcz', 'iHrbKoe2R5KbB', 'xMq4Q0kPlGj5o', 'i9TwIZgzbfUMj', 'NtulivarO207A', 'h2vUmEXegE41r', 'lJnQzw6jbHyad', 'P5Fl0c6IwEkFW', 'X0hHidBgO0OaD', 'raXBo6Z6yGZAv', 'gg0OzQudHEdEH', 'LMt2Y9XQVXlVV', '07tRCiVjieQZL', 'WkN6g6WZReWIG', 'iSUm2uApyfIvS', 'yBy5PIyKFi0Fc', 'U58DmNqcvnal6', 'xBRY1Fbly3Uac', 'j3schU8EQ91Eg', 'uut0MG5GXzIcr', 'Ege56H7KYi8gt', 'kI55gANzebiLe', '7k3HY86ggllWs', 'ltaOnBl7nyf6q', 'up4lFtnERXb4r', 'AW3X2vDfeW70e', 'gZ1IvWUAw3UUy', 'mLqnPYxF5754P', 'V2wSBUfE7v6ec', 'kTEQ0A4HHYcjF', 'v8NwY4wrB9Sq7', '9poFXCuV1uq1E', 'wLiJtVvR4Clb2', 'CzyRCTPL4CuT3', 'KdtgrTzdJEJoZ', 'fZx2M07HMr6P9', 'oKbw34glQGm9x', 'YIwSjRqnBn0mV', 'db7HOhP3ikNrD', 'lU4ZwgAYRy9OD', 'GmiGZJfmWFKHt', 'RRs6HkbGyebSr', 'XDwO2JtKhiqWl', 'QzvW1X87ZPsKd', 'Jml4I1i18DeHJ', '0O2TPJd0xrLus', 'WirPN9BeAHf5s', '9Pa1moAjJNqq3', '5EOZVIl9H3tQZ', 'H2SjlklAn9qBz', 'eiDLdq1DDA87R', '5bUJmVmwls49P', 'Zl3sAHoDcNKAH', 'yuFWDEkEWmY12', 'ZLj6EYMcNEVn2', 'eMlOcQlw2YpKb', 'ntbAGuUu8ueT7', 'n18cPIS1KarRz', 'BHb1Cr1G9Tz9d', 'fJyBCIWadSa0h', 'XKhn9g5pagG9v', 'a9MblyuU7yDei', 'FFB1cTiAyoHoz', 'rioB2LL9lfWm1', 'UVf6mqlnzwjTB', '6hlzAseIzqozi', 'qYuhOHv1kJAGu', 'VYhAjBGHO1RwX', 'MRXpi8XaJ17m2', 'hQMVJL7jXlTvM', 'FfniYca6Vho7h', 'jpTD4zAIceEQP', '3pO5CBbyO0qSX', 'zZSn3oYptOLMx', 'hR3Dm8Faszfkm', 'uFNRKjpLjRobJ', 'ufCuQW42NRkDZ', 'WbajyQQfeaT60', 'zpjIvVSzPCvRI', 'VRBV1Hwj3spXh', 'bIwAuhysnikEW', 'y1dWs6J7B5Ea0', 'giMZ55lX9i5MI', 'ivi5MuZoDLHoR', 'WB2ojghdFkkep', 'GtmwJ8AlgGRDq', 'w5kBG5w9Nu6Gq', '2hHbKDkkAZiIH', 'fmfVvUgsfBCXb', 'oHzo5Ln4MfhLv', 'tAEJcnlGT0qff', 'DiXbIYfWmTXVd', 'AjeXqUIsOlk6j', 'mBxLiDHX5ZMt2', 'xTOz7vff8SR8t', 'nNfgpnoPq1hOH', '29or8dk7mHHc6', 'dnoEQ20U4f47g', 'ksIKXpD69BChS', 'J945W7TcP4mCF', 'i2fTGL6o2h3se', 'HREzvKXwfAwcf', 'COtOk73Isc39c', 'GU5SeiIjN7vwK', 'JKYi9FpWu0lBg', 'fu08spPbEbdra', 'Hudqiw9ens2NL', 'qhQ9BwIOfIqTs', 'NW0rGR7bJdpIw', 'HQjGm2ZjNewOg', '9j06hdxrBkLio', 'UGcRzyh5Stpml', 'FkZdSvKg5qTtz', '849p1I541f5u9', 'oGQZqO19t3BVM', 'WD0T5flVd7khf', 'JRf0iQOkJh33M', '6OfPY6H7PrcVp', 'Xefpi3JXysk6W', 'A9SdWv3qRsyNo', 'Emk1nAXlUkH4G', 'qEKnQGsWeIHOP', 'X7ZhYmOwnkk1U', 'XV3eZqdnTBVS7', 'SgSBsXltUW6ru', 'oWPA9jbusN3lE', 'FT3KKJxSA8qx3', '2HFVtArPddk35', 'YYMvbLjKPQf40', 'poEDR45gyNGmF', 'dzcl7snOAuf9c', '60ZDJfHhqBX5g', 'ugkdpy30L5rP5', 'xyspXfsLizAMa', 'y3SCrR0TJp4FV', 'OQ3EMuHqUtnBJ', 'irUKsDFbmep2Y', 'PrPupjP1lLUE3', 'c6E3KEY8R2LNo', 'AgIiivc0e8HIH', 'ioWMK05iSTCUA', 'efy2O3m4WG21b', 'q0sJSCPtuKPRR', 'fWYqyNepCZFUL', '15Jxv0JRZSfBD', 'LHBVYPHg24fqk', 'ez4ZnhcO49Mv1', 'B2xcnat4YiU8R', 'zLKHSqDh8rj9C', 'K5e0hns4VxLPm', 'jKyRJmB5shlKO', '0JWdhqlQZszzv', 'N0s3qNtZ28JwO', '3E6csnS2RGI2O', 'WCnrWauzOUCls', '1foc0ku8HNifK', 'sYKQcHZlR1oaK', 'wgCurbk08511a', 'y140GTLM3qfS2', 'PzMd53BGGOpuj', 'wIRxB7HzFzA80', 'nUGUIAs927PbC', 'FMeKrsvJ71gwR', 'ZieqCkSJAfr50', '0z32b6IVBPGK2', 'R5c5nTgyvSR7j', 'OuS6XaYGpmmhD', 'a1vL1QsnpsuG1', '55XTBjlckvsWJ', 'ikT7lhTCEsUyw', 'ITSWbg0VRePOU', 'NRnvRzITOk7WZ', '8UN9C49jq7aHG', 'nu10XrMhbbZDx', 'dGppmB8Whyo8g', 'uOtu5b8yoiVfM', '49yrMZG8PcJs8', 'OEiMbzbGZsQCy', 'XGAiVrNwi60Vb', 'DtMr9j0AqmY7Y']
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{4_12.bmp}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{8_8.bmp}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

While 2 QR codes still needed to be scanned and inputted manually, the bigger question is what the outputs even mean. The character sequence doesn't look like anything interesting under base64 or any related encoding scheme:

image

Because each QR code result is 13 characters long, they cannot be individually decoded via base64, either:

>>> base64.decodebytes('C5Nre0R8Tau6T'.encode()).decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\base64.py", line 562, in decodebytes
    return binascii.a2b_base64(s)
binascii.Error: Invalid base64-encoded string: number of data characters (13) cannot be 1 more than a multiple of 4

Going back to the extracted logo from earlier, we can try diffing it with the one on their website, only to find that the aspect ratios are different:

import cv2


origin = cv2.imread('website.png')
extracted = cv2.imread('extracted.bmp')

print(origin.shape, extracted.shape)

resized = cv2.resize(origin, extracted.shape[:2][::-1])

cv2.namedWindow('out', cv2.WINDOW_NORMAL)
cv2.imshow('out', resized)
cv2.waitKey()

cv2.imshow('out', extracted - resized)
cv2.waitKey()

cv2.imshow('out', extracted ^ resized)
cv2.waitKey()

out

although, with the exception of the black blob to the top left of the first T, most of this diff can be waved away as compression noise. Of course, the extracted image has no further data on Aperi'Solve either:

image

Instead, we can guess that the QR code strings are a wordlist for stegseek. Trying these passwords on the extracted logo file,

image

we extract one final QR code:

out

Scanning this, we get the flag.

PCTF{QR_M0s41c_St3g0_M4st3r}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment