Logo Peter

CodeGate 2025 Quals

March 30, 2025
50 min read
Table of Contents

Better than last year XD. See you guys at Korea!!!

C0D3Matr1x

Average matrix checker challenge… After reverse a bit, I reimplement it into python like this.

first = [0x00000054, 0x00000012, 0x00000002, 0x00000002, 0x0000004C, 0x00000041, 0x00000033, 0x00000051, 0x0000003F, 0x0000000C, 0x00000006, 0x00000018, 0x00000040, 0x00000043, 0x00000034, 0x00000047, 0x0000005F, 0x00000022, 0x00000062, 0x00000021, 0x0000005E, 0x0000001A, 0x00000027, 0x0000004D, 0x00000033, 0x00000056, 0x00000048, 0x0000002C, 0x00000010, 0x00000004, 0x00000049, 0x00000002, 0x0000001C, 0x00000028, 0x0000004D, 0x0000001C, 0x0000003F, 0x0000002B, 0x00000017, 0x00000019, 0x00000027, 0x00000042, 0x00000052, 0x00000046, 0x0000003C, 0x00000000, 0x00000039, 0x00000041, 0x00000029, 0x00000009, 0x00000062, 0x00000027, 0x00000015, 0x00000017, 0x0000001A, 0x0000001D, 0x00000019, 0x00000048, 0x00000056, 0x00000012, 0x00000000, 0x00000004, 0x00000037, 0x0000004A, 0x0000003F, 0x00000000, 0x0000004B, 0x00000019, 0x0000003F, 0x00000037, 0x00000039, 0x00000024, 0x0000000E, 0x00000059, 0x00000015, 0x000000B8, 0x00000011, 0x0000003D, 0x00000009, 0x00000021, 0x00000046, 0x00000025, 0x00000063, 0x0000003F, 0x00000004, 0x00000017, 0x00000059, 0x0000005F, 0x0000003E, 0x00000061, 0x00000051, 0x0000001E, 0x00000052, 0x00000036, 0x00000001, 0x0000001B, 0x00000025, 0x0000000C, 0x00000013, 0x0000003A, 0x0000008C, 0x00000061, 0x00000044, 0x0000002E, 0x00000022, 0x00000022, 0x0000003E, 0x00000062, 0x00000039, 0x00000056, 0x0000003E, 0x0000001E, 0x0000002C, 0x0000003B, 0x00000032, 0x0000000D, 0x00000032, 0x0000004F, 0x0000004C, 0x00000043, 0x00000060, 0x00000032, 0x0000002D, 0x00000015, 0x00000055, 0x000000AE, 0x00000006, 0x0000005A, 0x00000022, 0x00000011, 0x00000053, 0x00000055, 0x0000002F, 0x0000001B, 0x0000001D, 0x00000013, 0x0000000B, 0x00000026, 0x00000038, 0x00000021, 0x00000059, 0x0000000A, 0x00000033, 0x00000052, 0x00000062, 0x0000000F, 0x00000018, 0x00000053, 0x0000002B, 0x0000002C, 0x0000008A, 0x00000001, 0x00000034, 0x00000049, 0x0000004D, 0x00000003, 0x00000025, 0x00000009, 0x0000003F, 0x00000018, 0x0000005D, 0x0000003C, 0x0000002C, 0x00000024, 0x00000044, 0x00000011, 0x00000001, 0x00000018, 0x00000028, 0x00000038, 0x0000003A, 0x0000004D, 0x0000001F, 0x00000045, 0x0000000F, 0x00000010, 0x00000034, 0x0000000C, 0x0000001A, 0x0000002E, 0x0000005E, 0x00000001, 0x00000031, 0x00000059, 0x00000006, 0x00000033, 0x00000039, 0x00000007, 0x00000005, 0x0000004A, 0x0000000B, 0x00000035, 0x00000062, 0x00000041, 0x0000001B, 0x00000015, 0x00000060, 0x00000031, 0x00000019, 0x00000027, 0x0000009C, 0x0000004D, 0x00000027, 0x0000004F, 0x0000004F, 0x00000021, 0x00000007, 0x00000038, 0x00000063, 0x00000032, 0x0000002A, 0x00000058, 0x0000000F, 0x0000002F, 0x0000005F, 0x00000015, 0x0000003B, 0x00000011, 0x0000004F, 0x0000005E, 0x0000002D, 0x00000005, 0x0000000F, 0x0000000E, 0x00000029, 0x00000042, 0x00000026, 0x0000003C, 0x00000013, 0x0000004F, 0x00000012, 0x0000002B, 0x00000041, 0x00000011, 0x00000009, 0x00000006, 0x00000041, 0x00000038, 0x0000000E, 0x00000007, 0x00000044, 0x0000002B, 0x00000001, 0x0000003E, 0x0000001A, 0x00000053, 0x00000043, 0x0000002C, 0x00000003, 0x0000000C, 0x00000032, 0x00000000, 0x0000004F, 0x0000000F, 0x0000005B, 0x00000060, 0x00000058, 0x00000047, 0x0000004B, 0x00000010, 0x00000006, 0x0000000A, 0x00000031, 0x00000047, 0x00000019, 0x00000010, 0x00000035, 0x0000000A, 0x0000004E, 0x00000006, 0x00000017, 0x00000007, 0x00000056, 0x0000004C, 0x0000003B, 0x00000058, 0x00000018, 0x00000018, 0x0000002E, 0x0000004B, 0x00000050, 0x00000008, 0x00000042, 0x0000001D, 0x0000002E, 0x00000059, 0x00000059, 0x00000034, 0x0000005E, 0x00000016, 0x00000042, 0x00000004, 0x00000012, 0x00000047, 0x00000020, 0x00000021, 0x00000002, 0x00000020, 0x00000034, 0x00000005, 0x00000078, 0x00000044, 0x00000015, 0x00000040, 0x00000060, 0x0000002A, 0x00000059, 0x00000027, 0x00000017, 0x00000062, 0x0000005B, 0x00000060, 0x00000017, 0x0000004B, 0x00000046, 0x00000008, 0x00000027, 0x00000055, 0x00000059, 0x00000042, 0x0000000B, 0x00000060, 0x0000001E, 0x00000058, 0x00000051, 0x00000096, 0x0000003D, 0x00000019, 0x00000032, 0x00000030, 0x00000055, 0x00000056, 0x00000056, 0x00000050, 0x00000041, 0x0000001C, 0x0000004C, 0x00000006, 0x00000000, 0x0000004C, 0x00000005, 0x0000002A, 0x00000018, 0x00000035, 0x00000012, 0x00000051, 0x00000003, 0x00000019, 0x00000052, 0x00000034, 0x00000046, 0x00000008, 0x0000000D, 0x00000056, 0x0000003A, 0x00000036, 0x00000049, 0x0000002B, 0x00000047, 0x00000046, 0x00000047, 0x00000015, 0x00000048, 0x00000053, 0x0000004A, 0x00000018, 0x00000024, 0x00000043, 0x00000009, 0x00000028, 0x00000018, 0x00000026, 0x0000000C, 0x00000036, 0x00000005, 0x00000070, 0x00000061, 0x0000004D, 0x00000011, 0x00000027, 0x00000023, 0x00000039, 0x00000013, 0x00000058, 0x00000043, 0x0000001D, 0x0000000B, 0x00000034, 0x0000000F, 0x00000019, 0x00000036, 0x00000025, 0x00000058, 0x00000043, 0x00000055, 0x00000058, 0x0000003A, 0x00000040, 0x00000053, 0x00000033, 0x00000052, 0x0000000A, 0x00000036, 0x00000059, 0x0000003B, 0x00000009, 0x00000031, 0x00000059, 0x0000004F, 0x00000056, 0x0000004D, 0x00000016, 0x00000054, 0x00000059, 0x0000001F, 0x0000001B, 0x00000041, 0x00000060, 0x0000000A, 0x00000051, 0x0000004C, 0x00000047, 0x00000011, 0x0000004E, 0x00000046, 0x0000007A, 0x0000000C, 0x0000003D, 0x00000019, 0x0000000E, 0x0000002C, 0x00000029, 0x0000004E, 0x00000017, 0x00000019, 0x0000003F, 0x00000007, 0x0000000B, 0x0000002E, 0x00000028, 0x00000052, 0x00000004, 0x0000005E, 0x0000005E, 0x0000005B, 0x00000007, 0x0000001D, 0x0000000C, 0x00000004, 0x00000000, 0x00000012, 0x00000022, 0x0000004E, 0x00000049, 0x00000025, 0x00000034, 0x00000047, 0x00000006, 0x00000037, 0x0000002D, 0x00000029, 0x00000002, 0x0000005E, 0x00000034, 0x00000030, 0x00000016, 0x00000016, 0x00000049, 0x0000003B, 0x00000001, 0x0000004C, 0x00000010, 0x00000041, 0x00000043, 0x0000001E, 0x00000022, 0x00000034, 0x0000005C, 0x00000021, 0x00000002, 0x0000005F, 0x00000018, 0x00000022, 0x0000000B, 0x00000026, 0x00000005, 0x00000002, 0x0000004A, 0x0000003B, 0x0000003C, 0x0000000B, 0x0000001C, 0x0000004B, 0x00000032, 0x0000005B, 0x00000015, 0x00000037, 0x00000022, 0x00000020, 0x0000005C, 0x000000C0, 0x0000005C, 0x00000028, 0x0000004B, 0x00000036, 0x00000010, 0x00000053, 0x0000005C, 0x0000001C, 0x00000051, 0x00000000, 0x0000004F, 0x00000051, 0x0000005B, 0x0000001A, 0x00000021, 0x00000052, 0x00000022, 0x0000003E, 0x0000000C, 0x0000000F, 0x0000001E, 0x00000034, 0x0000000D, 0x00000018, 0x0000001E, 0x0000004B, 0x00000030, 0x0000005C, 0x00000029, 0x00000014, 0x0000005A, 0x00000054, 0x0000002E, 0x00000027, 0x0000000E, 0x0000005F, 0x00000033, 0x0000001F, 0x0000001C, 0x00000036, 0x00000040, 0x0000003D, 0x00000040, 0x00000010, 0x0000005B, 0x00000044, 0x0000000A, 0x00000025, 0x00000042, 0x00000030, 0x00000004, 0x00000004, 0x00000010, 0x00000033, 0x0000005B, 0x00000009, 0x0000002E, 0x0000001A, 0x0000003B, 0x0000002D, 0x00000058, 0x00000059, 0x00000008, 0x0000005B, 0x00000022, 0x00000020, 0x00000000, 0x0000003A, 0x00000043, 0x0000002F, 0x0000002F, 0x0000000B, 0x00000054, 0x00000018, 0x0000008A]
second = [0x000006C6, 0x0000B350, 0x0000FB2A, 0x0000A846, 0x0000ABD5, 0x0000FBBA, 0x00000D20, 0x0000B2C4, 0x00000BD5, 0x0000A4F3, 0x00004064, 0x0000BDCF, 0x00008511, 0x00002911, 0x0000C4BD, 0x000065B6, 0x00007010, 0x00001F43, 0x000020F1, 0x00007268, 0x00006EF8, 0x00001524, 0x0000F6A8, 0x000003A2, 0x000037CB, 0x0000C40F, 0x00009720, 0x000013D2, 0x000003AA, 0x00004671, 0x0000C1FC, 0x00002147, 0x0000F9EF, 0x0000B8AA, 0x000081EF, 0x00001F7A, 0x0000DEAA, 0x000089BF, 0x0000C101, 0x00002992, 0x0000E50D, 0x000080D5, 0x0000A7C2, 0x000005D2, 0x000009DF, 0x0000AE25, 0x0000CB5E, 0x0000A5A9, 0x00009763, 0x0000BAF2, 0x000086F8, 0x00009BFC, 0x00004435, 0x000070B3, 0x0000AB91, 0x000044F4, 0x00004495, 0x0000E241, 0x000043C9, 0x0000CC02, 0x0000A778, 0x00005031, 0x00009994, 0x0000DBE1, 0x0000E6CC, 0x0000F905, 0x00007ED4, 0x0000713A, 0x00001E87, 0x0000A621, 0x0000E3C5, 0x00002DCF, 0x000095C2, 0x0000F961, 0x0000A7E3, 0x0000FAD7, 0x00002244, 0x0000E219, 0x00007FFC, 0x00004CCD, 0x000005B2, 0x00003594, 0x0000F6DD, 0x00006037, 0x00002C8F, 0x000005B3, 0x00003DB5, 0x00005361, 0x00009025, 0x0000DB95, 0x0000B3C9, 0x00006450, 0x0000AE6E, 0x0000F74F, 0x0000B761, 0x0000F9D0, 0x000000A9, 0x0000F10C, 0x0000ECBD, 0x0000C698, 0x00000C22, 0x00007EB8, 0x0000EAA5, 0x0000AB78, 0x0000437F, 0x0000BF50, 0x00009DA0, 0x000070E1, 0x0000DBE8, 0x00009B40, 0x0000B9A5, 0x0000CBF4, 0x0000E492, 0x0000B5F6, 0x0000919F, 0x00004B33, 0x00009EEF, 0x00005E9A, 0x0000FFC0, 0x00000AB7, 0x0000F3BF, 0x00008283, 0x000041DF, 0x00007773, 0x000081B4, 0x0000BA07, 0x00000FD6, 0x00008FD3, 0x00005D0F, 0x000033B1, 0x0000F5B0, 0x0000FFBB, 0x000047B5, 0x0000E9F7, 0x0000D783, 0x0000A9E6, 0x000096C1, 0x00001816, 0x0000C30A, 0x0000A3CD, 0x00007884, 0x0000B1EC, 0x00000C61, 0x00000F77, 0x0000B14A, 0x00008AFF, 0x0000C779, 0x0000626D, 0x0000D759, 0x00006C81, 0x0000CC5D, 0x0000BD1A, 0x000095F5, 0x00005D61, 0x00009C9E, 0x00006293, 0x00002911, 0x00009758, 0x0000B6D0, 0x00005BD4, 0x00003B98, 0x0000DC7F, 0x0000F27C, 0x00009816, 0x0000DE49, 0x00008575, 0x0000D547, 0x00006E36, 0x00008635, 0x00003E95, 0x0000D8C6, 0x000024C7, 0x00006B58, 0x00009CEF, 0x0000EA8C, 0x0000582C, 0x0000C9E0, 0x0000BD3D, 0x0000BC4E, 0x0000D00C, 0x00003C61, 0x0000C9F7, 0x0000E213, 0x00004893, 0x000051C6, 0x0000A72F, 0x0000E1F4, 0x0000F767, 0x00001A78, 0x00008D4F, 0x0000423B, 0x0000DA35, 0x0000ED13, 0x0000228B, 0x0000CD29, 0x00009F34, 0x0000997D, 0x00005D1E, 0x0000C18A, 0x00006159, 0x00006986, 0x00003C38, 0x0000A076, 0x0000FC28, 0x00006FC4, 0x00008751, 0x000096E0, 0x0000FAFD, 0x000052C6, 0x00004906, 0x00001173, 0x0000045C, 0x0000DD70, 0x000045F3, 0x00005044, 0x000092AE, 0x0000428A, 0x000029D8, 0x0000C652, 0x0000679D, 0x0000213F, 0x0000BF03, 0x0000F0C1, 0x00000E6A, 0x0000BDD8, 0x00004591, 0x0000B5B9, 0x00002558, 0x0000A92D, 0x0000C886, 0x0000C02F, 0x000089CF, 0x00005395, 0x0000C578, 0x00002078, 0x00004ADF, 0x0000C6FF, 0x00006EC1, 0x00004A15, 0x00001309, 0x0000FDED, 0x0000468C, 0x00008FEB, 0x0000AEEA, 0x0000D873, 0x00001B87, 0x0000E75B, 0x000080B5, 0x0000236D, 0x00007097, 0x00006857, 0x00006B43, 0x000002BC, 0x000091EA, 0x0000B01D, 0x0000777A, 0x0000B692, 0x00003918, 0x0000D1CF, 0x0000959E, 0x00000572, 0x000059C7, 0x0000D4FA, 0x0000D9AB, 0x0000904F, 0x00005D27, 0x0000396C, 0x00004B82, 0x000085F2, 0x0000A2F0, 0x0000C88A, 0x000088E5, 0x0000F4E2, 0x00006988, 0x00006496, 0x00004035, 0x00003D0E, 0x000015DC, 0x0000B6DD, 0x0000CBE4, 0x00002D92, 0x0000418F, 0x00009AD4, 0x0000AEDC, 0x0000FA46, 0x000025E7, 0x000022A8, 0x0000AEE5, 0x00001798, 0x0000DFBD, 0x0000CD93, 0x0000058E, 0x000027DC, 0x0000EAFF, 0x0000AB5A, 0x000037AB, 0x0000B78F, 0x00005E02, 0x00008E73, 0x00003AEC, 0x0000F80C, 0x0000711A, 0x0000914C, 0x0000DD62, 0x0000E2D3, 0x00006DFE, 0x00003597, 0x000025C5, 0x0000AD18, 0x0000E45F, 0x00003808, 0x0000EB56, 0x000033EA, 0x00006D19, 0x0000FBCC, 0x0000A388, 0x0000B0FD, 0x0000C271, 0x0000ED90, 0x00004095, 0x0000440F, 0x0000262D, 0x0000B512, 0x0000623A, 0x00006410, 0x000062A5, 0x00006995, 0x0000A000, 0x0000BAF9, 0x0000E445, 0x00002465, 0x0000A65E, 0x0000B603, 0x0000C209, 0x0000B159, 0x00006C32, 0x0000011D, 0x00003C2E, 0x0000B23D, 0x0000B479, 0x00009D4F, 0x0000EF2F, 0x0000833E, 0x0000FE0F, 0x00002EB3, 0x00008B7B, 0x000061DB, 0x00001DC6, 0x00006534, 0x000037F1, 0x0000908F, 0x00000D7D, 0x0000D25A, 0x0000C690, 0x00000B29, 0x00003220, 0x0000097F, 0x0000321A, 0x0000CAC4, 0x000007AB, 0x000073AE, 0x0000DB4E, 0x00004A65, 0x000096A0, 0x000064F0, 0x00005F45, 0x00001E77, 0x00002DE3, 0x0000DD0C, 0x0000A4C8, 0x000033DF, 0x0000FACF, 0x000029B1, 0x000007CB, 0x000024AB, 0x00002A19, 0x000043F2, 0x00003293, 0x0000C952, 0x000083EE, 0x00000E01, 0x0000424C, 0x00002CCC, 0x000021CB, 0x0000701F, 0x00004A27, 0x00004E30, 0x00004ADC, 0x00000846, 0x0000DA65, 0x0000E1F1, 0x0000D6CF, 0x000015C1, 0x0000ED78, 0x0000CFF2, 0x00001C69, 0x0000EF05, 0x0000DD53, 0x00002BB9, 0x00001401, 0x00000EFD, 0x00007031, 0x0000EFD9, 0x00005790, 0x000014B8, 0x0000A5C6, 0x0000FA73, 0x00001F8C, 0x00006171, 0x0000A46B, 0x0000C524, 0x00008A78, 0x00002DC3, 0x000061BC, 0x000004A2, 0x0000DDC4, 0x000073C4, 0x00008C50, 0x0000CFBC, 0x00003388, 0x000073F0, 0x0000E94C, 0x000085CE, 0x000020BC, 0x00008F08, 0x000067E7, 0x0000E5C8, 0x000069BD, 0x000046BF, 0x000069E4, 0x0000F024, 0x0000F5BB, 0x0000AB91, 0x00000C32, 0x000057E8, 0x0000CC30, 0x0000C68A, 0x0000A5F3, 0x0000EFBF, 0x00005F74, 0x00000E7F, 0x0000397F, 0x0000F02B, 0x00002E51, 0x00000FFE, 0x000032CE, 0x0000F66A, 0x0000A69D, 0x000093B1, 0x0000E53F, 0x0000F854, 0x000060B8, 0x0000A7A2, 0x0000EF57, 0x00006A86, 0x0000C3CA, 0x000093E4, 0x0000B2F1, 0x00000590, 0x00008CC5, 0x0000EEB7, 0x0000663D, 0x00006311, 0x0000DB16, 0x00009294, 0x00008299, 0x000000BD, 0x0000FCA1, 0x0000D53F, 0x00007E60, 0x0000FF44, 0x0000A42C, 0x0000A8F1, 0x00005175, 0x0000E9A0, 0x0000EB14, 0x0000DB64, 0x0000B072, 0x00003179, 0x000059D2, 0x0000B7FF, 0x00002EE0, 0x0000FD00, 0x000042FD, 0x000017FB, 0x0000A871, 0x0000D3CE, 0x000073B9, 0x0000532C, 0x00002449, 0x000045A8, 0x0000E49A, 0x0000C3CB, 0x00004497, 0x00005841, 0x000011D7, 0x00007D08, 0x000046C3, 0x0000CF5E, 0x0000705C, 0x0000C024, 0x0000D07C, 0x00007F16, 0x00009D97, 0x00003E91, 0x0000249F, 0x0000E9A7, 0x000014E5, 0x00008C35, 0x00007A6D, 0x0000F3E9, 0x0000B8F6, 0x0000DCDD, 0x0000449D, 0x0000A524, 0x00000F38, 0x00004510, 0x0000589D, 0x000078A1, 0x00004ABA, 0x0000A3E5, 0x000009D3, 0x0000F34B, 0x00005705, 0x0000DA4D, 0x00003330, 0x00001949, 0x00002949, 0x0000CE6C, 0x00005299, 0x00000340, 0x0000C795, 0x000098C2, 0x0000D611, 0x00006212, 0x0000B043, 0x00003253, 0x0000FCF1, 0x0000593C, 0x00003496, 0x000008D5, 0x0000F597, 0x00007436, 0x0000E146, 0x0000CE9A, 0x0000FDF3, 0x0000B57C, 0x000059AA, 0x00008F34, 0x00006A4E, 0x000022F9, 0x0000DB15, 0x000002CA, 0x00001DE0, 0x00001E5B, 0x00003A0F, 0x0000AB47, 0x00007280, 0x000016BD, 0x0000826B, 0x0000FFEF, 0x000069A4, 0x00000E62, 0x0000674E, 0x0000CDC3, 0x00002381, 0x00001187, 0x000012CC, 0x0000D668, 0x00004DCF, 0x000089AC, 0x000075B6, 0x000095CD, 0x00001915, 0x0000D51E, 0x000078B2]
 
