/ crypto

NDH2K16 - Grid

Ce challenge était classé dans la catégorie Crypto.

En se connectant sur le serveur Web on retrouve un fichier texte contenant une grille (étonnant n'est-ce pas) :

20 64 6f 6e 27 74 20 77 61 73 74 65 20 79 6f 75 72 20 74 69 6d 65 20 74 20
20 20 20 20 20 72 79 69 6e 67 20 65 61 63 68 20 6c 69 6e 65 20 20 20 20 20
9A 6E 5B 2D 2E 02 E9 B1 54 74 96 D2 8D FC 49 88 60 49 FD 52 88 C2 4F 42 BB
[...]
20 20 20 20 20 72 79 69 6e 67 20 65 61 63 68 20 6c 69 6e 65 20 20 20 20 20

Et juste en dessous ce qui ressemble à un flag :

NDH2K16_0208131304031012030404211113220906121110171408210309012004131915091103050120

En séparant et groupant les nombres 2 à 2 on obtient quelque chose qui ressemble à une série de coordonnées :

02,08 13,13 04,03 10,12 03,04 04,21 11,13 22,09 06,12 11,10 17,14 08,21 03,09 01,20 04,13 19,15 09,11 03,05 01,20

On écrit un script qui va donc convertir la grille en un tableau à 2 dimensions pour constuire le flag de la manière suivante :

Dans le couple (x,y) soit x correspond à la ligne et y correspond à la colonne ; soit x correspond à la colonne et y à la ligne. On rajoute de plus un offset de -1 car après tests de cette méthode, la numérotation des colonnes commence à 1.

data = """20 64 6f 6e 27 74 20 77 61 73 74 65 20 79 6f 75 72 20 74 69 6d 65 20 74 20
20 20 20 20 20 72 79 69 6e 67 20 65 61 63 68 20 6c 69 6e 65 20 20 20 20 20
9A 6E 5B 2D 2E 02 E9 B1 54 74 96 D2 8D FC 49 88 60 49 FD 52 88 C2 4F 42 BB
57 C3 33 11 94 A4 90 13 92 60 57 04 0A 79 99 36 FB BE 9E 3D AF 0A DF 27 38
4D 3A 81 97 92 10 C7 97 EE F3 43 C9 44 64 F6 75 75 ED EE 6B 49 31 2E 0A 4F
97 11 5E CD 07 C2 0D 42 10 DD ED BB A7 14 85 70 82 4A DB B1 BE FA E6 86 D0
24 5A DD C5 06 28 75 FB E1 25 10 DA 4C D2 B2 D2 94 C5 FB CD 4E 19 03 7C 21
B4 94 DA 93 61 FF 75 47 83 BB 9E C3 96 95 BA 98 C3 91 3B BF 1D A1 0C 82 E1
A1 17 C2 E2 F5 16 D6 B5 98 B2 09 40 EB 9F 2C 34 9A 20 6A EE 87 3E 1A C5 33
4B 18 B0 A3 75 1F D7 8A 07 71 44 8B 84 9C 62 E5 2C 21 C5 7A 05 A8 BC 78 D6
4F DE B6 41 1A 74 81 4E B3 38 E3 67 B5 6B 62 A2 D4 C0 8B EB 89 49 96 45 CF
E7 32 AE 0A A7 92 34 F6 A7 B0 25 A2 7A 56 19 A8 10 98 5F 8B DE BA AF CF 24
59 30 F3 EC 5B 55 A7 E5 58 BA E6 8D 2C A5 9C A6 A3 72 1A 2C CF E5 69 E9 73
D0 D9 82 3C 2A C5 A2 8B 90 9A AF A9 0A F0 A3 E7 E4 45 20 0A B8 D4 9B 6F 92
33 5B A9 0B 2C 54 CE 02 00 F4 36 66 E2 7E 93 34 5C DF 56 33 95 12 20 BA 32
2A 17 9B 21 46 71 53 F6 BE D8 6E 9F DB 2D 58 55 E7 8F 9E F6 3F 11 FF DE B7
E4 C8 FB 21 2A 0D C6 C0 07 D5 4C DD 51 6C 67 FB 25 7E 2C 88 15 E7 11 6C 45
14 E0 92 11 E0 25 46 5D EB 68 91 75 33 E4 90 BE 86 2F A2 1D 35 47 39 81 C9
63 39 2C 2D D2 07 16 F4 ED 3D 37 44 15 04 FD 5A 74 FE 8E 1C D8 F5 D9 9F 7B
25 C9 D7 55 C6 47 79 E5 19 93 77 1F 62 7F 09 80 F3 0A 9A 1F 0A 31 65 83 69
88 2B 8B C9 F9 BE 0B 23 C2 8D AE 5A 42 C4 56 3D A2 31 29 20 49 06 09 46 30
94 00 D6 6F F3 04 A1 0A 31 48 72 8B C6 8F C0 46 4E E5 29 BA DE C3 82 24 E7
82 78 D1 F4 8B 72 16 BF 2D E7 B0 68 99 A0 06 8D 47 AF 99 C4 07 0B C5 D1 86
20 64 6f 6e 27 74 20 77 61 73 74 65 20 79 6f 75 72 20 74 69 6d 65 20 74 20
20 20 20 20 20 72 79 69 6e 67 20 65 61 63 68 20 6c 69 6e 65 20 20 20 20 20
"""

data = data.split("\n")

tab = []

for line in data:
    line = line.split(" ")
    tab.append(line)

pattern = "02,08 13,13 04,03 10,12 03,04 04,21 11,13 22,09 06,12 11,10 17,14 08,21 03,09 01,20 04,13 19,15 09,11 03,05 01,20"

pattern = pattern.split(" ")

tab2 = []

for item in pattern:
    item = item.split(",")
    tab2.append(item)

ret = ""
ret1 = ""
for coord in tab2:
    ret += tab[ int(coord[0])-1 ][ int(coord[1])-1 ]
    ret1 += tab[ int(coord[1])-1 ][ int(coord[0])-1 ]

print "NDH2K16_" + ret
print "NDH2K16_" + ret1

On obtient 2 flags :

NDH2K16_692C338B2DAFB531BB386C1D54690AFD092E69
NDH2K16_942C2DB033C9E63E9244E423C225EC56B38125

En essayant les deux, le flag est finalement NDH2K16_692C338B2DAFB531BB386C1D54690AFD092E69