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:
Plugging it into Aperi'Solve, we can extract a patriotCTF.bmp
resembling the logo on their website:
From the original image, we can extract each 58x58 QR code in the 25x40 grid to generate 1000 individual images like so:
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:
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:
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()
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:
Instead, we can guess that the QR code strings are a wordlist for stegseek. Trying these passwords on the extracted logo file,
we extract one final QR code:
Scanning this, we get the flag.
PCTF{QR_M0s41c_St3g0_M4st3r}