third = [-115, 0, 15, 1, -21, 49, -24, 5, 42, -2, -16, -9, 40, 46, 56, -34, 16, -25, 39, 26, 23, 42, -56, 0, -31, -15, 7, -14, 11, 22, 13, -33, -9, 40, 31, 54, -19, -26, -20, 12, 30, 14, 44, -14, 49, -4, -4, 25, 53, 8, -45, 20, -5, 58, 16, -15, 18, 59, 45, 23, 50, 51, -33, 11, 46, -34, -15, -9, -46, -50, 3, -35, 9, 39, -13, -127, 19, -40, 30, 21, -40, 32, 37, -20, 30, 30, 29, 25, 3, 18, -12, -58, -44, -76, 39, -55, -18, -34, 4, -16, -19, -9, -4, -35, 31, -32, 0, 59, 5, 23, 29, -40, -30, -1, 54, -13, -1, -31, 36, 56, 17, 16, -40, 18, 9, -129, 36, -33, 0, -23, 23, 43, 3, 30, 10, -4, -40, 3, -42, -40, 10, -22, 28, -36, 24, -6, -20, -2, -25, 17, -53, -6, -18, 49, -16, 14, -1, 27, -12, -72, -10, -38, -4, 0, 53, 26, 23, -28, 56, 26, 2, 57, -38, -18, 14, -123, 48, 38, -29, -12, -12, 18, -38, 31, 59, -27, -44, -56, 27, -33, -29, 19, 54, 22, -14, -29, 16, -31, 46, 30, -34, 72, -94, 24, 41, 52, -9, -13, -33, -9, 56, -5, 25, 54, 3, 43, -13, 49, 56, 36, 43, -27, 53, -15, 7, -94, 83, -28, -28, 31, 23, -29, 44, -40, -31, 3, 0, 58, 60, -42, -40, -27, 55, 46, -36, -22, -45, 25, -9, 22, 24, -2, 12, -30, 35, 32, 11, -2, 29, -32, -33, 42, -53, 22, -34, -30, 33, -2, 2, 23, -28, 58, -95, -7, 20, 23, -16, 57, -12, -75, -3, 19, -26, 58, 49, -19, 45, 33, 57, 21, 47, 16, 18, 15, -22, 6, 59, -12, -25, 45, 39, 1, 27, -2, 41, -73, 25, 6, 8, -24, 9, 11, -29, 40, -26, 26, -77, -45, -88, -30, -95, 34, -28, 1, -40, -113, 2, 6, -6, -4, -34, 27, -37, -12, -11, 35, 27, 2, 9, 13, -31, -6, 12, -14, -16, -10, 34, -9, 25, -19, -115, -9, -22, -1, 9, 41, -46, -53, -60, 28, -36, -22, 18, 34, 25, 48, 50, 27, -51, -24, 45, 71, -38, -15, 32, 51, -24, 15, 45, 5, -55, 23, 8, 38, 43, 19, 22, -39, -37, -14, -4, -34, 8, -19, -13, 43, -36, -39, 28, 24, 63, -54, 8, -23, -27, -50, 34, 36, 38, -5, 40, -3, -8, -6, 35, -17, 26, 35, 30, -19, -37, 8, 0, -29, -57, -61, -54, 0, -16, 59, -13, -39, -14, -26, 55, 0, 58, 24, 39, 21, 44, -22, 22, -38, -17, 3, 57, -20, -10, 2, 14, -10, 21, -40, 8, 21, -30, -18, -35, -21, -3, -3, -8, 45, -28, 8, 20, -38, -29, -40, -40, 69, 20, -19, 28, 22, 15, 13, -34, -26, -29, -19, -32, -14, 38, -37, 27, 54, -30, -38, 56, 39, -15, 43, -35, -3, 31, -53, -9, -47, -58, 3, 12, 25, 45, 52, -38, -10, 14, -17, -29, 12, 41, 23, -39, 16, -30, 5, 3, 27, 5, 21, 16, 41, 33, -128, 17, 23, 34, 51, 23, 22, 20, -2, 39, 55, 14, 40, 48, 56, 57, 4, 37, -23, 27, 2, 5, 35, 27, -16, -66, -39, 15, 40, -24, -29, -2, -5, 54, -25, 20, 59, -8, 8, -11, -4, 15, 58, 42, -38, -11, 31, 50, 6, 37, -56]
fourth = [-147, 0, 15, 1, -21, 49, -24, 5, 42, -2, -16, -9, 40, 46, 56, -34, 16, -25, 39, 26, 23, 42, -16, -2, -29, -62, 17, -14, 11, 22, 13, -33, -9, 40, 31, 54, -19, -26, -20, 12, 30, 14, 44, -14, 49, 54, 43, 23, 48, -39, -43, 22, -53, 58, 16, -15, 18, 59, 45, 23, 50, 51, -33, 11, 46, -34, -15, 46, 1, -3, 8, -30, -49, 41, -60, -125, -28, -68, -21, 21, -40, 32, 37, -20, 30, 30, 29, 25, 3, -3, 35, -11, 3, -29, 37, -2, -18, -67, 6, -63, -66, -7, -51, -63, -11, -32, 0, 59, 5, 23, 29, 14, -36, 46, 52, -8, -3, 10, 36, 56, 17, 16, -40, 11, -38, -134, 31, -31, -5, -26, 23, 43, 3, 30, 57, -6, 7, 8, 5, -12, 50, -22, 28, -36, 24, -6, -65, -49, -72, 12, -51, -11, -19, 49, 4, -42, -1, 27, -12, -37, 37, -33, 43, -2, 58, 57, 23, -28, 8, 28, -45, 10, -43, -12, -23, -123, 48, 1, -26, -84, -59, 17, -38, 31, 55, -29, -39, -9, 25, -35, -26, 23, 56, -25, -61, -76, 13, -31, 46, 6, -44, 49, -85, -6, -6, 5, -7, -32, -33, -9, 34, 42, 23, 52, 1, 41, -18, 51, 51, -16, 43, -52, -2, -34, -65, -166, 53, -35, -22, 33, -24, -76, -3, -19, -31, 3, 7, 56, 58, 5, -45, -43, 55, -8, -16, 36, -36, -47, 0, 33, 23, -2, 12, -77, -12, 55, 2, 0, 1, -39, -33, 42, -19, 50, -34, -30, 37, -27, -23, -2, 28, 44, -37, -7, 20, 23, -16, 57, -12, -34, -17, 31, -11, 58, 49, -19, 45, 33, 57, 21, 27, -6, -9, 4, 11, -39, 11, -39, -48, 22, 16, -22, 4, -1, -7, -49, 2, -14, -15, -24, 9, 11, -29, 40, -26, 26, -57, -59, -55, 3, -62, -14, -57, -27, -63, -136, -21, 36, 17, -27, -64, 27, -37, -12, 9, 45, 27, 2, 9, 13, -31, 14, 56, -34, -36, 23, -14, -57, 5, -42, -128, -15, -35, -1, 9, 41, -16, -33, -40, 12, -36, -22, 18, 34, 25, 48, 50, 27, -24, -2, -3, 34, -61, -37, 32, 51, -24, 15, 33, 28, -32, 46, 31, 22, 43, 19, 22, -39, -37, -14, -4, -34, 8, -7, -53, 11, -59, -84, 28, 24, 39, -31, 31, 0, -4, -30, 19, 36, 36, -28, 17, -26, -31, -29, 12, -46, 26, 47, 7, -30, -37, 8, 25, -9, -34, -41, -31, 23, 28, 59, -13, -39, -16, -49, 32, -23, 35, 1, 16, -8, 44, -30, 22, -38, -17, 3, 39, 3, 13, 25, 37, 13, 46, -40, 8, 21, -30, -18, -55, -44, -26, -26, -31, 31, -28, 8, 20, -38, -29, -40, -40, 49, 46, 11, 51, 45, 38, 36, 16, -26, -52, -42, -55, -37, 15, -67, 27, 54, -30, -38, 56, 39, -15, 43, -35, -3, 31, -14, 14, -24, -35, 26, 35, 48, 22, 29, -58, -30, -29, -17, -29, 12, 41, 23, -39, 16, -30, 5, 3, 27, 5, 21, 16, 18, 56, -105, 40, 46, 11, 28, 45, 22, 20, -2, 39, 55, 14, 40, 48, 56, 57, 4, 37, -23, 27, 2, 5, 35, 27, -35, -43, -16, -19, 40, -24, -29, -2, -5, 54, -25, 20, 59, -8, 8, -11, -4, 15, 58, 42, -38, -11, 31, 50, 6, 37, -7]
 
 
def matrix_multiply(a1, a2, a3):
    for i in range(24):
        for j in range(24):
            v4 = 0
            for k in range(24):
                v4 += a2[24 * k + j] * a1[24 * i + k]
            a3[24 * i + j] = v4 % 0xFFFF
    
    return a3
 
 
def modular_matrix(a1, a2, a3):
    for i in range(24):
        for j in range(24):
            a3[i * 0x18 + j] = (a1[i * 0x18 + j] + a2[i * 0x18 + j]) % 0xffff
    return a3
 
def rotate_matrix_counter_clockwise(buf):
    size = 24
    for i in range(12):
        for j in range(i, 24 - i - 1):
            temp = buf[size * j + i]
            buf[size * j + i] = buf[size * i + (size - 1 - j)]
            buf[size * i + (size - 1 - j)] = buf[size * (size - 1 - j) + (size - 1 - i)]
            buf[size * (size - 1 - j) + (size - 1 - i)] = buf[size * (size - 1 - i) + j]
            buf[size * (size - 1 - i) + j] = temp
    return buf
 
def rotate_matrix_clockwise(buf):
    size = 24
    for i in range(12): 
        for j in range(i, size - i - 1):
            temp = buf[24 * j + i]
            buf[24 * j + i] = buf[24 * (size - i - 1) + j]
            buf[24 * (size - i - 1) + j] = buf[24 * (size - j - 1) + (size - i - 1)]
            buf[24 * (size - j - 1) + (size - i - 1)] = buf[24 * i + (size - j - 1)]
            buf[24 * i + (size - j - 1)] = temp
    return buf
 
 
def calculate(a1, a2):
    for i in range(24):
        for j in range(24):
            a2[24 * i + j] = a1[26 * i + 53 + j] + a1[26 * i + 52 + j] + a1[26 * i + 28 + j] + a1[26 * i + 27 + j] + a1[26 * i + 26 + j] + a1[26 * i + 2 + j] + a1[26 * i + 1 + j] + a1[26 * i + j] + a1[26 * i + 54 + j]
    return a2
 
buf = [0] * 676
buf1 = [0] * 576
buf2 = [0] * 576
buf3 = [0] * 576
buf4 = [0] * 576
buf5 = [0] * 576
buf6 = [0] * 576
buf7 = [0] * 576
buf8 = [0] * 576
 
for i in range(12):
    if i & 1:
        buf1[24 * (23 - i) + i] = 1
        v3 = 23 - i
        v4 = 24 * i
    else:
        buf1[25 * i] = 1
        v3 = 23 - i
        v4 = 24 * v3
    
    buf1[v3 + v4] = 1
 
flag = b'b' * 484 
 
print(flag)
 
cnt = 0
for j in range(2, 24, 1):
    for k in range(2, 24, 1):
        idx = cnt
        cnt += 1
        buf[26 * j + k] = flag[idx]
 
codegate = b'C0D3GAT3'
 
for m in range(1, 25, 1):
    for n in range(1, 25, 1):
        if buf[26 * m + n] == 0:
            buf[26 * m + n] = codegate[(n - 1 + m - 1) % 8]
 
buf2 = calculate(buf, buf2) 
buf2 = rotate_matrix_clockwise(buf2)
buf3 = matrix_multiply(buf2, buf1, buf3)
buf2 = matrix_multiply(buf1, buf3, buf2)
buf2 = rotate_matrix_counter_clockwise(buf2)
buf4 = modular_matrix(buf2, first, buf4)
buf5 = matrix_multiply(buf4, second, buf5)
buf6 = modular_matrix(buf5, third, buf6)
buf7 = modular_matrix(buf5, fourth, buf7)
 
print((buf6))
 
cmp = [0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000013, 0x0000003D, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000001, 0x0000000C, 0x0000003D, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000004, 0x0000000C, 0x0000000C, 0x00000036, 0x00000036, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000050, 0x0000000C, 0x0000000C, 0x0000000C, 0x0000000C, 0x0000003D, 0x00000006, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000005, 0x00000041, 0x0000000C, 0x0000003D, 0x00000036, 0x0000003D, 0x00000012, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000000C, 0x0000003D, 0x0000000C, 0x00000036, 0x0000000C, 0x0000001F, 0x00000013, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000004F, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000018, 0x0000000C, 0x00000036, 0x0000000C, 0x0000003D, 0x00000036, 0x0000001C, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003E, 0x00000054, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003F, 0x0000003D, 0x00000036, 0x0000000C, 0x0000003D, 0x0000003D, 0x00000038, 0x00000037, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000016, 0x00000054, 0x00000003, 0x00000054, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000051, 0x0000000C, 0x0000003D, 0x0000003D, 0x0000003D, 0x0000003D, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000043, 0x00000054, 0x00000054, 0x00000054, 0x00000054, 0x00000044, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000034, 0x0000003D, 0x0000003D, 0x0000000C, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000029, 0x00000003, 0x00000003, 0x00000054, 0x00000003, 0x00000032, 0x0000003C, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000026, 0x00000046, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000019, 0x0000001F, 0x0000003B, 0x0000003B, 0x00000037, 0x00000054, 0x00000054, 0x00000054, 0x00000003, 0x00000049, 0x00000001, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000012, 0x00000049, 0x0000002F, 0x0000002C, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003D, 0x00000042, 0x0000002F, 0x00000003, 0x00000054, 0x00000054, 0x0000003F, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000026, 0x00000054, 0x0000000C, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000010, 0x00000032, 0x00000003, 0x00000003, 0x00000003, 0x00000054, 0x00000041, 0x00000040, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000006, 0x00000010, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000027, 0x00000031, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000000D, 0x00000032, 0x00000042, 0x00000003, 0x00000054, 0x00000054, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000001D, 0x00000027, 0x00000027, 0x0000004B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000020, 0x00000032, 0x00000054, 0x00000049, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000047, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x0000004B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000004C, 0x00000044, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000053, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x00000027, 0x0000004A, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000022, 0x00000027, 0x00000024, 0x00000027, 0x00000024, 0x00000024, 0x0000000F, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000004D, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x00000022, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000004F, 0x00000021, 0x0000001D, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x00000009, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000014, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000052, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000004E, 0x00000024, 0x00000024, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000000A]
 
for ii in range(24):
    for jj in range(24):
        if buf6[24 * ii + jj] != cmp[24 * ii + jj]:
            print("Wrong")
            exit(1)

Remember that the third_buf and fourth_buf are literally negative number arrays. Last step is reverse each step. My solve script

from sage.all import *
buf = [0] * 676
buf1 = [0] * 576
buf2 = [0] * 576
buf3 = [0] * 576
buf4 = [0] * 576
buf5 = [0] * 576
buf6 = [0] * 576
buf7 = [0] * 576
buf8 = [0] * 576
 
first = [0x00000054, 0x00000012, 0x00000002, 0x00000002, 0x0000004C, 0x00000041, 0x00000033, 0x00000051, 0x0000003F, 0x0000000C, 0x00000006, 0x00000018, 0x00000040, 0x00000043, 0x00000034, 0x00000047, 0x0000005F, 0x00000022, 0x00000062, 0x00000021, 0x0000005E, 0x0000001A, 0x00000027, 0x0000004D, 0x00000033, 0x00000056, 0x00000048, 0x0000002C, 0x00000010, 0x00000004, 0x00000049, 0x00000002, 0x0000001C, 0x00000028, 0x0000004D, 0x0000001C, 0x0000003F, 0x0000002B, 0x00000017, 0x00000019, 0x00000027, 0x00000042, 0x00000052, 0x00000046, 0x0000003C, 0x00000000, 0x00000039, 0x00000041, 0x00000029, 0x00000009, 0x00000062, 0x00000027, 0x00000015, 0x00000017, 0x0000001A, 0x0000001D, 0x00000019, 0x00000048, 0x00000056, 0x00000012, 0x00000000, 0x00000004, 0x00000037, 0x0000004A, 0x0000003F, 0x00000000, 0x0000004B, 0x00000019, 0x0000003F, 0x00000037, 0x00000039, 0x00000024, 0x0000000E, 0x00000059, 0x00000015, 0x000000B8, 0x00000011, 0x0000003D, 0x00000009, 0x00000021, 0x00000046, 0x00000025, 0x00000063, 0x0000003F, 0x00000004, 0x00000017, 0x00000059, 0x0000005F, 0x0000003E, 0x00000061, 0x00000051, 0x0000001E, 0x00000052, 0x00000036, 0x00000001, 0x0000001B, 0x00000025, 0x0000000C, 0x00000013, 0x0000003A, 0x0000008C, 0x00000061, 0x00000044, 0x0000002E, 0x00000022, 0x00000022, 0x0000003E, 0x00000062, 0x00000039, 0x00000056, 0x0000003E, 0x0000001E, 0x0000002C, 0x0000003B, 0x00000032, 0x0000000D, 0x00000032, 0x0000004F, 0x0000004C, 0x00000043, 0x00000060, 0x00000032, 0x0000002D, 0x00000015, 0x00000055, 0x000000AE, 0x00000006, 0x0000005A, 0x00000022, 0x00000011, 0x00000053, 0x00000055, 0x0000002F, 0x0000001B, 0x0000001D, 0x00000013, 0x0000000B, 0x00000026, 0x00000038, 0x00000021, 0x00000059, 0x0000000A, 0x00000033, 0x00000052, 0x00000062, 0x0000000F, 0x00000018, 0x00000053, 0x0000002B, 0x0000002C, 0x0000008A, 0x00000001, 0x00000034, 0x00000049, 0x0000004D, 0x00000003, 0x00000025, 0x00000009, 0x0000003F, 0x00000018, 0x0000005D, 0x0000003C, 0x0000002C, 0x00000024, 0x00000044, 0x00000011, 0x00000001, 0x00000018, 0x00000028, 0x00000038, 0x0000003A, 0x0000004D, 0x0000001F, 0x00000045, 0x0000000F, 0x00000010, 0x00000034, 0x0000000C, 0x0000001A, 0x0000002E, 0x0000005E, 0x00000001, 0x00000031, 0x00000059, 0x00000006, 0x00000033, 0x00000039, 0x00000007, 0x00000005, 0x0000004A, 0x0000000B, 0x00000035, 0x00000062, 0x00000041, 0x0000001B, 0x00000015, 0x00000060, 0x00000031, 0x00000019, 0x00000027, 0x0000009C, 0x0000004D, 0x00000027, 0x0000004F, 0x0000004F, 0x00000021, 0x00000007, 0x00000038, 0x00000063, 0x00000032, 0x0000002A, 0x00000058, 0x0000000F, 0x0000002F, 0x0000005F, 0x00000015, 0x0000003B, 0x00000011, 0x0000004F, 0x0000005E, 0x0000002D, 0x00000005, 0x0000000F, 0x0000000E, 0x00000029, 0x00000042, 0x00000026, 0x0000003C, 0x00000013, 0x0000004F, 0x00000012, 0x0000002B, 0x00000041, 0x00000011, 0x00000009, 0x00000006, 0x00000041, 0x00000038, 0x0000000E, 0x00000007, 0x00000044, 0x0000002B, 0x00000001, 0x0000003E, 0x0000001A, 0x00000053, 0x00000043, 0x0000002C, 0x00000003, 0x0000000C, 0x00000032, 0x00000000, 0x0000004F, 0x0000000F, 0x0000005B, 0x00000060, 0x00000058, 0x00000047, 0x0000004B, 0x00000010, 0x00000006, 0x0000000A, 0x00000031, 0x00000047, 0x00000019, 0x00000010, 0x00000035, 0x0000000A, 0x0000004E, 0x00000006, 0x00000017, 0x00000007, 0x00000056, 0x0000004C, 0x0000003B, 0x00000058, 0x00000018, 0x00000018, 0x0000002E, 0x0000004B, 0x00000050, 0x00000008, 0x00000042, 0x0000001D, 0x0000002E, 0x00000059, 0x00000059, 0x00000034, 0x0000005E, 0x00000016, 0x00000042, 0x00000004, 0x00000012, 0x00000047, 0x00000020, 0x00000021, 0x00000002, 0x00000020, 0x00000034, 0x00000005, 0x00000078, 0x00000044, 0x00000015, 0x00000040, 0x00000060, 0x0000002A, 0x00000059, 0x00000027, 0x00000017, 0x00000062, 0x0000005B, 0x00000060, 0x00000017, 0x0000004B, 0x00000046, 0x00000008, 0x00000027, 0x00000055, 0x00000059, 0x00000042, 0x0000000B, 0x00000060, 0x0000001E, 0x00000058, 0x00000051, 0x00000096, 0x0000003D, 0x00000019, 0x00000032, 0x00000030, 0x00000055, 0x00000056, 0x00000056, 0x00000050, 0x00000041, 0x0000001C, 0x0000004C, 0x00000006, 0x00000000, 0x0000004C, 0x00000005, 0x0000002A, 0x00000018, 0x00000035, 0x00000012, 0x00000051, 0x00000003, 0x00000019, 0x00000052, 0x00000034, 0x00000046, 0x00000008, 0x0000000D, 0x00000056, 0x0000003A, 0x00000036, 0x00000049, 0x0000002B, 0x00000047, 0x00000046, 0x00000047, 0x00000015, 0x00000048, 0x00000053, 0x0000004A, 0x00000018, 0x00000024, 0x00000043, 0x00000009, 0x00000028, 0x00000018, 0x00000026, 0x0000000C, 0x00000036, 0x00000005, 0x00000070, 0x00000061, 0x0000004D, 0x00000011, 0x00000027, 0x00000023, 0x00000039, 0x00000013, 0x00000058, 0x00000043, 0x0000001D, 0x0000000B, 0x00000034, 0x0000000F, 0x00000019, 0x00000036, 0x00000025, 0x00000058, 0x00000043, 0x00000055, 0x00000058, 0x0000003A, 0x00000040, 0x00000053, 0x00000033, 0x00000052, 0x0000000A, 0x00000036, 0x00000059, 0x0000003B, 0x00000009, 0x00000031, 0x00000059, 0x0000004F, 0x00000056, 0x0000004D, 0x00000016, 0x00000054, 0x00000059, 0x0000001F, 0x0000001B, 0x00000041, 0x00000060, 0x0000000A, 0x00000051, 0x0000004C, 0x00000047, 0x00000011, 0x0000004E, 0x00000046, 0x0000007A, 0x0000000C, 0x0000003D, 0x00000019, 0x0000000E, 0x0000002C, 0x00000029, 0x0000004E, 0x00000017, 0x00000019, 0x0000003F, 0x00000007, 0x0000000B, 0x0000002E, 0x00000028, 0x00000052, 0x00000004, 0x0000005E, 0x0000005E, 0x0000005B, 0x00000007, 0x0000001D, 0x0000000C, 0x00000004, 0x00000000, 0x00000012, 0x00000022, 0x0000004E, 0x00000049, 0x00000025, 0x00000034, 0x00000047, 0x00000006, 0x00000037, 0x0000002D, 0x00000029, 0x00000002, 0x0000005E, 0x00000034, 0x00000030, 0x00000016, 0x00000016, 0x00000049, 0x0000003B, 0x00000001, 0x0000004C, 0x00000010, 0x00000041, 0x00000043, 0x0000001E, 0x00000022, 0x00000034, 0x0000005C, 0x00000021, 0x00000002, 0x0000005F, 0x00000018, 0x00000022, 0x0000000B, 0x00000026, 0x00000005, 0x00000002, 0x0000004A, 0x0000003B, 0x0000003C, 0x0000000B, 0x0000001C, 0x0000004B, 0x00000032, 0x0000005B, 0x00000015, 0x00000037, 0x00000022, 0x00000020, 0x0000005C, 0x000000C0, 0x0000005C, 0x00000028, 0x0000004B, 0x00000036, 0x00000010, 0x00000053, 0x0000005C, 0x0000001C, 0x00000051, 0x00000000, 0x0000004F, 0x00000051, 0x0000005B, 0x0000001A, 0x00000021, 0x00000052, 0x00000022, 0x0000003E, 0x0000000C, 0x0000000F, 0x0000001E, 0x00000034, 0x0000000D, 0x00000018, 0x0000001E, 0x0000004B, 0x00000030, 0x0000005C, 0x00000029, 0x00000014, 0x0000005A, 0x00000054, 0x0000002E, 0x00000027, 0x0000000E, 0x0000005F, 0x00000033, 0x0000001F, 0x0000001C, 0x00000036, 0x00000040, 0x0000003D, 0x00000040, 0x00000010, 0x0000005B, 0x00000044, 0x0000000A, 0x00000025, 0x00000042, 0x00000030, 0x00000004, 0x00000004, 0x00000010, 0x00000033, 0x0000005B, 0x00000009, 0x0000002E, 0x0000001A, 0x0000003B, 0x0000002D, 0x00000058, 0x00000059, 0x00000008, 0x0000005B, 0x00000022, 0x00000020, 0x00000000, 0x0000003A, 0x00000043, 0x0000002F, 0x0000002F, 0x0000000B, 0x00000054, 0x00000018, 0x0000008A]
second = [0x000006C6, 0x0000B350, 0x0000FB2A, 0x0000A846, 0x0000ABD5, 0x0000FBBA, 0x00000D20, 0x0000B2C4, 0x00000BD5, 0x0000A4F3, 0x00004064, 0x0000BDCF, 0x00008511, 0x00002911, 0x0000C4BD, 0x000065B6, 0x00007010, 0x00001F43, 0x000020F1, 0x00007268, 0x00006EF8, 0x00001524, 0x0000F6A8, 0x000003A2, 0x000037CB, 0x0000C40F, 0x00009720, 0x000013D2, 0x000003AA, 0x00004671, 0x0000C1FC, 0x00002147, 0x0000F9EF, 0x0000B8AA, 0x000081EF, 0x00001F7A, 0x0000DEAA, 0x000089BF, 0x0000C101, 0x00002992, 0x0000E50D, 0x000080D5, 0x0000A7C2, 0x000005D2, 0x000009DF, 0x0000AE25, 0x0000CB5E, 0x0000A5A9, 0x00009763, 0x0000BAF2, 0x000086F8, 0x00009BFC, 0x00004435, 0x000070B3, 0x0000AB91, 0x000044F4, 0x00004495, 0x0000E241, 0x000043C9, 0x0000CC02, 0x0000A778, 0x00005031, 0x00009994, 0x0000DBE1, 0x0000E6CC, 0x0000F905, 0x00007ED4, 0x0000713A, 0x00001E87, 0x0000A621, 0x0000E3C5, 0x00002DCF, 0x000095C2, 0x0000F961, 0x0000A7E3, 0x0000FAD7, 0x00002244, 0x0000E219, 0x00007FFC, 0x00004CCD, 0x000005B2, 0x00003594, 0x0000F6DD, 0x00006037, 0x00002C8F, 0x000005B3, 0x00003DB5, 0x00005361, 0x00009025, 0x0000DB95, 0x0000B3C9, 0x00006450, 0x0000AE6E, 0x0000F74F, 0x0000B761, 0x0000F9D0, 0x000000A9, 0x0000F10C, 0x0000ECBD, 0x0000C698, 0x00000C22, 0x00007EB8, 0x0000EAA5, 0x0000AB78, 0x0000437F, 0x0000BF50, 0x00009DA0, 0x000070E1, 0x0000DBE8, 0x00009B40, 0x0000B9A5, 0x0000CBF4, 0x0000E492, 0x0000B5F6, 0x0000919F, 0x00004B33, 0x00009EEF, 0x00005E9A, 0x0000FFC0, 0x00000AB7, 0x0000F3BF, 0x00008283, 0x000041DF, 0x00007773, 0x000081B4, 0x0000BA07, 0x00000FD6, 0x00008FD3, 0x00005D0F, 0x000033B1, 0x0000F5B0, 0x0000FFBB, 0x000047B5, 0x0000E9F7, 0x0000D783, 0x0000A9E6, 0x000096C1, 0x00001816, 0x0000C30A, 0x0000A3CD, 0x00007884, 0x0000B1EC, 0x00000C61, 0x00000F77, 0x0000B14A, 0x00008AFF, 0x0000C779, 0x0000626D, 0x0000D759, 0x00006C81, 0x0000CC5D, 0x0000BD1A, 0x000095F5, 0x00005D61, 0x00009C9E, 0x00006293, 0x00002911, 0x00009758, 0x0000B6D0, 0x00005BD4, 0x00003B98, 0x0000DC7F, 0x0000F27C, 0x00009816, 0x0000DE49, 0x00008575, 0x0000D547, 0x00006E36, 0x00008635, 0x00003E95, 0x0000D8C6, 0x000024C7, 0x00006B58, 0x00009CEF, 0x0000EA8C, 0x0000582C, 0x0000C9E0, 0x0000BD3D, 0x0000BC4E, 0x0000D00C, 0x00003C61, 0x0000C9F7, 0x0000E213, 0x00004893, 0x000051C6, 0x0000A72F, 0x0000E1F4, 0x0000F767, 0x00001A78, 0x00008D4F, 0x0000423B, 0x0000DA35, 0x0000ED13, 0x0000228B, 0x0000CD29, 0x00009F34, 0x0000997D, 0x00005D1E, 0x0000C18A, 0x00006159, 0x00006986, 0x00003C38, 0x0000A076, 0x0000FC28, 0x00006FC4, 0x00008751, 0x000096E0, 0x0000FAFD, 0x000052C6, 0x00004906, 0x00001173, 0x0000045C, 0x0000DD70, 0x000045F3, 0x00005044, 0x000092AE, 0x0000428A, 0x000029D8, 0x0000C652, 0x0000679D, 0x0000213F, 0x0000BF03, 0x0000F0C1, 0x00000E6A, 0x0000BDD8, 0x00004591, 0x0000B5B9, 0x00002558, 0x0000A92D, 0x0000C886, 0x0000C02F, 0x000089CF, 0x00005395, 0x0000C578, 0x00002078, 0x00004ADF, 0x0000C6FF, 0x00006EC1, 0x00004A15, 0x00001309, 0x0000FDED, 0x0000468C, 0x00008FEB, 0x0000AEEA, 0x0000D873, 0x00001B87, 0x0000E75B, 0x000080B5, 0x0000236D, 0x00007097, 0x00006857, 0x00006B43, 0x000002BC, 0x000091EA, 0x0000B01D, 0x0000777A, 0x0000B692, 0x00003918, 0x0000D1CF, 0x0000959E, 0x00000572, 0x000059C7, 0x0000D4FA, 0x0000D9AB, 0x0000904F, 0x00005D27, 0x0000396C, 0x00004B82, 0x000085F2, 0x0000A2F0, 0x0000C88A, 0x000088E5, 0x0000F4E2, 0x00006988, 0x00006496, 0x00004035, 0x00003D0E, 0x000015DC, 0x0000B6DD, 0x0000CBE4, 0x00002D92, 0x0000418F, 0x00009AD4, 0x0000AEDC, 0x0000FA46, 0x000025E7, 0x000022A8, 0x0000AEE5, 0x00001798, 0x0000DFBD, 0x0000CD93, 0x0000058E, 0x000027DC, 0x0000EAFF, 0x0000AB5A, 0x000037AB, 0x0000B78F, 0x00005E02, 0x00008E73, 0x00003AEC, 0x0000F80C, 0x0000711A, 0x0000914C, 0x0000DD62, 0x0000E2D3, 0x00006DFE, 0x00003597, 0x000025C5, 0x0000AD18, 0x0000E45F, 0x00003808, 0x0000EB56, 0x000033EA, 0x00006D19, 0x0000FBCC, 0x0000A388, 0x0000B0FD, 0x0000C271, 0x0000ED90, 0x00004095, 0x0000440F, 0x0000262D, 0x0000B512, 0x0000623A, 0x00006410, 0x000062A5, 0x00006995, 0x0000A000, 0x0000BAF9, 0x0000E445, 0x00002465, 0x0000A65E, 0x0000B603, 0x0000C209, 0x0000B159, 0x00006C32, 0x0000011D, 0x00003C2E, 0x0000B23D, 0x0000B479, 0x00009D4F, 0x0000EF2F, 0x0000833E, 0x0000FE0F, 0x00002EB3, 0x00008B7B, 0x000061DB, 0x00001DC6, 0x00006534, 0x000037F1, 0x0000908F, 0x00000D7D, 0x0000D25A, 0x0000C690, 0x00000B29, 0x00003220, 0x0000097F, 0x0000321A, 0x0000CAC4, 0x000007AB, 0x000073AE, 0x0000DB4E, 0x00004A65, 0x000096A0, 0x000064F0, 0x00005F45, 0x00001E77, 0x00002DE3, 0x0000DD0C, 0x0000A4C8, 0x000033DF, 0x0000FACF, 0x000029B1, 0x000007CB, 0x000024AB, 0x00002A19, 0x000043F2, 0x00003293, 0x0000C952, 0x000083EE, 0x00000E01, 0x0000424C, 0x00002CCC, 0x000021CB, 0x0000701F, 0x00004A27, 0x00004E30, 0x00004ADC, 0x00000846, 0x0000DA65, 0x0000E1F1, 0x0000D6CF, 0x000015C1, 0x0000ED78, 0x0000CFF2, 0x00001C69, 0x0000EF05, 0x0000DD53, 0x00002BB9, 0x00001401, 0x00000EFD, 0x00007031, 0x0000EFD9, 0x00005790, 0x000014B8, 0x0000A5C6, 0x0000FA73, 0x00001F8C, 0x00006171, 0x0000A46B, 0x0000C524, 0x00008A78, 0x00002DC3, 0x000061BC, 0x000004A2, 0x0000DDC4, 0x000073C4, 0x00008C50, 0x0000CFBC, 0x00003388, 0x000073F0, 0x0000E94C, 0x000085CE, 0x000020BC, 0x00008F08, 0x000067E7, 0x0000E5C8, 0x000069BD, 0x000046BF, 0x000069E4, 0x0000F024, 0x0000F5BB, 0x0000AB91, 0x00000C32, 0x000057E8, 0x0000CC30, 0x0000C68A, 0x0000A5F3, 0x0000EFBF, 0x00005F74, 0x00000E7F, 0x0000397F, 0x0000F02B, 0x00002E51, 0x00000FFE, 0x000032CE, 0x0000F66A, 0x0000A69D, 0x000093B1, 0x0000E53F, 0x0000F854, 0x000060B8, 0x0000A7A2, 0x0000EF57, 0x00006A86, 0x0000C3CA, 0x000093E4, 0x0000B2F1, 0x00000590, 0x00008CC5, 0x0000EEB7, 0x0000663D, 0x00006311, 0x0000DB16, 0x00009294, 0x00008299, 0x000000BD, 0x0000FCA1, 0x0000D53F, 0x00007E60, 0x0000FF44, 0x0000A42C, 0x0000A8F1, 0x00005175, 0x0000E9A0, 0x0000EB14, 0x0000DB64, 0x0000B072, 0x00003179, 0x000059D2, 0x0000B7FF, 0x00002EE0, 0x0000FD00, 0x000042FD, 0x000017FB, 0x0000A871, 0x0000D3CE, 0x000073B9, 0x0000532C, 0x00002449, 0x000045A8, 0x0000E49A, 0x0000C3CB, 0x00004497, 0x00005841, 0x000011D7, 0x00007D08, 0x000046C3, 0x0000CF5E, 0x0000705C, 0x0000C024, 0x0000D07C, 0x00007F16, 0x00009D97, 0x00003E91, 0x0000249F, 0x0000E9A7, 0x000014E5, 0x00008C35, 0x00007A6D, 0x0000F3E9, 0x0000B8F6, 0x0000DCDD, 0x0000449D, 0x0000A524, 0x00000F38, 0x00004510, 0x0000589D, 0x000078A1, 0x00004ABA, 0x0000A3E5, 0x000009D3, 0x0000F34B, 0x00005705, 0x0000DA4D, 0x00003330, 0x00001949, 0x00002949, 0x0000CE6C, 0x00005299, 0x00000340, 0x0000C795, 0x000098C2, 0x0000D611, 0x00006212, 0x0000B043, 0x00003253, 0x0000FCF1, 0x0000593C, 0x00003496, 0x000008D5, 0x0000F597, 0x00007436, 0x0000E146, 0x0000CE9A, 0x0000FDF3, 0x0000B57C, 0x000059AA, 0x00008F34, 0x00006A4E, 0x000022F9, 0x0000DB15, 0x000002CA, 0x00001DE0, 0x00001E5B, 0x00003A0F, 0x0000AB47, 0x00007280, 0x000016BD, 0x0000826B, 0x0000FFEF, 0x000069A4, 0x00000E62, 0x0000674E, 0x0000CDC3, 0x00002381, 0x00001187, 0x000012CC, 0x0000D668, 0x00004DCF, 0x000089AC, 0x000075B6, 0x000095CD, 0x00001915, 0x0000D51E, 0x000078B2]
third = [-115, 0, 15, 1, -21, 49, -24, 5, 42, -2, -16, -9, 40, 46, 56, -34, 16, -25, 39, 26, 23, 42, -56, 0, -31, -15, 7, -14, 11, 22, 13, -33, -9, 40, 31, 54, -19, -26, -20, 12, 30, 14, 44, -14, 49, -4, -4, 25, 53, 8, -45, 20, -5, 58, 16, -15, 18, 59, 45, 23, 50, 51, -33, 11, 46, -34, -15, -9, -46, -50, 3, -35, 9, 39, -13, -127, 19, -40, 30, 21, -40, 32, 37, -20, 30, 30, 29, 25, 3, 18, -12, -58, -44, -76, 39, -55, -18, -34, 4, -16, -19, -9, -4, -35, 31, -32, 0, 59, 5, 23, 29, -40, -30, -1, 54, -13, -1, -31, 36, 56, 17, 16, -40, 18, 9, -129, 36, -33, 0, -23, 23, 43, 3, 30, 10, -4, -40, 3, -42, -40, 10, -22, 28, -36, 24, -6, -20, -2, -25, 17, -53, -6, -18, 49, -16, 14, -1, 27, -12, -72, -10, -38, -4, 0, 53, 26, 23, -28, 56, 26, 2, 57, -38, -18, 14, -123, 48, 38, -29, -12, -12, 18, -38, 31, 59, -27, -44, -56, 27, -33, -29, 19, 54, 22, -14, -29, 16, -31, 46, 30, -34, 72, -94, 24, 41, 52, -9, -13, -33, -9, 56, -5, 25, 54, 3, 43, -13, 49, 56, 36, 43, -27, 53, -15, 7, -94, 83, -28, -28, 31, 23, -29, 44, -40, -31, 3, 0, 58, 60, -42, -40, -27, 55, 46, -36, -22, -45, 25, -9, 22, 24, -2, 12, -30, 35, 32, 11, -2, 29, -32, -33, 42, -53, 22, -34, -30, 33, -2, 2, 23, -28, 58, -95, -7, 20, 23, -16, 57, -12, -75, -3, 19, -26, 58, 49, -19, 45, 33, 57, 21, 47, 16, 18, 15, -22, 6, 59, -12, -25, 45, 39, 1, 27, -2, 41, -73, 25, 6, 8, -24, 9, 11, -29, 40, -26, 26, -77, -45, -88, -30, -95, 34, -28, 1, -40, -113, 2, 6, -6, -4, -34, 27, -37, -12, -11, 35, 27, 2, 9, 13, -31, -6, 12, -14, -16, -10, 34, -9, 25, -19, -115, -9, -22, -1, 9, 41, -46, -53, -60, 28, -36, -22, 18, 34, 25, 48, 50, 27, -51, -24, 45, 71, -38, -15, 32, 51, -24, 15, 45, 5, -55, 23, 8, 38, 43, 19, 22, -39, -37, -14, -4, -34, 8, -19, -13, 43, -36, -39, 28, 24, 63, -54, 8, -23, -27, -50, 34, 36, 38, -5, 40, -3, -8, -6, 35, -17, 26, 35, 30, -19, -37, 8, 0, -29, -57, -61, -54, 0, -16, 59, -13, -39, -14, -26, 55, 0, 58, 24, 39, 21, 44, -22, 22, -38, -17, 3, 57, -20, -10, 2, 14, -10, 21, -40, 8, 21, -30, -18, -35, -21, -3, -3, -8, 45, -28, 8, 20, -38, -29, -40, -40, 69, 20, -19, 28, 22, 15, 13, -34, -26, -29, -19, -32, -14, 38, -37, 27, 54, -30, -38, 56, 39, -15, 43, -35, -3, 31, -53, -9, -47, -58, 3, 12, 25, 45, 52, -38, -10, 14, -17, -29, 12, 41, 23, -39, 16, -30, 5, 3, 27, 5, 21, 16, 41, 33, -128, 17, 23, 34, 51, 23, 22, 20, -2, 39, 55, 14, 40, 48, 56, 57, 4, 37, -23, 27, 2, 5, 35, 27, -16, -66, -39, 15, 40, -24, -29, -2, -5, 54, -25, 20, 59, -8, 8, -11, -4, 15, 58, 42, -38, -11, 31, 50, 6, 37, -56]
fourth = [-147, 0, 15, 1, -21, 49, -24, 5, 42, -2, -16, -9, 40, 46, 56, -34, 16, -25, 39, 26, 23, 42, -16, -2, -29, -62, 17, -14, 11, 22, 13, -33, -9, 40, 31, 54, -19, -26, -20, 12, 30, 14, 44, -14, 49, 54, 43, 23, 48, -39, -43, 22, -53, 58, 16, -15, 18, 59, 45, 23, 50, 51, -33, 11, 46, -34, -15, 46, 1, -3, 8, -30, -49, 41, -60, -125, -28, -68, -21, 21, -40, 32, 37, -20, 30, 30, 29, 25, 3, -3, 35, -11, 3, -29, 37, -2, -18, -67, 6, -63, -66, -7, -51, -63, -11, -32, 0, 59, 5, 23, 29, 14, -36, 46, 52, -8, -3, 10, 36, 56, 17, 16, -40, 11, -38, -134, 31, -31, -5, -26, 23, 43, 3, 30, 57, -6, 7, 8, 5, -12, 50, -22, 28, -36, 24, -6, -65, -49, -72, 12, -51, -11, -19, 49, 4, -42, -1, 27, -12, -37, 37, -33, 43, -2, 58, 57, 23, -28, 8, 28, -45, 10, -43, -12, -23, -123, 48, 1, -26, -84, -59, 17, -38, 31, 55, -29, -39, -9, 25, -35, -26, 23, 56, -25, -61, -76, 13, -31, 46, 6, -44, 49, -85, -6, -6, 5, -7, -32, -33, -9, 34, 42, 23, 52, 1, 41, -18, 51, 51, -16, 43, -52, -2, -34, -65, -166, 53, -35, -22, 33, -24, -76, -3, -19, -31, 3, 7, 56, 58, 5, -45, -43, 55, -8, -16, 36, -36, -47, 0, 33, 23, -2, 12, -77, -12, 55, 2, 0, 1, -39, -33, 42, -19, 50, -34, -30, 37, -27, -23, -2, 28, 44, -37, -7, 20, 23, -16, 57, -12, -34, -17, 31, -11, 58, 49, -19, 45, 33, 57, 21, 27, -6, -9, 4, 11, -39, 11, -39, -48, 22, 16, -22, 4, -1, -7, -49, 2, -14, -15, -24, 9, 11, -29, 40, -26, 26, -57, -59, -55, 3, -62, -14, -57, -27, -63, -136, -21, 36, 17, -27, -64, 27, -37, -12, 9, 45, 27, 2, 9, 13, -31, 14, 56, -34, -36, 23, -14, -57, 5, -42, -128, -15, -35, -1, 9, 41, -16, -33, -40, 12, -36, -22, 18, 34, 25, 48, 50, 27, -24, -2, -3, 34, -61, -37, 32, 51, -24, 15, 33, 28, -32, 46, 31, 22, 43, 19, 22, -39, -37, -14, -4, -34, 8, -7, -53, 11, -59, -84, 28, 24, 39, -31, 31, 0, -4, -30, 19, 36, 36, -28, 17, -26, -31, -29, 12, -46, 26, 47, 7, -30, -37, 8, 25, -9, -34, -41, -31, 23, 28, 59, -13, -39, -16, -49, 32, -23, 35, 1, 16, -8, 44, -30, 22, -38, -17, 3, 39, 3, 13, 25, 37, 13, 46, -40, 8, 21, -30, -18, -55, -44, -26, -26, -31, 31, -28, 8, 20, -38, -29, -40, -40, 49, 46, 11, 51, 45, 38, 36, 16, -26, -52, -42, -55, -37, 15, -67, 27, 54, -30, -38, 56, 39, -15, 43, -35, -3, 31, -14, 14, -24, -35, 26, 35, 48, 22, 29, -58, -30, -29, -17, -29, 12, 41, 23, -39, 16, -30, 5, 3, 27, 5, 21, 16, 18, 56, -105, 40, 46, 11, 28, 45, 22, 20, -2, 39, 55, 14, 40, 48, 56, 57, 4, 37, -23, 27, 2, 5, 35, 27, -35, -43, -16, -19, 40, -24, -29, -2, -5, 54, -25, 20, 59, -8, 8, -11, -4, 15, 58, 42, -38, -11, 31, 50, 6, 37, -7]
 
F = Zmod(0xFFFF)
first = matrix(F,24,24, first)
second = matrix(F,24, 24, second)
third = matrix(F,24, 24, third)
fourth = matrix(F,24, 24, fourth)
def rotate_matrix_counter_clockwise(buf):
    for i in range(12): 
        for j in range(24):
            v4 = buf[24 * j + i]
            buf[24 * j + i] = buf[24 * i + (23 - j)] 
            buf[24 * i + (23 - j)] = buf[24 * (23 - j) + (23 - i)]  
            buf[24 * (23 - j) + (23 - i)] = buf[24 * (23 - i) + j] 
            buf[24 * (23 - i) + j] = v4 
    
    return buf
 
def rotate_matrix_manner_clockwise(buf):
    for i in range(12): 
        for j in range(24):
            v4 = buf[24 * j + i]
            buf[24 * j + i] = buf[24 * (23 - i) + j]
            buf[24 * (23 - i) + j] = buf[24 * (23 - j) + 23 - i]
            buf[24 * (23 - j) + 23 - i] = buf[24 * i + 23 - j]
            buf[24 * i + 23 - j] = v4
    return buf
 
for i in range(12):
    if i & 1:
        buf1[24 * (23 - i) + i] = 1
        v3 = 23 - i
        v4 = 24 * i
    else:
        buf1[25 * i] = 1
        v3 = 23 - i
        v4 = 24 * v3
    
    buf1[v3 + v4] = 1
# cmp = [730, 25324, 35144, 36450, 22875, 54873, 19942, 39102, 21103, 10238, 62095, 56170, 14711, 34747, 9130, 63737, 17289, 45978, 58977, 39188, 35677, 652, 43300, 50538, 41108, 55588, 56307, 30453, 6228, 41275, 9243, 13799, 11013, 11301, 50547, 38292, 9102, 14156, 2287, 16955, 27598, 14867, 19785, 4529, 5475, 45062, 24977, 56264, 63233, 49026, 57502, 16738, 49346, 64210, 43195, 24008, 57017, 24487, 54769, 50836, 5262, 17061, 16186, 45012, 39008, 46428, 60834, 4075, 35547, 29039, 18771, 39486, 64079, 919, 55495, 53761, 37526, 9932, 30210, 47014, 62139, 13581, 58007, 9906, 59296, 24366, 15611, 39389, 57141, 2953, 14405, 59873, 12424, 34936, 31913, 21641, 22292, 17449, 5673, 61675, 16182, 16300, 44770, 53283, 34477, 30128, 16785, 40836, 51558, 328, 52420, 43833, 64282, 44988, 47449, 44171, 55755, 23089, 36312, 58341, 22421, 62102, 43469, 24876, 11318, 1092, 16661, 63176, 57497, 37300, 27611, 56569, 29482, 5486, 44421, 16618, 41330, 21521, 51234, 21914, 11810, 31765, 65163, 57348, 63545, 47824, 17395, 444, 62740, 39057, 41605, 30661, 5608, 32361, 8049, 14321, 35317, 60242, 53072, 54454, 33705, 9606, 54047, 3560, 61016, 21859, 35849, 55517, 12074, 10797, 40815, 5516, 33266, 64783, 46967, 62240, 51032, 15296, 63219, 46624, 34700, 51062, 31124, 8405, 55331, 62521, 617, 60008, 56399, 1471, 12648, 40385, 31418, 47397, 50371, 62471, 28146, 19323, 61247, 8792, 3086, 26349, 38926, 36575, 37120, 51582, 45666, 51789, 53787, 32937, 10222, 10151, 23572, 61974, 60306, 44875, 30013, 16868, 1878, 54893, 51178, 46736, 34645, 5531, 20893, 41006, 49411, 38167, 14461, 5663, 38402, 95, 12227, 20041, 4305, 47138, 2525, 5872, 19798, 46355, 6854, 30863, 12030, 61065, 41957, 34160, 26584, 59309, 22042, 57806, 34434, 42780, 19650, 10067, 12007, 17019, 48482, 49309, 2291, 16279, 45109, 40350, 43863, 840, 54055, 62600, 9168, 52569, 39435, 40523, 30295, 29497, 47009, 46988, 17176, 31590, 29987, 26186, 26702, 37472, 46738, 26441, 7035, 35099, 232, 28905, 11124, 54670, 39582, 19379, 63097, 59396, 47145, 56109, 14473, 18515, 17718, 31072, 35226, 31835, 46755, 13107, 52910, 32185, 56684, 30045, 26291, 2316, 13170, 3255, 3640, 35866, 424, 48521, 16456, 57664, 45989, 42905, 9807, 12302, 3310, 25372, 14713, 58731, 10478, 52411, 53304, 52011, 18321, 7962, 12943, 53910, 10041, 2095, 12029, 11835, 47563, 21905, 15400, 58650, 42562, 4331, 21121, 57535, 5826, 36606, 40514, 59837, 64362, 39444, 4764, 43487, 63077, 47805, 34270, 18338, 9193, 9050, 31382, 50822, 16936, 30443, 38641, 33035, 58840, 55861, 63227, 50763, 41893, 31781, 53605, 24017, 53764, 37206, 46398, 38248, 22600, 26256, 25065, 44683, 35959, 46255, 3594, 22204, 30821, 47324, 21690, 38127, 9898, 56151, 50799, 36629, 27416, 34493, 6754, 17657, 62792, 38139, 19635, 22564, 40476, 7353, 24268, 26130, 10885, 18117, 16911, 1100, 13317, 58031, 4756, 27150, 29951, 542, 47416, 59404, 29023, 35861, 49748, 32867, 48802, 46824, 57188, 314, 32510, 11344, 12210, 2248, 40174, 21388, 57470, 61657, 14114, 46043, 1403, 28409, 12314, 4299, 23627, 20477, 23575, 54429, 25920, 22777, 57396, 39561, 27046, 5140, 45711, 45289, 62867, 35400, 43892, 40860, 56224, 62340, 16782, 10295, 41623, 63652, 25221, 56584, 24780, 52513, 42182, 3641, 36366, 17661, 11449, 45564, 56581, 37111, 28941, 59197, 51885, 42623, 59304, 52076, 24993, 19471, 43658, 23010, 57884, 55781, 39692, 38850, 35745, 25643, 52027, 36314, 6622, 17281, 62856, 19279, 12027, 56560, 63846, 35338, 65146, 6600, 25004, 4696, 58711, 44044, 27558, 55987, 40552, 18950, 10298, 15423, 5072, 45779, 46590, 56948, 42065, 8240, 7431, 10164, 46066, 63241, 28570, 26299, 31422, 36797, 61379, 34860, 25379, 5260, 15041, 42823, 63063, 28113, 43398, 3297, 20708, 52045, 20512, 45045, 34896, 5424, 32646, 21027, 15269, 44815, 33780, 58545, 36959, 24015, 62939, 61316, 37201, 21046, 20710, 25997, 23155, 43449, 32136, 48822, 44444, 27390, 64193, 61870, 11184, 45037, 28818, 34590, 55146, 3298, 20146, 50199, 5041, 44832, 3407, 46283, 26510, 28043]
 
cmp = [0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000013, 0x0000003D, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000001, 0x0000000C, 0x0000003D, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000004, 0x0000000C, 0x0000000C, 0x00000036, 0x00000036, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000050, 0x0000000C, 0x0000000C, 0x0000000C, 0x0000000C, 0x0000003D, 0x00000006, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000005, 0x00000041, 0x0000000C, 0x0000003D, 0x00000036, 0x0000003D, 0x00000012, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000000C, 0x0000003D, 0x0000000C, 0x00000036, 0x0000000C, 0x0000001F, 0x00000013, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000004F, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000018, 0x0000000C, 0x00000036, 0x0000000C, 0x0000003D, 0x00000036, 0x0000001C, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003E, 0x00000054, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003F, 0x0000003D, 0x00000036, 0x0000000C, 0x0000003D, 0x0000003D, 0x00000038, 0x00000037, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000016, 0x00000054, 0x00000003, 0x00000054, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000051, 0x0000000C, 0x0000003D, 0x0000003D, 0x0000003D, 0x0000003D, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000043, 0x00000054, 0x00000054, 0x00000054, 0x00000054, 0x00000044, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000034, 0x0000003D, 0x0000003D, 0x0000000C, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000029, 0x00000003, 0x00000003, 0x00000054, 0x00000003, 0x00000032, 0x0000003C, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000026, 0x00000046, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000019, 0x0000001F, 0x0000003B, 0x0000003B, 0x00000037, 0x00000054, 0x00000054, 0x00000054, 0x00000003, 0x00000049, 0x00000001, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000012, 0x00000049, 0x0000002F, 0x0000002C, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003D, 0x00000042, 0x0000002F, 0x00000003, 0x00000054, 0x00000054, 0x0000003F, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000026, 0x00000054, 0x0000000C, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000010, 0x00000032, 0x00000003, 0x00000003, 0x00000003, 0x00000054, 0x00000041, 0x00000040, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000006, 0x00000010, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000027, 0x00000031, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000000D, 0x00000032, 0x00000042, 0x00000003, 0x00000054, 0x00000054, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000001D, 0x00000027, 0x00000027, 0x0000004B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000020, 0x00000032, 0x00000054, 0x00000049, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000047, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x0000004B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000004C, 0x00000044, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000053, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x00000027, 0x0000004A, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000022, 0x00000027, 0x00000024, 0x00000027, 0x00000024, 0x00000024, 0x0000000F, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000004D, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x00000022, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000004F, 0x00000021, 0x0000001D, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x00000009, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000014, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x00000052, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000004E, 0x00000024, 0x00000024, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000003B, 0x0000000A]
buf6 = matrix(F, 24, 24, cmp)
buf1 = matrix(F, 24, 24,buf1)
 
# a2[i,j] = target[i+2, j+2] + target[i+2, j+1] + target[i+2, j] + target[i+1, j+2] + target[i+1, j+1] + target[i+1, j] + target[i, j+2] + target[i, j+1] + target[i,j]
 
buf5 = buf6 - third
buf4 = buf5 * second.inverse()
buf2 = buf4 - first
buf2 = rotate_matrix_manner_clockwise(buf2.list())
buf2 = matrix(F, 24,24, buf2)
buf3 = buf1.inverse() * buf2 
buf2 = buf3 * buf1.inverse()
buf2 = rotate_matrix_manner_clockwise(buf2.list())
buf2 = list(map(int, buf2))
 
print(matrix(24,24,buf2))
target = [0] * 676
codegate = b'C0D3GAT3'
for m in range(1, 25, 1):
    for n in range(1, 25, 1):
        if m == 1 or n == 1 or m == 24 or n == 24:
            if target[26 * m + n] == 0:
                target[26 * m + n] = codegate[(n - 1 + m - 1) % 8]
flag = []
for i in range(22):
    for j in range(22):
        assert target[26*i + 54+j] == 0
        target[26*i + 54 + j] = buf2[24*i + j] - (target[26 * i +j] + target[26 * i + 53 + j] + target[26 * i + 52 + j] + target[26 * i + 28 + j] + target[26 * i + 27 + j] + target[26 * i + 26 + j] + target[26 * i + 2 + j] + target[26 * i + 1 + j])
        print(chr(target[26*i + 54 + j]), end="")

Sound out for my crypto brother for help me cook this challenge @tvdat20004.

-> codegate2025{01194af52dd977b3db288b1b8ce2be42b7a18ab86ea403843c346dd14af83767}

cha’s ELF

Control Flow Flattening + Crypto gogo bruhhh XD. This challenge uses technique CFF but only one single dispatcher which means it’s not that hard to cook. The program requires us to input 65 chars and than return encrypted text

Why 65 chars ? This is because at 0x000000000404210 and 0x0000000000404C10 will use last byte to generate key and nonce which can rewrite like this.

from pwn import *
 
sbox = b'c|w{\xf2ko\xc50\x01g+\xfe\xd7\xabv\xca\x82\xc9}\xfaYG\xf0\xad\xd4\xa2\xaf\x9c\xa4r\xc0\xb7\xfd\x93&6?\xf7\xcc4\xa5\xe5\xf1q\xd81\x15\x04\xc7#\xc3\x18\x96\x05\x9a\x07\x12\x80\xe2\xeb\'\xb2u\t\x83,\x1a\x1bnZ\xa0R;\xd6\xb3)\xe3/\x84S\xd1\x00\xed \xfc\xb1[j\xcb\xbe9JLX\xcf\xd0\xef\xaa\xfbCM3\x85E\xf9\x02\x7fP<\x9f\xa8Q\xa3@\x8f\x92\x9d8\xf5\xbc\xb6\xda!\x10\xff\xf3\xd2\xcd\x0c\x13\xec_\x97D\x17\xc4\xa7~=d]\x19s`\x81O\xdc"*\x90\x88F\xee\xb8\x14\xde^\x0b\xdb\xe02:\nI\x06$\\\xc2\xd3\xacb\x91\x95\xe4y\xe7\xc87m\x8d\xd5N\xa9lV\xf4\xeaez\xae\x08\xbax%.\x1c\xa6\xb4\xc6\xe8\xddt\x1fK\xbd\x8b\x8ap>\xb5fH\x03\xf6\x0ea5W\xb9\x86\xc1\x1d\x9e\xe1\xf8\x98\x11i\xd9\x8e\x94\x9b\x1e\x87\xe9\xceU(\xdf\x8c\xa1\x89\r\xbf\xe6BhA\x99-\x0f\xb0T\xbb\x16'
 
for seed in range(0xff):
    last = seed
    wtf = 0
    buf = []
    for i in range(32):
        index = last
        buf.append(sbox[index])
 
        if i == 0:
            wtf = index
        if (index % 8) != 7:
            tmp = index + 9
        else:
            tmp = index + 1
        
        last = tmp % 256
    print(bytearray(buf).hex())
    buf2 = [] 
    for i in range(12):
        index = wtf
        buf2.append(sbox[index])
        if (index % 21) != 20:
            tmp = index + 22
        else:
            tmp = index + 1
        
        wtf = tmp % 252
 
    print(bytearray(buf2).hex())

This is only the first stage is generate key and nonce. So how does it encrypt our input? If you remember in main function after all it will excute shellcode at this.

if ( n115935838 != 0xDC1083A7 )
    break;
    v9 = 0;
    n115935838 = 0x6546E9C1;
    encrypt();

Set breakpoint and step into it, you will see that you can’t make function because IDA is flow decompiler, it can’t find where will return back. To fix this just patch ret at here.

And then you’re good to go. This function is just ChaCha20 custom with const Codegate2025 Pre. Since we only need to brute last bytes to generate key and nonce, it’s quite fast to get flag. My finals script

#! /usr/bin/python3
# by pts@fazekas.hu at Thu May 24 18:44:15 CEST 2018
 
"""Pure Python 3 implementation of the ChaCha20 stream cipher.
 
It works with Python 3.5 (and probably also earler Python 3.x).
 
Based on https://gist.github.com/cathalgarvey/0ce7dbae2aa9e3984adc
Based on Numpy implementation: https://gist.github.com/chiiph/6855750
Based on http://cr.yp.to/chacha.html
 
More info about ChaCha20: https://en.wikipedia.org/wiki/Salsa20
"""
 
import struct
 
 
def yield_chacha20_xor_stream(key, iv, position=0):
  """Generate the xor stream with the ChaCha20 cipher."""
  if not isinstance(position, int):
    raise TypeError
  if position & ~0xffffffff:
    raise ValueError('Position is not uint32.')
  if not isinstance(key, bytes):
    raise TypeError
  if not isinstance(iv, bytes):
    raise TypeError
  if len(key) != 32:
    raise ValueError
 
 
  def rotate(v, c):
    return ((v << c) & 0xffffffff) | v >> (32 - c)
 
  def quarter_round(x, a, b, c, d):
    x[a] = (x[a] + x[b]) & 0xffffffff
    x[d] = rotate(x[d] ^ x[a], 16)
    x[c] = (x[c] + x[d]) & 0xffffffff
    x[b] = rotate(x[b] ^ x[c], 12)
    x[a] = (x[a] + x[b]) & 0xffffffff
    x[d] = rotate(x[d] ^ x[a], 8)
    x[c] = (x[c] + x[d]) & 0xffffffff
    x[b] = rotate(x[b] ^ x[c], 7)
 
  ctx = [0] * 16
  ctx[:4] = (1701080899, 1702125927, 892481586, 1701990432) # Codegate2025 Pre
  ctx[4 : 12] = struct.unpack('<8L', key)
  ctx[12] = position
  ctx[13 : 16] = struct.unpack('<LLL', iv)
  while 1:
    x = list(ctx)
    for i in range(10):
      quarter_round(x, 0, 4,  8, 12)
      quarter_round(x, 1, 5,  9, 13)
      quarter_round(x, 2, 6, 10, 14)
      quarter_round(x, 3, 7, 11, 15)
      quarter_round(x, 0, 5, 10, 15)
      quarter_round(x, 1, 6, 11, 12)
      quarter_round(x, 2, 7,  8, 13)
      quarter_round(x, 3, 4,  9, 14)
    for c in struct.pack('<16L', *(
        (x[i] + ctx[i]) & 0xffffffff for i in range(16))):
      yield c
    ctx[12] = (ctx[12] + 1) & 0xffffffff
    if ctx[12] == 0:
      ctx[13] = (ctx[13] + 1) & 0xffffffff
 
 
def chacha20_encrypt(data, key, iv=None, position=0):
  """Encrypt (or decrypt) with the ChaCha20 cipher."""
  if not isinstance(data, bytes):
    raise TypeError
  if iv is None:
    iv = b'\0' * 8
  if isinstance(key, bytes):
    if not key:
      raise ValueError('Key is empty.')
    if len(key) < 32:
      # TODO(pts): Do key derivation with PBKDF2 or something similar.
      key = (key * (32 // len(key) + 1))[:32]
    if len(key) > 32:
      raise ValueError('Key too long.')
 
  return bytes(a ^ b for a, b in
      zip(data, yield_chacha20_xor_stream(key, iv, position)))
 
 
# assert chacha20_encrypt(
#     b'Hello World', b'chacha20!') == b'\xeb\xe78\xad\xd5\xab\x18R\xe2O~'
# assert chacha20_encrypt(
#     b'\xeb\xe78\xad\xd5\xab\x18R\xe2O~', b'chacha20!') == b'Hello World'
 
# # ---
 
 
from pwn import *
 
if __name__ == "__main__":
    # key = bytes.fromhex("1a29fc588545a3daec642a0b5cc2c8f42e4b031d949ba12d7bfe5972cc34c780")
    # nonce = bytes.fromhex("1acba89714c8c6c10dd72612")
    # data_ = bytes.fromhex("837cab3f0d88479e9a3fb1f9d084e8d4ce678595b112daeafea0fbe4bc8c3e5a077878535b84dd467d0d0f1f5fdbb29b7c88904663ea91bd257374a62c78eea0")
    # print(chacha20_encrypt(data_, key, nonce))
    data_ = bytes.fromhex("147274ff36e71d07cfad08e75f0352799d0081c6862fd96aebb08566f49ca86f15528c5121940ddc3ee92b816b1147be934d03389ee0cfad5b539ebf35feb969")
    sbox = b'c|w{\xf2ko\xc50\x01g+\xfe\xd7\xabv\xca\x82\xc9}\xfaYG\xf0\xad\xd4\xa2\xaf\x9c\xa4r\xc0\xb7\xfd\x93&6?\xf7\xcc4\xa5\xe5\xf1q\xd81\x15\x04\xc7#\xc3\x18\x96\x05\x9a\x07\x12\x80\xe2\xeb\'\xb2u\t\x83,\x1a\x1bnZ\xa0R;\xd6\xb3)\xe3/\x84S\xd1\x00\xed \xfc\xb1[j\xcb\xbe9JLX\xcf\xd0\xef\xaa\xfbCM3\x85E\xf9\x02\x7fP<\x9f\xa8Q\xa3@\x8f\x92\x9d8\xf5\xbc\xb6\xda!\x10\xff\xf3\xd2\xcd\x0c\x13\xec_\x97D\x17\xc4\xa7~=d]\x19s`\x81O\xdc"*\x90\x88F\xee\xb8\x14\xde^\x0b\xdb\xe02:\nI\x06$\\\xc2\xd3\xacb\x91\x95\xe4y\xe7\xc87m\x8d\xd5N\xa9lV\xf4\xeaez\xae\x08\xbax%.\x1c\xa6\xb4\xc6\xe8\xddt\x1fK\xbd\x8b\x8ap>\xb5fH\x03\xf6\x0ea5W\xb9\x86\xc1\x1d\x9e\xe1\xf8\x98\x11i\xd9\x8e\x94\x9b\x1e\x87\xe9\xceU(\xdf\x8c\xa1\x89\r\xbf\xe6BhA\x99-\x0f\xb0T\xbb\x16'
    for seed in range(0xff):
        last = seed
        wtf = 0
        buf = []
        for i in range(32):
            index = last
            buf.append(sbox[index])
            if i == 0:
                wtf = index
            if (index % 8) != 7:
                tmp = index + 9
            else:
                tmp = index + 1
            last = tmp % 256
        key = bytes(bytearray(buf))
        buf2 = [] 
        for i in range(12):
            index = wtf
            buf2.append(sbox[index])
            if (index % 21) != 20:
                tmp = index + 22
            else:
                tmp = index + 1
            
            wtf = tmp % 252
        nonce = bytes(bytearray(buf2))
        print(seed)
        print(key)
        print(nonce)
        print(chacha20_encrypt(data_, key, nonce))

-> codegate2025{C0py_@nd_P4tch?_N0_7hi$_1s_Ch@s_Tr1ck!_W3lc0m3_tO_ChA_W0rld_haha!}

protoss_58

Golang gRPC

This challenge the rev part is easy, the hard part is find a way to communicate with the gRPC…

In main function there is a sus function named main_for_test_have_to_delete, lets take a look on what is it doing. It (loads?) two sus function

.rodata:000000000099FF18 off_99FF18      dq offset protoss_58_internal_auth_VerifyFlag
.rodata:000000000099FF18                                         ; DATA XREF: main_for_test_have_to_delete+35↑o
.rodata:000000000099FF20 off_99FF20      dq offset protoss_58_internal_auth_VerifyToken

When we run the client file our level is just 2 which mean we can’t read where the flag is.

Idx Secret Titles                         Access Level
00. Xel'Naga's First Experiment           2
01. Dark Templar's Origin                 3
02. Colossus Controversy                  3
03. Mothership Relics                     4
04. Immortals and Dragoons                4
05. Psionic Matrix Vulnerability          2
06. Hidden Guardianship of Lesser Races   3
07. Void Ray Pilots                       5
08. Tal'darim's Secrets                   3
09. Protoss-Zerg Hybrids                  2
10. The location of the flag              1
What secret do you want to read?

The goal is maybe find someway to get level 1.

// protoss_58/internal/auth.VerifyToken
// local variable allocation has failed, the output may be wrong!
int32 __golang protoss_58_internal_auth_VerifyToken(string authData)
{
  __int64 v1; // r14
  int64 i; // rcx
  uint8 *b_1; // rax
  int32_0 Flag; // edx
  int32_0 Flag_1; // edx
  size_t len_1; // rdx
  char *ptr; // rcx
  int cap; // [rsp+8h] [rbp-30h]
  int len; // [rsp+10h] [rbp-28h]
  ____User *p_____User; // [rsp+18h] [rbp-20h]
  uint8 *b; // [rsp+20h] [rbp-18h]
  uint8 *b_8; // [rsp+28h] [rbp-10h]
  void *retaddr; // [rsp+38h] [rbp+0h] BYREF
  google_golang_org_protobuf_reflect_protoreflect_ProtoMessage m; // 0:rdi.16
  string input; // 0:rax.8,8:rbx.8
  string sep; // 0:rcx.8,8:rdi.8
  _slice_string v18; // 0:rax.8,8:rbx.8,16:rcx.8
  retval_4B2160 v19; // 0:rax.8,8:rbx.8,16:rcx.8
  retval_80F6C0 v20; // 0:rax.8,8:rbx.8,16:rcx.8,24:rdi.16 OVERLAPPED
 
  if ( (unsigned __int64)&retaddr <= *(_QWORD *)(v1 + 16) )
  {
    runtime_morestack_noctxt();
    JUMPOUT(0x8101BFLL);
  }
  sep.str = (uint8 *)".";
  sep.len = 1LL;
  v18 = strings_genSplit(authData, sep, 0LL, -1LL);
  if ( !v18.len )
    runtime_panicIndex();
  if ( v18.len <= 1uLL )
    runtime_panicIndex();
  len = v18.array->len;
  b_8 = v18.array->str;
  v19 = strconv_ParseInt(v18.array[1], 16LL, 64LL);
  if ( v19.err.tab )
    return 0;
  input.len = len;
  i = v19.i;
  input.str = b_8;
  v20 = protoss_58_pkg_utils_DecodeBase58(input, i);
  if ( v20._r1.tab )
    return 0;
  cap = v20._r0.cap;
  b = v20._r0.array;
  p_____User = (____User *)runtime_newobject((internal_abi_Type *)&RTYPE_____User);
  v20._r0.cap = cap;
  m.tab = (internal_abi_ITab *)&go_itab__ptr_protoss_58_pkg_api_v1_User_comma_google_golang_org_protobuf_reflect_protoreflect_ProtoMessage;
  m.data = p_____User;
  b_1 = b;
  if ( (unsigned __int64)google_golang_org_protobuf_proto_Unmarshal(v20._r0, m).tab )
    return 0;
  if ( p_____User )
    Flag = p_____User->Flag;
  else
    Flag = 0;
  if ( Flag == 1 )
    return 2;
  if ( p_____User )
    Flag_1 = p_____User->Flag;
  else
    Flag_1 = 0;
  if ( Flag_1 == 57005
    && (!p_____User ? (len_1 = 0LL, ptr = 0LL) : (len_1 = p_____User->Name.len, ptr = p_____User->Name.ptr),
        len_1 == 9 && *(_QWORD *)ptr == 0x65646E616D6D6F63LL && ptr[8] == 114) )
  {
    return 1;
  }
  else
  {
    return 3;
  }
}

In VerifyToken, clearly that we need our username is commander and flag is 0xdead, return back to main we can see our client is just guest and flag 1 to solve this just patch it.

lea     rax, aPathkindenumIn+24h ; username
mov     ebx, 9          ; username
                        ; Keypatch modified this from:
                        ;   mov ebx, 5
mov     ecx, 0DEADh     ; flag
                        ; Keypatch modified this from:
                        ;   mov ecx, 1
nop     dword ptr [rax+rax+00h]
call    protoss_58_internal_auth_GenerateAuthData

We will have level 1!!! But where is the flag.

0 content : The Protoss were the first successful experiment of the Xel'Naga, created to achieve 'purity of form.' However, they were abandoned after their psionic link fractured due to rising individualism.
 
1 content : The Dark Templar were rogue Protoss tribes who rejected the Khala, fearing loss of individuality. They severed their nerve cords and were exiled from Aiur.
 
2 content : Colossi were banned for centuries after causing mass genocide during the Kalath Intercession. They were reactivated only during the Zerg invasion.
 
3 content : Motherships, once symbols of Protoss prosperity, were retired as relics of a bygone era. They were brought back into service during dire times to protect their dwindling population.
 
4 content : Immortals are created from crippled veteran warriors who would have previously been placed in Dragoon exoskeletons. After the fall of Aiur, Immortals replaced Dragoons as a necessity.
 
5 content : The Protoss rely on a psionic matrix to power their structures and warp in reinforcements. While a strength, it is also a critical vulnerability.
 
6 content : The Protoss secretly protected many lesser species under their stewardship without revealing their presence. This mirrored Xel'Naga traditions but avoided direct interference.
 
7 content : Void Rays are piloted by Protoss warriors who adopt a samurai-like code, emphasizing precision and honor in battle.
 
8 content : The Tal'darim possess forbidden knowledge about Xel'Naga technology and rituals that other Protoss factions consider heretical.
 
9 content : Secret experiments by Samir Duran (a servant of Amon) led to the creation of Protoss-Zerg hybrids, which pose an existential threat to all life in the galaxy.
 
10 content : You have to explore the whole galaxy to find it. (Find verify flag function... I think you need top-level access and hidden message for this {hint : secretService.Flag})

So we need to invoke secretService.Flag so the VerifyFlag is the last step (isn’t it ? XD)

// protoss_58/internal/auth.VerifyFlag
// local variable allocation has failed, the output may be wrong!
bool __golang protoss_58_internal_auth_VerifyFlag(string hiddenValue)
{
  __int64 v1; // r14
  int n18; // rcx
  unsigned __int64 len; // rdx
  char *array; // rsi
  unsigned __int64 cap; // rdi
  bool result; // al
  uint8 r; // r8
  int pos; // r9
  retval_46F320 v9; // kr00_16
  signed __int64 i; // rax
  char v11; // r8
  unsigned __int64 len_2; // rax
  char *oldPtr; // rcx
  int newLen; // rbx OVERLAPPED
  unsigned __int64 oldCap; // rdi
  char v16; // r11
  char v17; // r12
  char v18; // r10
  char v19; // r9
  char v20; // r8
  unsigned __int64 oldCap_1; // rcx
  char *oldPtr_1; // rax
  int j; // rax
  unsigned __int64 n0x3F; // rdx
  char v25; // al
  char v26; // [rsp+0h] [rbp-38h]
  char v27; // [rsp+1h] [rbp-37h]
  char v28; // [rsp+3h] [rbp-35h]
  uint8 r_1; // [rsp+4h] [rbp-34h]
  unsigned __int64 len_1; // [rsp+8h] [rbp-30h]
  unsigned __int64 len_3; // [rsp+18h] [rbp-20h]
  int pos_1; // [rsp+20h] [rbp-18h]
  char *array_1; // [rsp+28h] [rbp-10h]
  void *retaddr; // [rsp+38h] [rbp+0h] BYREF
  uint8 *hiddenValue_0; // [rsp+40h] [rbp+8h]
  runtime_slice v36; // 0:rax.8,8:rbx.8,16:rcx.8
 
  if ( (unsigned __int64)&retaddr <= *(_QWORD *)(v1 + 16) )
  {
    runtime_morestack_noctxt();
    JUMPOUT(0x810645LL);
  }
  if ( hiddenValue.len != 18 )
    return 0;
  hiddenValue_0 = hiddenValue.str;
  n18 = 0LL;
  len = 0LL;
  array = 0LL;
  cap = 0LL;
  while ( 1 )
  {
    len_1 = len;
    array_1 = array;
    if ( n18 >= 18 )
      break;
    r = hiddenValue.str[n18];
    if ( r >= 0x80u )
    {
      v9 = runtime_decoderune(hiddenValue, n18);
      len = len_1;
      r = v9.r;
      pos = v9.pos;
      hiddenValue.str = hiddenValue_0;
      hiddenValue.len = 18LL;
    }
    else
    {
      pos = n18 + 1;
    }
    if ( cap < ++len )
    {
      r_1 = r;
      pos_1 = pos;
      v36 = runtime_growslice(array, len, cap, 1LL, (internal_abi_Type *)&RTYPE_uint8_0);
      r = r_1;
      pos = pos_1;
      len = v36.len;
      array = (char *)v36.array;
      cap = v36.cap;
      hiddenValue.str = hiddenValue_0;
      hiddenValue.len = 18LL;
    }
    array[len - 1] = r;
    n18 = pos;
  }
  for ( i = 0LL; i < (__int64)len; ++i )
  {
    if ( i == len - 1 )
    {
      v11 = 0xA5;
    }
    else
    {
      if ( len <= i + 1 )
        runtime_panicIndex();
      v11 = array[i + 1];
    }
    array[i] = __ROL1__(__ROL1__(array[i] ^ 0x44, 5) ^ v11, 4);
  }
  len_2 = 0LL;
  oldPtr = 0LL;
  newLen = 0LL;
  oldCap = 0LL;
  while ( (__int64)len_2 < (__int64)len )
  {
    if ( len_2 >= len )
      runtime_panicIndex();
    if ( len <= len_2 + 1 )
      runtime_panicIndex();
    if ( len <= len_2 + 2 )
      runtime_panicIndex();
    v16 = array[len_2];
    v17 = array[len_2 + 1];
    v18 = (16 * (v16 & 3)) | (4 * (v17 & 3));
    v19 = array[len_2 + 2];
    newLen += 4LL;
    v20 = v18 | v19 & 3;
    if ( oldCap < newLen )
    {
      len_3 = len_2;
      v28 = array[len_2];
      v27 = array[len_2 + 2];
      v26 = v18 | v19 & 3;
      *(runtime_slice *)(&newLen - 1) = runtime_growslice(
                                          oldPtr,
                                          newLen,
                                          oldCap,
                                          4LL,
                                          (internal_abi_Type *)&RTYPE_uint8_0);
      len = len_1;
      array = array_1;
      v20 = v26;
      v19 = v27;
      v16 = v28;
      oldCap = oldCap_1;
      oldPtr = oldPtr_1;
      len_2 = len_3;
    }
    oldPtr[newLen - 4] = (unsigned __int8)(v16 & 0xFC) >> 2;
    oldPtr[newLen - 3] = (unsigned __int8)(v17 & 0xFC) >> 2;
    oldPtr[newLen - 2] = (unsigned __int8)(v19 & 0xFC) >> 2;
    oldPtr[newLen - 1] = v20;
    len_2 += 3LL;
  }
  for ( j = 0LL; j < newLen; ++j )
  {
    n0x3F = (unsigned __int8)oldPtr[j];
    if ( n0x3F >= 0x3F )
      runtime_panicIndex();
    oldPtr[j] = a4e6nqpokbcwmif[n0x3F];
  }
  result = 0;
  if ( newLen == 24 )
  {
    runtime_memequal();
    if ( v25 )
      return 1;
  }
  return result;
}

The check is quite easy so I’ll talk much about this. My script to find flag.

 
 
# cmp = "lScv9oQ6VgELTPBdHnxp9dND"
 
mapping = "4E6nQpOkBcWmIfXorxGhg_z81qC3sv79DlRSN5PHeUZAwVYuat0TF2djJbKLyMi"
 
# for i in range(len(cmp)):
#     print(mapping.index(cmp[i]),end=", ")
 
from pwn import *
 
cmp  = [33, 35, 9, 29, 31, 15, 4, 2, 45, 20, 1, 59, 51, 38, 8, 54, 39, 3, 17, 5, 31, 54, 36, 32]
 
 
# print(hex(u64(b'\xDE\xAD')))
 
from z3 import *
 
s = Solver()
flag = [BitVec(f'flag_{i}', 32) for i in range(18)]
 
for i in range(len(flag)):
    s.add(flag[i] >= 0x20)
    s.add(flag[i] <= 0x7f)
 
rol = lambda val, r_bits, max_bits: \
    (val << r_bits%max_bits) & (2**max_bits-1) | \
    ((val & (2**max_bits-1)) >> (max_bits-(r_bits%max_bits)))
 
 
def transform_flag(flag):
    index = 0
    len_flag = len(flag)
    result = []
    
    while index < len_flag:
        if index >= len_flag or index + 1 >= len_flag or index + 2 >= len_flag:
            break
        
        v16 = flag[index]
        v17 = flag[index + 1]
        v18 = (16 * (v16 & 3)) | (4 * (v17 & 3))
        v19 = flag[index + 2]
        v20 = v18 | (v19 & 3)
        result.append((v16 & 0xFC) >> 2)
        result.append((v17 & 0xFC) >> 2)
        result.append((v19 & 0xFC) >> 2)
        result.append(v20)
        
        # Move to next triplet of bytes
        index += 3
    
    return result
 
# flag = bytearray(b'codegate{aaaaaaaaa')
 
for i in range(len(flag)-1):
    flag[i] = rol(rol(flag[i] ^ 0x44, 5, 8) ^ flag[i+1], 4 , 8)
 
flag[17] = rol(rol(flag[17] ^ 0x44, 5, 8) ^ 0xA5, 4 , 8)
 
 
lmao = transform_flag(flag)
 
print(lmao)
for i in range(len(lmao)):
    # print(mapping[lmao[i]],end="")
    s.add(lmao[i] == cmp[i])
 
if s.check() == sat:
    model = s.model()
    flag_values = {int(str(k).split('_')[-1]): model[k].as_long() for k in model}
    flag_string = ''.join(chr(flag_values[i]) for i in sorted(flag_values))
    print(f"Flag: {flag_string}")

But the annoying part is how to invoke the service. I’ll try to write my own proto but it failed. Spam ChatGPT can’t help…

After that, I remember that I literally forgot to check init function (dumbass moments). The proto file is at protoss_58_pkg_api_v1_init

b'\n\nauth.proto\x12\x04auth",\n\rVerifyRequest\x12\x1b\n\tauth_data\x18\x01 \x01(\tR\x08authData"K\n\x0eVerifyResponse\x12\x16\n\x06status\x18\x01 \x01(\x05R\x06status\x12!\n\x0caccess_level\x18\x02 \x01(\x05R\x0baccessLevel".\n\x04User\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n\x04flag\x18\x02 \x01(\x05R\x04flag2B\n\x0bAuthService\x123\n\x06Verify\x12\x13.auth.VerifyRequest\x1a\x14.auth.VerifyResponseB\x05Z\x03../b\x06proto'
b'\n\x0csecret.proto\x12\x06secret"F\n\x0bSecretTitle\x12!\n\x0caccess_level\x18\x01 \x01(\x05R\x0baccessLevel\x12\x14\n\x05title\x18\x02 \x01(\tR\x05title"+\n\x13SecretTitlesRequest\x12\x14\n\x05token\x18\x01 \x01(\tR\x05token"h\n\x14SecretTitlesResponse\x12\x16\n\x06status\x18\x01 \x01(\x05R\x06status\x128\n\rsecret_titles\x18\x02 \x03(\x0b2\x13.secret.SecretTitleR\x0csecretTitles"D\n\rSecretRequest\x12\x14\n\x05token\x18\x01 \x01(\tR\x05token\x12\x1d\n\nsecret_idx\x18\x02 \x01(\x05R\tsecretIdx"B\n\x0eSecretResponse\x12\x16\n\x06status\x18\x01 \x01(\x05R\x06status\x12\x18\n\x07content\x18\x02 \x01(\tR\x07content";\n\x0bFlagRequest\x12\x14\n\x05token\x18\x01 \x01(\tR\x05token\x12\x16\n\x06hidden\x18\x02 \x01(\tR\x06hidden":\n\x0cFlagResponse\x12\x16\n\x06status\x18\x01 \x01(\x05R\x06status\x12\x12\n\x04flag\x18\x02 \x01(\tR\x04flag2\xc6\x01\n\rSecretService\x12I\n\x0cSecretTitles\x12\x1b.secret.SecretTitlesRequest\x1a\x1c.secret.SecretTitlesResponse\x127\n\x06Secret\x12\x15.secret.SecretRequest\x1a\x16.secret.SecretResponse\x121\n\x04Flag\x12\x13.secret.FlagRequest\x1a\x14.secret.FlagResponseB\x05Z\x03../b\x06proto3'

Rewrite it to proto file and try again

syntax = "proto3";
package secret;
 
message SecretTitle {
  int32 access_level = 1;
  string title = 2;
}
 
message SecretTitlesRequest {
  string token = 1;
}
 
message SecretTitlesResponse {
  int32 status = 1;
  repeated SecretTitle secret_titles = 2;
}
 
message SecretRequest {
  string token = 1;
  int32 secret_idx = 2;
}
 
message SecretResponse {
  int32 status = 1;
  string content = 2;
}
 
message FlagRequest {
  string token = 1;
  string hidden = 2;
}
 
message FlagResponse {
  int32 status = 1;
  string flag = 2;
}
 
service SecretService {
  rpc SecretTitles(SecretTitlesRequest) returns (SecretTitlesResponse);
  rpc Secret(SecretRequest) returns (SecretResponse);
  rpc Flag(FlagRequest) returns (FlagResponse);
}

=> grpcurl -plaintext -proto secret.proto -d '{"hidden": "My_1ife_F0r_Aiur!!","token":"771uoeGAjueocQHPomNH.78ceb9cb446f0aef"}' 3.37.15.100:50051 secret.SecretService/Flag -> codegate2025{c04d0a087f91f6a254b607eea68e12b91529f6b0d6f626a3773df31748661243}

Conclusion

I never believed that one day I could qualify for CodeGate Quals. I really appreciate that my team could do that, my dream came true. But we still need to try harder. GG boiz!!!