Write-UP INCTF: Jazz

Written by aaSSfxxx -

J'ai participé ce samedi au CTF InCTF avec la team "ret2school", où j'ai résolu le challenge de reversing "Jazz", qui valait 900 points à la fin du CTF. Il s'agit d'un crackme en Rust, ce merveilleux langage, générant du code assez atroce à analyser. Muni de mon IDA Home, je me lance donc à l'attaque de ce crackme.

Ce crackme est donc écrit en Rust, et a des symboles de debug, rendant notre tâche légèrement plus aisée (pas de temps à perdre à identifier les fonctions du runtime Rust, ni les libs utilisées). Le point d'entrée se présente donc comme ceci:

On explore donc la fonction _ZN4jazz4main17h655cc631b7a9a767E, qui correspond au main de l'application Rust, dont le control flow graph est assez immonde (merci Rust et les .unwrap() inlinés).

AES et Mersenne

Grâce aux symboles, en parcourant le code de la fonction, on se rend compte que le programme fait de l'AES CBC et génère des nombres pseudo-aléatoire avec un "Mersenne Twister", dont la graine est définie à 0xDEADBEEFCAFEBABE. Notre instinct de reverser nous dit que ce "Mersenne Twister" va servir à générer la clé de chiffrement AES ainsi que l'IV. On va donc placer un breakpoint sur la fonction qui initialise le contexte AES, et dumper la clé de chiffrement ainsi que l'IV pour déchiffrer notre clé en Python grâce à PyCrypto. Pour cela, nous allons chercher les arguments dans la documentation Rust. Notre fonction prend un enum KeySize, deux &[u8] pour la clé et l'IV, et un argument "X" semblant déterminer le padding utilisé.

Le &[u8] est un peu particulier en Rust, puisque dans le code assembleur généré, un pointeur vers la zone mémoire sera passé en paramètre, suivi de sa taille. Le prototype de la fonction a ajouter dans IDA (touche "y" sur le nom de la fonction) sera donc:

__int64 __fastcall crypto__aes__cbc_encryptor__h211c41356831deed(int keySize, char *key, int keySz, char *iv, int ivSz, void *unk)

Et notre breakpoint une fois placé ressemblera à ceci dans IDA:

Nous pouvons lancer le déboguage en sélectionnant "Local Linux Debugger" dans IDA et constater avec désespoir que notre breakpoint n'est pas trigger... En effet, le crackme attend le flag dans argv[1], que nous devons donc spécifier dans "Debugger" -> "Process Options". Nous allons mettre "azerty" comme ligne de commande, et relancer l'exécution. Et cette fois-ci, IDA s'arrête bien sur notre breakpoint:

Nous pouvons donc dumper notre clé et notre IV en faisant un clic droit sur [rsp+30h+key] puis "Jump in a nex hex window", et même procédure pour la variable "iv". En analysant un peu plus le programme, on remarque également un call [rsp+30h+arg28], qui pointe vers un CbcEncryptor::encrypt. Nul doute que le chiffrement se fera ici, et d'après notre documentation Rust préférée, on peut là encore déterminer les arguments de la fonction:

On voit ainsi que notre chaîne à chiffrer est "\xd7\x0f\xd2\x4c\x0d\xfc", et on peut en déduire que le crackme fait des opérations sur notre entrée avant de le chiffrer en AES. Après exécution du call, on récupère le chiffré qui est "\x84\xc5\x5d\xc4\xec\x5a\xD2\xa6\xf7\x17\x76\x93\x8a\xf5\xd7\x48". On peut donc tester que nous avons bien tous les paramètres pour AES:

#!/usr/bin/python
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad

plaintext = b"\xd7\x0f\xd2\x4c\x0d\xfc"
key = bytes([0xEC, 0xAD, 0xE9, 0x18, 0xDB, 0xFA, 0xBF, 0x53,
             0x03, 0x4F, 0x65, 0x4B, 0xEF, 0x52, 0x32, 0x92,
             0xAE, 0xC1, 0xC4, 0xD0, 0x13, 0xDD, 0x5D, 0x28,
             0x05, 0xEA, 0x53, 0x97, 0x14, 0xE0, 0x6D, 0xD1])
iv = bytes([0xD7, 0x1C, 0x2D, 0x1B, 0x9B, 0x71, 0xFB, 0x9E,
            0xAE, 0x77, 0x75, 0x64, 0x01, 0x6C, 0xFA, 0x3A])

to_decode = b"\x84\xc5\x5d\xc4\xec\x5a\xD2\xa6\xf7\x17\x76\x93\x8a\xf5\xd7\x48"
cipher = AES.new(key, AES.MODE_CBC, iv)
print(cipher.decrypt(to_decode))

On retombe bien sur notre plaintext, suivi de b"\n" qui se répètent 10 fois. Il s'agit là du padding par défaut, implémenté par la fonction "pad" dans PyCrypto. Il ne nous reste plus qu'à déterminer la transformation effectuée sur l'entrée, puis l'"inverser" afin de retrouver notre flag.

Substitutions go brrr

Il ne nous reste plus qu'à localiser l'endroit où notre entrée est transformée, et comprendre l'algorithme de transformation. Pour cela, remontons les cross references de la variable donnée au RefReadBuffer, qui contient notre flag chiffré (la variable arg_10):

Nous arrivons dans cette portion de code:

On peut voir que ce buffer est rempli octet par octet par le contenu du registre r13b, et en remontant dans le code, nous trouvons ce bloc intéressant:

Après quelques recherches, il s'avère que ce gros bloc de code:

mov     rax, rbx
mov     rcx, 0DD67C8A60DD67C8Bh
mul     rcx
shr     rdx, 5
lea     rax, [rdx+rdx*8]
lea     rax, [rdx+rax*4]
mov     rdi, rbx
sub     rdi, rax

n'est en réalité qu'un rdi % 37 optimisé par LLVM. De même pour le bloc du dessous, qui est un modulo 37*0x18 optimisé par LLVM.

imul    rcx, rdx, 378h
mov     rax, rbp
sub     rax, rcx ; rax = rcx % 37*0x18
mov     rdx, [rsp+30h+var_20]
movzx   edi, byte ptr [r12]
mov     rax, [rdx+rax]
cmp     rax, rdi

Ce qui nous amène au bloc de code suivant:

mov     rax, r14 ; rax contient un compteur
sub     rax, rcx ; rax = rcx % 37*0x18
mov     rax, [rdx+rax] ; on charge le pointeur contenu en rdx + rax dans rax
movzx   r13d, byte ptr [rax+rdi] ; on charge le char pointé dans rax

Fort ce ces informations, on peut retrouver l'algorithme. Le programme a généré un tableau de 37 slices d'octets de 256 caractères, où un slice peut être représenté par la structure ci-dessous, qui fait 0x18 octets:

struct slice {
    unsigned char *data;
    unsigned long long size;
    unsigned long long allocsize;
}

Puis pour chaque caractère de l'entrée, il prend le slice situé à la i-ème position du caractère, puis prend le caractère situé à la valeur ASCII du i-ème char de l'entrée. En pseudocode C, ça donnerait:

for(int i = 0; i < strlen(input); i++) {
    arg_10[i] = slicearr[i % 37][input[i]];
}

Pétage du crackme

Pour dumper cette fameuse table, on va faire un peu d'IDAPython. Tout d'abord, on place un breakpoint sur l'instruction movzx r13d, byte ptr[rax + rdi], et on relance le debug de l'appli. Puis on exécutera le code IDAPython suivant pour dumper notre tableau:

array_begin = idc.get_reg_value("rdx")
print("[")
for i in range(37):
    array = idaapi.get_qword(array_begin + i*0x18)
    print(idaapi.get_bytes(array, 256), end=", \n")
print("]")

Il nous suffira de copier-coller la sortie dans notre fichier Python de solution du challenge. Une fois le code IDAPython exécuté, on veillera à supprimer le breakpoint sur le movzx.

Maintenant, il ne nous reste plus qu'à localiser le flag chiffré, pour le déchiffrer en AES, puis faire la substitution inverse. Heureusement pour nous, le flag est rempli au moment où le breakpoint sur l'initialisation d'AES sera atteint. Il nous suffira donc de le dumper en entrant cette ligne:

idaapi.get_bytes(idc.get_qword(idc.get_reg_value("rsp")+216), 0x60)

et en copiant la la sortie dans notre script Python, qui ressemble à ceci:

#!/usr/bin/python
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad

key = bytes([0xEC, 0xAD, 0xE9, 0x18, 0xDB, 0xFA, 0xBF, 0x53,
             0x03, 0x4F, 0x65, 0x4B, 0xEF, 0x52, 0x32, 0x92,
             0xAE, 0xC1, 0xC4, 0xD0, 0x13, 0xDD, 0x5D, 0x28,
             0x05, 0xEA, 0x53, 0x97, 0x14, 0xE0, 0x6D, 0xD1])
iv = bytes([0xD7, 0x1C, 0x2D, 0x1B, 0x9B, 0x71, 0xFB, 0x9E,
            0xAE, 0x77, 0x75, 0x64, 0x01, 0x6C, 0xFA, 0x3A])

glop = bytes([0xcb, 0xf1, 0x5d, 0x60, 0xf4, 0x43, 0x04, 0xfd,
              0x9c, 0xeb, 0x3e, 0x1f, 0x64, 0x47, 0x6b, 0xdd])

keytbl = [
b'\x8ag\'\x96\xea_\xd1\xda\xb8\x1c\x87]\x1d\x0fZ\xa3j"\x8f\xb4\xa5Vw\x83\xc4\\f\xa4W\x157\xf0\x81\x00Ki\xd9=\xb9\xc9\xc3\xde\xdc\x02\xbd\xf1@d\x94\xd80(\t\xb0\xac\xe1\xe5. \r\x9c\xf6{\xb23\xab\xfcF\xc5\x07\xf9\x95\n\x8blH5\x0cX\x16\xcaP\xf8\xaa&\x1b\xa1\x98\x01ybv\xe8\x14[k\x9f\xd7\xf52D\x08Q\x9a\xd0+)\xfe\xe9m\x89\xa6\xdd\xe7\x97J\x9e\x18\xa2\x1fh\x19\xa7\x82N\x13\x03\xeda\x91e81>\xd5\xf2\x1a\x8d\x10\xe4\x84\xad\x04L\xeb\xfa\xdf^\x0b\x17-\xae\xe3%s}\x90Gx\xec\xc24\xb1AR\x9d\x12\xf3\x11\x86~\xd6B\xef\xc6\xc1Y\x8c\x7f\xbft9\x06\xfdc#\xc86o\x80\xaf\x92U\xe6\xbc`\xd2rz\xceM\x05\xe0\xcf$<\xa9\xb7\xccq\xd3;\xd4|*S\x8ep?\x93nu\xb3O\xb6\xf7\x85\xc0\x99\x0eT\xfbI\xb5\xf4/\xbb\xee\xbe:\xba\xe2\x9b\xff\xa8\xa0\xcd,C\x1e!\xdb\x88E\xcb\xc7', 
b'(\xf5t\x1ar\xc7\xad\xb8\x96\xcb\x92\x9d\x89\x84<\x1d\xeb\x03-\xce\x91\xd3E\x19\xf7_\x1b\x8e\xba\x05\xec\xa5Q\xaa\x9e\xcd\xee#)MU\xacL\xd5]W$\xdf\xa8\x86:\x1f\xd0u\xda\xe1\xd4P\xc2\xa2\r\xf1\x07\xa3\x00\x04"lm/\x88n8\xea\xe6iy\xed%\xc3\xa7O\x17\xe5\x06\x01\xbd\x8f\x11\x12\xfe}AI\xc0YV\x9f14\xc6^\xabqd\x10~T\x0e\xb3\xb5p\xde0\x99\xa9\x94F\x93\x9b\xd8\xb2\x0f3@\xa0\n\xd7\x85\xef9\xd9\xcaNa\x83&kv\'Cw*6\xe7\x15\xf2\x80\x1e+X\xfa\x0c\x165\x87e\x9aB\xe4\x82\xf4Z\xcc2\xb7!zH\xcfS\xb0\xdb\\?\xf9\x13x\x18\xe3\x0bb\xbfK\x147\x8d\xaf\xbb\xc9h\xb4\t,\xd6|\xb6\x7fJ\xf3\xd2\xf6G;\xae\x02\xdc\x95\xbe`\xff\x8c\x9c\xa6\xe2c\xfb\xfd\xe9R.\xb9D\x90\x8b\x98sf\xb1g[\xa1\xf8\xc1\xc5>\x8a\xdd \xd1o\xa4\xf0\xc8\xfc\x1cj\xc4\x97{\x81\xbc=\xe0\xe8\x08', 
b'\x1eA\xce\xe7\x84T\xf2j\xa0\xa4\x02\x96%\x0e\x19[,;@\x10~\x908kx\xd8\xc2=>C\xf3n\xa3\xc6\xeeE\xab\xd4\x06\x7f\x95p\xbc$\x86B\x1b\xa9\x17\x88\xe0\xc8\x07\xe1\xb8\x05:(\xd0\xb4\xea\xcd\xcbmQ\x16\x18\'\xf7H\x9e\xfb\x000u\xb3\xff\x8a\xdd\x1cZ\x9c!\xd3<\x04\xd7*\x8f\xec\x9b\xe8\xcf6\\o\x08\xb1\xe6\xa2\xd5\xd2\xe2\x89\x8e\x93\x8ca\xf5\xa5\x15\xf82b\xba_D\x12\xaez\x99\xb2wP\xca^\xaa\x14\x9fS\xd9\xdb\x97JW\xc0\x13\xbb\xb6c\xed|R\xfc.\xfei\xad\xf9\x82\x8bM\x0bv5 y\x98]\xe3s47\xdeYU\x9a\xef"&{)\xc5\x1a\xb9\x85-}#\x92\xa7g\xaf\x8d\t\x94\x80\xf0\x1f\xf69\xc4\n\xda\xc3\x9dXFN\xbd\x03\xdf\xfaOKI\x01\x11\xdclqV\xb5\xf4\xe4d\x1d\xd6\xe9\x91\xd1L\x81+\xc9\xa1\x83/e?3\xc7\xac\xc1\xb0\xa81r\xbf\xeb\xb7\xccf\r\x87\xa6`G\x0c\xbe\x0f\xfd\xf1ht\xe5', 
b'\xbe%`\x16qQ6\xe8\xb3\x17D\x93\x8f\x97\xdb\x96$\xdd+}\x80\xc9>\x15\x1e\xa7\xfa\xc7|S\xe9\xf1:P!VZ\x8d\x1b=Y\xb9\xed\xe6ca\xdf\x11\x87\xc5[\xd2\xab5\xae"\x9e^\x05\xc8B\x011\x89\r\xd1\x9a\xa1\\\xff\xf3\xe4C\x13x\x9cW\xa5\xe3t\x0c\xd8\xc1z\x0eO\x8eK\xbd/v\xe0\x00\xdc\x81\xb1\x8b\x06\xa8e\xbf?\xa4\xe2\t#\x9f4_\x1f\xee\x88M\xc4L9\xeb\xa2kj8\xecA\xd4E.N\xcf\xc6\x8c\xfd\xcb\xads\xf6\xcel\x18\xcd\xd5n\xc3h\xb6\x10\'\xbb\xe5\xe1\xefI\xba\x94\xd9\x0f\xaf\x8a\x7fu\xca\xd6f\xa0\xbcy\x0br*\xda\x83\xb8\x99<\x9d-2\xb5\x08\x03\xf2\xa3\x95\x12\xd3\xb4\x84\xf9F&\x86G\x82\xf0\xc2o\xfc3~\x90b\x1d\x19{\x07\xb7\xa9X\xc0\xdepT\xf4\xf8R\x91U\xf5\x1aH\xaa\x92\xb2]0\n\xb0\xa6@7\xac)\xe7J\x04\xf7d\x14\xd0w\x98;m\x85\xcc\xfeg\xd7\x1c(i\x9b\x02, \xea\xfb', 
b'\xf7eyu\xf5W\xe6r\x1cT6\xa9\x18\x08M\xe9m\xde8>\xe3\xbd\xf8\x03\x9a\xec\xdbQ\xc0Pp\\x" \xed@o\x98F#[\xe4\xf2\xc51\xfe\xb7\x1aZ\xba}\xb2b\xdf\xc7\x90G\x94\x87_-Osz\xf1\xd3\xf6\x84\x81\x0c.;J\xd7\xa1g\xca4\xceA\xfa\xc2\xfdL\xc8\x01\x7f*\x1f\'\x9d\xcf\xa0\x10\xb1=(I0\xd4\x82h\x96\x91\xe7V\xe0\x8c\x16\x1d+\xb8\xb4%\xd9\r\x8b\xbf\xac<\xd8\xfb\xbb:\xa6j\xf3EC\xdd\xf0\xeb\xff\xe5/$R\xfc\x9e\x8e\x83n\xae7\xc9\x12S\x1e\xa7fD\xd0\xee\x9f\x9939\xb0\x85q\xb5{\xcb\x93\x97\x0f\xd5\xda\xa8\xf4\x11\xd2\xcca\n\xc6\x8f\x00\t\x892U]\xc3\x95\xe2!?N\x8d\xb6H\x075ik\xd6\xc4\x05l,\xcd`K\xa4\xc1\xe1^\xea\x88\xdc\xaf\x19\x06\x9b\xf9\xe8\xaa\x15\x86\xb9\x13\xa2&)t\xbc\x04\x92\x02\x80X\x9c\xb3B\x14c\x0bv\x0e\xabY\xef|\xd1\x1b\x8aw\xa3d~\xad\x17\xbe\xa5', 
b'V\x84jkhDS\x1cK\xe1\xa0\xe2n\xee<\x06\xb1\xae\xb6\x97\xf5\x93\xb8\xaa*\x15}\x05\xe9\xca\x99\x07Jp\xec\xd0\xe0\x1d\xfd/-\xb0|3\xfe4H!\x0c#\xdc\x94B\xde\xf0\xb9R\xd4g~\xa66$\xc0\x08\x92\xe3\xf1&L\xdd\x1a\xe4\xedz?\xba\xbf2\x9e\xb2\x8b\x9c\x8a\x85\xa5\x18\xc1\x00 \x90\xa9\xbe\xef\xd1\x13t\x9d\xff8\xa4:\x16\x03cs\xa1\xe7\x1b\x80dy\x0fE\xf4+\x96o\x10\x82\x17\xfcq\xeb\xe5O\x8d\\\xab\x8cxrP\xb7\x89\xd5A[\x19\xcd\x01\xe6;m\xa7\x9f\xad\x83M\nl\xf9\x9b1\xf6\xda\xdb\xac\xd2\xd8\xce\x81\xf2e\'\xa2\xcf\x88\x8f\xbdZ\x02\x11\xd3\x7fWIN\xf8\xbc@%Gw\x91>"\xc9\x86(\xdf\xa85v\x870\x9aT,\xc7a\xb5\x95X^f=bYu\xc6\xaf\xfb\xfa\xe8`\xcc\x0e\x0b\xc3\xf7\xc4i\xc2\x8e\xa3\xb3\t\x1f.\xc8\xd97]\x1e\xea\r\xf3\x14\xb4C_U\xcb)\x129\x04Q\xc5\xd6\x98\xbbF\xd7{', 
b'\x8fd\x9aI\xea\xc0\x1cD\x04\x0b\xee5\x89\x9d\xcc_\xc5\xf7\xb8\xbb\x95\xbc\n&}\x96\xf9k\xf4\xe9\x82\xb3\xae\xdc!=0~\xd2\x1d^\x94\x0eN\xf1z\x03\xd3\x8e\xac\x81\xcf3v,\x9f\xf5J C>Mu\xc7`\x02\xa1\x9c;\xf8aR\x90\xc6:\xe4\xcd\xd5/\xa8\xc4.Uhq\xef\x93\xe5o|\xad\x12\x98\xfej\xa0\xdd]F\xaa\xde\xfa\xc9\x1b\x84\x80\xdb%H2(Z\xd6L\x1f\x83\xb6@\x85\x86\xb4\xf2\xb5<\xa3\x11l\x91\xab\xfdB\x08Q\xd8\x01\xe3\x8dV\xa5\xc8\r\xc3\x06\xff\xf3\xa7i\x7f\xbag\xce\xb9\x87\xa6+O\xa44A\x14y\xcb\x1e)\xbd\x19\xdaK\xd1\xf0\xe0\x05\xfb\xbf6\xd9\x8bmpG\xb1rs7\xedw\t\x15Y\x88\x99*\xe7\x9bXb\xd7\xd0\x9e\xec\x0f\xd4\xdf\xfc1W\x8a\x10\xaf\xb2\xca\xe2S\xe6\xa9e\x16"\x97\x07\x18-x#\xe1cn{\xb0\x00?\x17Pf\\\x1a\'[\xbe\x92tT9E\xc2\xb7\xf6\x13\xc1\xa2\x0c$8\xe8\xeb\x8c', 
b'\x06\xdb\x1a\x1f\xb5\x8dX L\xc4\xfdB}*3{\xe8\xcd\xd0\x9b)j/R\xbf=\xbc\xce$\xfc\xb0m\x97\x8b>;\xf1A\xdc\xd9\x86\x87\x03yY\xc6\x00\x80[-eH\x11\x1b\xa9\x1d\xb1E\xfeM\xb2\xc5\xe1q\xc3U\xf0\x07\x85\xf3\x0bh\xd1\x0f\xaa\xe4\x1eCN\x8cp<\xd6W9\x91z\x13\x84\x93u\xb9(\xab\x0e\x08\xc8]\xcc\x15#It\xcb\xf8\t\xb6\x8enG\xda\x7fc^v\x89\x9fk\xae\xf9\xc9\xffZD\xe6\x9d?\xee+\x94\xa2\x17\xa4\xd3\xe5\xa62\xa5.\x12\x95\xcf\xec\xa7\xa3\xb4\xdd\xd7wd\xc7J\xde~%\xeb\x16"\xdf\xa0\xd4&6\xba\xe3x0\xbeis\xaca\xf5\x14\xb8\'@_5\xe7\xd5\xfb\xf64\xbd!f\x8aol\\\xd21\xb3T\x98r\xd8\x0cbV\xa1\x05\x81\x88\xaf8,\x1c|S\x9a\xc0\x02\x96\x04\x10\x8fO\x18\r\xb7\xe2\x01\x83\xc2\xfa7\xe9\x92\xedK\x19\xe0\xc1:\x9eP\xef\xf4\xa8\x99\x82F\nQg\xad\x9c`\xea\xf2\xca\xf7\xbb\x90', 
b'\xdc\x92\xeba\x10\xa5<,\xb1\x88\x18_i\xe9\x94Kqh\x8d\xe6\xf3\x14\x990\x8fM\x86\xd9\x82\xee\xc4I\xba\r\xb7\xc5)l\xa9:\xdb\x1d\xb9\x1c\x93\x8ab\xb0\xb48>\xaeUE\xe2\xf5O\x1b\x02\xf7C\xff\xe3m6\x1a\xcf\x80\x07\xa1\xad\xb3\xbfr\x17~\x04\xddS&\x8c\xa0\x16\xc0`\xcaje\x1f\xf6\x97PH\'J#\xf83n\xaa9\x13 *\xc9\xef\x96Ds\xecBZ\xd4\xfa\xce\x9d\x95/\xfc\xc3\x00\xc7;y[\xd7Rk\xe0\x9e\x9a\x03\xe4\x0b\x9f\xedV!"t4\x87v\xea\x81\xe8\x0e\xf2\n\xb2\x9b\xfbX\xd5\xbcA\xc2Gw\x91d\x01\x90N\x8b\xe7=\x7f\xbb-\x0c\xb8\x89^\xda+\x84\x98\x08p\xd17\xa6\x11\xa4\xe1(1Q.\xd0Y@%\xa2\xa3\xc1L\x0f}\x15\xcb\xc82\x12\xe5|\x8e\xac\xd6Fc\xcd\xf0\xf1\xcc\xb6]x\x06\xfd\xdef\t\xdf\x19\xfe\xd3\xb5u?\x85\x05\xafW\xa7\xf9\x83\x9c\xf4\\$\xd8T\xc6\xbdz\xd2\x1e5og\xbe\xa8\xab{', 
b'DL\xf5\x99UR\x8eN\x97B\x1a\xe6m\x9c\xf2\x943#\x9e\xcf\x9b\xd3\xa0\n\x8cp\xd5\x0b;O\xdf\xbeZ\x08\x95\x07W\x04E\xaa\xb1\xc8\x13\x87\xd8\xea\x05\xd7Cv\x00&\xa7\xc6(s\xdc<\xa4/\xe9\xdd9\x85r\xfb\xd2\x1d\xfc\xff\xed\xc4yu\xe0\xfab$\'Q\xf7w0!h:=\xfe\x16q\xc3\x17\x82`\xbc1\x19g\x8a\x12\xc58c}V\xf0\xab\xbdH\xeb_KAY\x9f\xfda^\x15\x98\xe56\xb5\x90\xef\xd9\xc2\x02F\xc0\x89\xd4\x83\x0e4\xe1 -\xf82\x8b\xb7\xbf%[\xb0\xe2t\x18\x80\x93J\x92\x7fn\x0c\xc1I\xf1\xd6\xc9P\xc7\xd1G\x86\xcc\xb6\xd0\xb9\x84\x1f\\>\xca]M\x91\xba?\xcd.\x06\x8fj)x\xa1o\x9d\xf67\xa3\x10\xda\xce\xb8\x9a\xe8XTS\xae\xde{\xb3\xf9\r\xaf\xa6"\x0f\x14\xb4\x1bi\t\xe35|*f+\xa2~\xe4\xa8\x1c\xac\x8d\x1e\x11\xad\xb2\xec\xf4\xeed\x81\x03\xcb,@l\xf3e\xe7k\xdb\xbb\x01\x88z\xa9\xa5\x96', 
b'\xa9\xf8\x17 \xc4\xf1\x7f\xa8\xa0~\tf\xef\xb7\x07\x9a3\xa5"\x01*\xeb\x95\x92[9\xdd@5_vp#\x12\xab\xde\xc7d\xea\xe0a\x8cx\x15I\x0b\xb2E\xb5\xf5\x93V\x18\x9f\xa1\x1a\xb9!R\xbbrA<q%\x14Zg\xbd\xff6\x89\xe6.>(\x04\xb0\x88\x86;,\xdc\xfd\xc6{\xacY\x8d\xbc\xfa\xf6\x10\x8f\xda\'\xdb\xd8\x9b\xcc\x02\xd9F\xc3z\x1e\x8bH\xf4\x98L\x08J\xd0\xc9\r&:\xc8\xfbXG\x19\x85\xb4\x001\x1d\x8a\x80\xc0m\xf9\nU\x83\x97\xd6\x91\x82u$\x03\xc5\xfe`\xce\xf3\xe7l\xee\x87}\x0fB\xec82\xa4]y\xc1\xdf\xaa\x84\xd7\xcbn\xe3c\xe2o0\xb6i\xd5sCQ4+\xe9h?k\x13\xed\xd2\x1bNt\x9d\x99b\x94^\x0c/\xe5\xbaD\xd1\x81\xb1\xd4O\xa3\xcd|\x9c\x8e7\xafP-\x90\xf2T\xcf\x1c\xfc\x96\xa6e\xd3\x9e\xe4\xcaM\x06\xad\xa2\xae\xb8\xf7\xa7\x1f\x11\x0e\xe1\xf0=WKj\x05)\xc2S\xb3\x16w\xbe\xbf\xe8\\', 
b'Au`\xf2\xe2lw\x99\xa1\xf4\xffFD\xfe\x83\xba\x87R4\x18\x07\x85\xcc\xbc:\x8a\x15\x8eO\x0b\xdf\xc2@+\xde\xc7n\x9e\x80\x10\x97\xf7\xd4\xe1c\x9b\xcd|\x04!\x89\xae\xf5\x81~\xadd\xac)\xfd\xc8\x0e\xe3q\xfb\xb4\xdd\xefE\xda\xf1\xedJX\xc6\xa3\xc48/\xcb\xf0^7\x11\xcet\x84f]\xd9\xdc\xb8\xbb\x9c\x0c\xbdI\xa4\x7f=3\xf9\xcaU\xa5\r\xd5\x9d(\xdb\x06\x8b\x08\x19\xd0\x16k\x90_\x02e{z\x01\x8d\xe8\xb9\xc3\xea\xd6a\xe5m\xf3\xe9\n\xb6T\xbf\xfc\x1c\x8f\xb1\x14"95x\x881p\xaa$G\xf6\xa9\x1b\xb7Pr\xc1\xd7[\xb2\xfa%B#\x82\x0fC\x96\xa8>y\x1d\t\x93N\xeb\x95\xc02\xd1b\x05\xb5\x866\xee\x12\xa7M\xcf\xa0\xf8\xe7\xa6\xd3}\x1f.Kh\xe6\x9f-\xab\xd8\x9a\\&\x92S\x1e \xb0,\xb3?0\x8c\xc9\x13\xd2o\xc5\xa2<\x17V\x98\xe4vHQ\xe0*;\xec\x00g\x94\x91\xbesY\xafLj\x1aZiW\'\x03', 
b'\xb2u\xc5P\xa4\xe6\xc9\xba\xfdAV\xfc\\v~_\x1e\xf1G;^If\x93\xed6\xf9\x81\xb5M\xf3\x05\x90\xfe\xd6U&\x88\xa5K\x1f\xca\xb3ma\xde\xee\xafW\r\xe0\xd7\xe43\'\xcb4\x8bN\xbd8\x10s{\xc4B=\x8e\xcdln($@\x9b\xb4\x17\x86\xda\xc2\x1a\xc0r\x19x\xd4\xa6\x0b\t<OS\x8c+\xa1q\x9f:y\xefi\xc6\xb0*\xad\x97\x13\x1d\xcc`\xd5\xdd\xe2L\xa3.p\xf0\xea,9\x02X?\xac\x84\xaa\xeb\xe3[1\xdb\x16\xbbb\xa0\xbf\xd9\x9a\x9d\n\xe9\xf2\x95\xd8\x80\xa2\x99\x18\xa8\xdf\x06k\x04\x00\xe8\xd2\xdc\x83\xc1\x8f\xf5\xae\xc7\xce\xd1>j\x91\x8d\xcf\xb1\xc3R\x7f]"Y\xabTHC\xa7\x0f\x89ch\x1c\x98\xd3Ewt\xf8\xb670\x07 \xfb\xe1\x12\x8aF\xbe\xa92#\x87\xb8%\x15\x14\xb7e\x08\x94g\x9e!-\xecZ\xfa\x11\x0c\xe7\xb9\xf4DQ\xbc\x92)\xc8/\xd0J\x01\xf7o\x03z\x1b5\xff\xe5}\x82\xf6\x96\x9cd\x85|\x0e', 
b'C\xd9\xec\xdcQ\xe3v[\'\x91qH\xed\xf5\xda\xbaX}\xafrRu8\x1fp\x90\xe7\xeb\xab\x14\xc86\x1e\x0b\t3<\x11\xa8\xaeE\xccV\x9b\x9f\x94\xf6{\x81\xf2\x97]o5\xd8\x05\xb9=\\\x18\x9a\xddP(w\xb7Z\xbe4\x8ex\xfe\xee\xfba\xaa\xfd\xd1\x8a\x19\xdbY\x0e\xf4\x01\xcd\xf1SM\xbcy\x10\x1d\xb6KTg\xa3f\x00\xa4,\xce\x9cJ\xbd\xd2+\x96\xb2\xe6\xb3e\x12\xd3\x84G\xe5\xb0\x95\xa7\xacI~.O`\xfa:\xe2\x9dL\x8d7\xd5\x13\n\xc9#\xa0\xe4\x8c\xb8t|\x99\xa1\x06\xe8d!\xca\xcb$_N2\x80sb"iB\x03h&D\xde\x04\xb4\xc2\x1a\x89\x93\x17\xa2\x82\x9e\x02\xdfn\xef\x98\xff1*\xe1\xe9\x16\xeak\x85\x07\xcf\xc0\xf7\x0c9\xc5\x08\x86@\xc6\xf0\xf3\x7f\x92z\xad\x8f\xc4\x0f\x8b- \xa9\xd0\xbf)l\x1b>\xd6\rm\xf9%\xd4\xfc\xc3^Aj\x88/W\xb1\xc7\xa5\x15;\xa6\x83\xe0cF0\xbb\x1c\xc1\xf8U\xd7\xb5?\x87', 
b'\x9fqW\xe3\x11\xc7\xa6J\x0b\t\x8b\xc8\x1e\x9c\xe9\xdf\xc9\x81\x90\x87\xa2\x1f/%\xb9]\x10I\x84\xdbipb\xea\xa0\x0c\x039F\x17\xb1X3\x9e\x86\xa8:y"\xb5e\xb0\xbf\xc0kV\xcfDrAK;C5\xa9\x93z|\x89mP\xc3\x18$4EH+t\xc5\x12\xd9\xf5w\x83\x8f\x9b\n?a\xbd}\x13\xfe\xf7\xee=\xe2\x80(\x19\\\x14\xf2 \x8c\r`\x85\xabB\xcdl\xe7\x07\xb4\x94\x01\xf0\x1b.\xaa\x1d\xd5\xf1\xf8\x9a\xdac<\xf9\x7f\x96Mo\x98\xca\xa3\x8a\xfb[x6\xba\xe4\xe5\xde\xf3\xef\xbbh\xdc\xd3\xe6\xd4u\xae\xc1\x05\xc2\x15\xfd\xff\xedg\xe1\xe0\xfc7\xbcR8!T\xe8\xb2vZ\x0e\xac,\xf4\xa5\xbe\x92\'\x95\x99\x82fO>\xa7\xc4#\xec\x00\xc6\x1a\xdd\xb3_\xad\xd0~\x1c\x8e\x02\x88\xa42\x04\xa1\x08&1Qj\xf6\x97\xb8\x16\xd2\xccs\xcb\xd1n@\xd8\xb7\x8d\x9dLGN^\x06S\xce\xd60)-\xfa{\xebU\xb6\x91\x0f\xd7d*\xafY', 
b'\xfe\'\xc24\x9c\xd3?w\xba\x0b@M\x16]\x96\x9a\x8bJ9\x0c(\\\x17\xbcg\x1a,IR\xc0C\x04O2Tzb\x13\xd0\xcbq\xfb\x95\x86\xa7\xe0\x10\xeal\xb8\xd7B\xc4\x1d\x9b\xafd\x9eS\xccs8\xf8^j\xe2\xb5\xb7A\xb9\xa9~\xcdNn\x02a\xa5\xefL\xfd\xe7\x89|\t\x1e\xed\xfau\x8f\xf5\xd1\x06+\x0f\xa4K\x8e\xc6\xec3\xf3\r\xce \xaa\xf6\xb3\xf9\xac\x1cY\nZ*m\xca\xf4\xcf\xa3v\xc3%\xd9\x03)\xc1!P\x0e\xa1$7\x80\x97\xeb\x14}\xbf\x07\x8a\xb2\x15x\x91\xfc\xa8\xe9\x87\x7fi1\xd6\xab={\x94\x82\xf0\xa2\xb1&\xad\xbd0\x08\xa0\xdd\xa6\x1b\xe1o\xc9\x01Ge\x81\x83\x8d\xd86\xe5\x92\xbbW\x18\xdc\xde\xd2\x19E.\xb4`\xe3\x8c;\x93[\x90\xb6Hr\x00\xdf"\x99X\xd4\x12\x1f\xdb\xaepFD>/5\xda\xf2\xc7\xd5\x98QU\xe6\xe8\xe4\xbe\xee\x05\x84-\xb0\xc8\x9d\x85k\x88_\xf7\xc5cy\xf1h<:Vt\x11#f\x9f\xff', 
b'\xbe\x08~\x12\nm\x9a\xf9{\xad\x96\x7f\x99\xccZ\xd7\x80\r\xa7\xceC5\x18S\xa6\x06\xe9\xa5Ua\x8a\xb5\x8c\x14\x04\x81\'\x88\xc61#]\x9c9\x13oj\x16\xaacg\xca\xe6\xdf\xd1\xd0\x91M\xd2\xf3\xa0v\xd3y\x8f\x94\xee(\xbc\xbd\xe5Y\xab\xbap\x9b,Q\x87\xc5wn\xe0\xfd\x17\xb1H\x15\x83\x02\xb9\xd6_\xb4R\x9eth\xac\xbf\xb3\x8bG\xc2\x9d\x93\xfa&\x1e}2\x00\xdaO\xf7\xe8\xf6\xcd\xc9\xc7-z\x1a\xc3"\x1b\xd9X\x03\x95\x0b=\x82x\xf1\x1d\xbbN+/!\x9f\xcb\\\xf2q\xb6\xa4;\x05\x98F\xfc\xe4\t\x0e\x85BP\xdc`\xdd[i\xd8:6f\xcf\xff\xe2\xa9D\xb8\xd5<\xde\xd4\xc4.\x92\xed\xc1\xf4\x90\x11^\xa3\xdbe$\xf0\xfe\xfbb\xa8|\x84\xb7\xae@\xc8>V\x07W8\x86\xe3E*rK \x0f\xf8\xaf\x8e\xef\xa1\xe1\x1f\xf5\xeb)\xa2L\xc0%\x10\x014IJ30\xea\x97\x89u\x1c?\xb2k\x0cA\xec\x8d\x19\xb0sTdl7\xe7', 
b'\xd3X<\xa7UQf\xbb\xe1\xcd\xd1\xff\x1ch\x0b\xb7\x87\x12[\x1ev\x86\xa3-\xf5\x9fo\x95y\x03O\xd2Tp\xba\xfe\xac\xcc\xa5W\x18\x19\xaf\x11\xb5\x81\x9b\xa0\x83\x90=\x84\xd0c\xad\x02\xdb%\xc3\xc5\x1f\xfb\xf40B3m`\x1d|L}\xfd7\xb8\xbd\\\xa4\xce&\xcb\x9c\xb3\x1b\x04\xecP\n\xe8\xdd\x13,\xf7\xa1\x80\xf9\x9d\xabjE~ \xe7@\xb0+\xd5J\xaa\xa9\x0c_\x0f\xb2z\x9a\xa2\xf1\xfc6Sli]\x8d\x82\xc1\xea\x96Kq9.\xc8MR;\xc0Fu*x\x17\xf2/\x92e\x88\xc7>\xc9\x08tC\xb9\xed\xf3\xe2\x99\x10\x8b\x93Y\xca\x8f\xf8sI5\xfa?k\x15\xae\xb4\r\x94^)g\t:\xa8\x1ad4\xe4\x9e"\xdc\xf0\xc2\x05\x16\xe5\x91\x8e\xe9\xeb\xbc\xa6{\x00H\xb6V\xc4\x8a\xdf\x14\x7f\x97\xef\xf6$G\xb1\xd9\x06\xee\xda(\xe6!#2\'\xcf\xe3\xe0A\xdew\x01\x85\xd7\x07r\xbf\x8c\xd8n\xc6\xbea8ZDN\x98b\xd61\xd4\x0e\x89', 
b'\x14\xa0\xe6\xd7\x16\xce\xea\x13o\x83\xed\xe8\x97\xc5\x19\x8d\x1b\xb0X\x84Zl\x98\xa7#\xee\xdd\\$\x90\r-U;\xa8GC\xf0\x8f\x9b9\xbfw\x1c\xab\x884\xa1\xb9\xdc\xe9\x06_E3\xb3AM\xf1\xd0{=\x0f\xc6\x00\x95\xe0\x89\x7fy\xb57^\x9a\xec\xca\n\xeb\xb7\x0e\x91vS\xd5\xe55\xf9\xa4\x08dn\xb8\xda/\xff\x93s\xdb\xe2(\xd88\xa9\xbe\xf4\x96\t\x01R\x17\xc9x\xd9!2+p\xf6\xb1\x12u\x80\xa5b\xa2\xc2mf~61L\x82\xef\xde\xf8\xc0ji\x05\xd6\x8c\xcd\',\xa3[T\xaeN\x9eFrW)\xaaa|\xf3\x15\xbb\xfc\x9c\xe7\xfe.\xac&\xc1\x94q\x02\x86g\x92\xc8h\xad\xd1\xb4\x85\x87Q\x1f\x110"\xcf\x1eO\xf7]\xe1\xc7\x1dz\xcc`\x9d>\xcb\x8a%\xa6\xaf\x99\xd2\x0c\xb6\xfaB\xbd*D\x18\x10\xd3\xc3\xc4\xf5Y\x8eH\x03c:\x0b\x07?\xfb\xfdP\xf2e}IK\xdfVk@<\xe4\x81 \x9f\x1a\xbc\xe3Jt\x04\xb2\xd4\xba\x8b', 
b'\x84\xbd\x1f\xa0\xaaOD\xf9#\xb2\x16J\x87\xb5r\x955\x0b\xb6{(\xd6\xde\xa8\xcc\xbfp\xb7\xb4v\xe6"a\xe4\x94\xact\x01I\xff\xc3\xdb\'\x89\x1b\xe3\xc5\xe5\xd3\xab\xef8*\x0f\xc7\xc0c\xe0\x8d\xf4P\xa7W\nR\xa5X\xd5m\xad\x9f\xba/\xbe\x9b\x82GE\xca\xf7\xe1N\xa3\xa1\xf6\xbb=C9\x04\x97\x85\x9e\xa4;~\x981\x91\x8b\x8f\x05\x15%\xc1\xc2\x07\xa6\x14\xddo \x19\x93gfT\xf3\\Q\xd4\xfd72\xcd\xea\x8a\xf2\xa2e\x1c\x12B\xd7\x10\x00\xebZ\xc4\x0e\xb9]:\xed\xdc\xfb\x8c\t-U\xfc\x0c@\xe2\xf1)\x80\xc6z\x02\xfa\xc9\xb1\xc8S\xf0s\xb8\xb3\xd1&!\xbc\x1d\x81|\xe7A3\x9c\xd8\xafqhi\x9d\xb0_\x86\xa9\xfel\xec[\xe9\xae\xdad.\x90\xcb}F\xd2\xcf$\xe8\x1eL\x9a\x1a\x83\x96<K\x17y\xf5\xd9u6\x03\x06n\xce>x4\x08`Y\x11k\x99wb\x18j\xee\x8e\x88H\x13^?0\x7f,M\xd0\xdfV\x92\r+\xf8', 
b'\xb5\xbc\xba\xd8\x10M\xb3>\x9eH\x9a\xaf/\xc36\xc5\xc74\x0c\x1c}\x8f\xa8\xec\x17\x1aj\\\xd6_,\xef\xfb^\xaa{\x03\xe8\x05\xf8\xd9!q\xbe\x1d\x0e\xb4&\xb0\xfd\xca0\xc0\x98Tm\n[lsDc5\xab2\x0b\xf5\x87n\x93\x85\x88\x84\xf1)\xe3e\xf3\xddY\xd5%\x86\xa0\xfc(\xf2.\xe4\x1f\xbf\x087\xdc\x99*\x168\xce\x07U\xe6\xf4\xadZ+\xde\x8d\x1eB#\xa4o\x9c\x95$\x15\xe1\xc2\xea\xb9\xcbg\xa7\x96p<\xe7\xa9J\x12 ?\x80Adu\tf\xfewLyG\xcf\xf7\xdf\xdbk\xeb\xbbvX\xc4\xd1\x8b\x06\xe9\x91]\x97\xb2\xc8\xb7:\xa3\xfa\x04a=~\xda\xedrC\xc1\x9f\xe2\x92|b\x8eQ;\x11tV\xcd\xf0\xbd9\xd0\x90O\xee\xa5\xb1\x1bS1\xa2\x18\x7fh\x83\xe5\x82\xa1\xd2\xac3\xcc\x19P\xe0\xc9I\xb6x@zKE\x02\x9b\xb8\xf9\x00\xa6\xd7\xd3\x13\'\x94Ni`"\x14F\xc6\xd4\x81\xff\x0f\x9d\x01\x89\xf6\x8c\rW-R\xae\x8a', 
b'\xaer\xb5\xfa\x15\xe5\x9a\xc3\x84\x08\xa1s\x96\xf6\xe8\x85;\x1e\xbe\xe71\x9fV\xcd\xb7z)\x19@~\xdc.\xbf\xa4\x03\x8f\x8d\xe2\n\x8e\x11\x1b\xfb-\xc2\x9cW0y\xbb\xa6\t\xd4fc{\x04J\x88\xe6\xec\xd9\x14\x80P\xdde\xba\x95\xaf\x99\xd3\x12\xe4\xb9\xc9\xd0\x92\xf7\xbdM2\x86\x00\x1f\xff\xfd\xbc!A\x9bX\xa7\x90B\xb2*\xd5\x9dt\x10\xac\x1a\x01jQ\x06n%\x94l\xa2g\xb09\'\x1cD\x8au[\xf5\x8c\xc6?\xeaN<6\x89\x93\r\x18\xf3\\7Y\xce\xb1\x16K\x82CR\x98\xb6i\xd63\xed\xe9\xfc\x97\xe0\xe1h\xc1\xcc\xc08=\x07k`E\xa9\x83\x0b\xb8F\xee_\xf8L\xc7$^+\xeb\xa0}\xd7|\x7f\xcb\x05\xab\x02\xcf\xda\xca\xf2\x87\xef\xdb\x0c\xc5\xf0G\x1d\x8bS\xd2\xe3\x81\xb4/O\x17\xa8\xb3dv\xa5\xc8m\xd1\xaa\xde\xf9\x0fa4"\xfe\xf4w,HU]#\x91qI\x9e>\xc45b\x0eT(&:\xa3\xad\x13\xd8\xf1o \xdfpZx', 
b'\x16=\xa4\xca\xf5|p\xc9\xbf\xe1\x10\xef\xd1\x1d\xec\x0c\xc8\xed\x95.P1\x83\x9e\xaaB\x89\xae;^\x12\xeb\xce\xc1\x17\x0b\x8d\x08\xe7MD\xdev\x8b\xd0\x05~\xaf\xbckz\x87Cf\xfa-\xe9\xd6i\x9c\x9f\x1eF\xd4\x00(\xddq\xb5\n\x8e\x04*\xf3\xc2\x8f\xad%A\xea\xa3\xb7\xda\xa1\rcmuS\xe2L\xcfI\xdb\x07\x9040\x0e\x91{w&\xbd\\\xc0\x93s\xd3G\x0fH\xf7b\xe3\xf1o\x14\xa7\xc52UR\xc6h+3l\x80T\xd7\xa9\xb3\xdcW @x\xc7>\xf4\xb0]_\x81nY\xac\xcbdtV:\x8cX\x98\xf9\xee\xc3\xffg\x9b\x1cQjN5\xa0\x99\xf0\x13J\x97\xfc\t\xf26\xfd\'\x9a\x82\xb6\x888)\xbe<\xb9\xa6\x86\xd5y}#\xb8\x01\x11\x7f?!\xdf\xa2\x1b\x8aa\xe5\x1f7\xd8\xe0\xcc\xe6\xfe\xc4\xab\x92\xe4\x06\xf8\x02$`,\x85E\xbb\xa5\x96\xcd[\xfbZ\x03\xf69\x19"\xa8\xd2e\x15\x94O\xd9\x9d\xe8\x84\xb4\xb2r\xba/K\xb1\x1a\x18', 
b'u\x95\x1e6\xfbz\xee(\x7f$\x06\xc0\xb8\xbe\x84\x96\xad\xb3nF\x91T\xdc\x14\x0f\x83\xea\xfc\x01\xb9\xa5m>Z\x18\x1df\xf4\x0b\x08j\x9a\x17`\x99?l\xba\xf5,\x00g_\x1c\xa6\xc6\x12)\x93-as\x05kJ\x8b\xd23\xc4\xf1GP\xa7\xe5\xd9Q\xa2\x9b\x81\xca\xbf\x97\xf3\t8\x10{\xa8\r\x8a\xb2\x8f\xc2\x8e\x19\xfa\n\xf8\xf2<\xde\xeft\xaf\x98E\xdbb\xeb\xbc\xcc!hV\'\xc8\xe9%\xd4[\xd0\xf0\xc9\x02\xceD0K\xae\x86\x90;\xe0\x1b\x13\x85\xc3\xe8Y\xa9\x92\x9f\xdf#W\xd6\xcd\x9d\xd8yq .\xc5|\xb7\xdd\xd1\xff\xa0]\xcbc\xf6MX/\xa3\x07\xe2\x1f\xd3^\xcf\x9cI&\xd5\xb0r\x15O\xbd\xec\xab52\xd7*\\\xf74\xdaew1\xe7\xe3\xa1\xe4\xa4\x04\x0eo\xe1L\xed\xb5@\x11\x9eS\xc1\x8c}7\xfepvi\xb1\xb4=\x89U\xfd\x82\x80AdxC\xc7H~\x0cN\x87\xb6:\xbb\x03R\x94\xe6+"B9\xf9\x8d\x1a\xaa\x88\x16\xac', 
b'6K\xe1\xf2*\xd4\x9d\xc1wd\xeb\x85>\x18\x1d\xeea\xed\xab\x83\xc7(\x13!\xba\xe6\x1cJ\x9c\xa7Q\x00y\xe0|\xcb\r\'_]\x02\x8c@\xe5\xfa\xa0\xcd\x98\xe8\x05\xafkz\xc3DP\xe4{h\x99\xb7H\\^\x9e/in\x12\xd7Z\x8bm\xdf7\xf3\x9bY\xf0\x92\xa3E\xce\xbd\xcfo\x9afq\x82r\n\x08~l\xe7-\xbbCu\x03\x97\xa4\xdcg\xf1\xb9"\xd3:\xc4\xd6M\xca\x19B\x81\x04\t1\x90U=j\x95\xc9\xfc\xd1\xf4\xf9\xd9\xc2?c\x8d\x898\xb4\x8f\xb3\x0be9\xaa\xc6S`\x1b,\x86\x10\x17)\x0e\xf5\xe2\x06\xde\x1fL\xb6\xbe\x0f\x1e\x91\x9f\xb5\x8e\x14\x1aW\xda2\x7f\xa6$\xd2OF0RvT\xfe\xf7\x88NsVt\xa2\x8a\xac\xef\xdd\xc5%\x01\xeab.\xa5\x87\xb1\xc03;\xfd\x80\x96\xdb\xbc\xd8\x84\xff\xb2\xa1\x16\xec\xa8}\xf6\xa9p\xcc<\xae\xad+\x94\xfb\xe3\xd5A\x15\xe9\x0c\x93\xb8\xb0\xf8\xc8\xd04x[#I&\xbfG\x07 \x115X', 
b'\x8f\xe6\xe4L\xa2\x15Uy\x02V*x\x8a\x8d\x03fYQ\xa4\n\xd1\xf9\x89m\x1c(]\xd7\x95\x8b\xd0\x10@\xdd\xfa.\xb2\xc3K3\xa6\xb1=\xca\xfb\t\xcf9vn\xa5h\xe5|\xe8aG\x08\xc8\xd9O}\x9ck \x01$\x1b:\x84b\xc6S\xbfMe\xbc\x85\xc2\xaf8i\xe2\x90\xa7Ds6r\xad~Rz\x1a\xd6T\x94\x8e\x1f\xa0\xff\xde\xd2\xdb\xa8I\x83\xa1\xcd1\xec\xa3H\xfdC\xd8B\x87\xed\x14)\x9a\x11#\x0b\xf3\xb9\xe0\xe9\x1e\x9e\xb4\x81\'\x9fl<{\xc0\r2\xcbw\xeb\xd4&d\xf0\xef\x00\x827\xda\xfeq\xdf\xb3\x17\xf7\x13oc\xac\x97\xb8\x1d\xf2\xc9E\xd3\xce-\x12[\xc7\x0cg\xab\x19/j4\x91\x80\x06;\xc5\xe3\x7f,^`\xccZ\xbd\xae"!\xf1\x07%\xc4\x050PA\xbep\xf6\xaa\x93?\x16\xb0\xfc>\xb5\\\x92\x86+\x8c\xf5J\xb75\xc1\xee\x99\x04\x98\x0f\x18\x96\xe1\xbb\xba\xa9\x0e\xe7\xd5\x9b\xf8\xf4XN\xdcutF_W\xea\x9d\x88\xb6', 
b'\xbc{\xe0\x88\x10\x1b:\xc6d\xb3\x13\xa9\xd7\xdb\xae\xb5B7z\xc2k\x025\x9a/\xce.\xc3&,\x93\xfc\x03Cs\x8d\xf1\r#\xd4O\xfa\xe5L\xa0$I\x05\x18E\xcf\xc1%\x1d\xa7Yo\xfe\x04@\t\x1e\xc4\xf7R\x8f\xa3\xb4\xcc\xd6\x12\xddtU\x9c\x89=Q\x98\x8c\xc7\x11\xe4-e\xfd\xd8\xdc\xc0N9m\x8b[^\xf4\xe3a\xb0\x9fT\xd3u(+\\|\x0f\x15\x82\xac<\xd0_\xe2\x17\x01vS\xda\xb6b\xb7fA\x95\xb9\xaa\xcb\xcaW4!\xbdK\xecp\x1c\x97q\xe1\xb1\x1a\x84\xeb\xb8M\xa8\x86\xad0\xf0\xf96\x96\x92"\xe9\xde? \xf2\xd5\xaf\xa1r\x85\x8e\'\xa4\x00\xee2\xean\x9b\xc8c\xdf1\xe68\xd2\x81lD\x06\xe7\xf8\xef\x07\x993Vi\x08\x80\x90\xa5\xab\xf3P]\xf6\xba\xd9\x7fX\xfbx`\x9d\xcd\x0bj\xbb\xed\xa6>\xe8\xc9\x1f;F*\xd1\x8a\xff\xb2\x87\x9e}\x16\x91Zw\xbey\x83\x14\xa2\n\xbfh\x0c\x19\xf5\x94J\x0e~)GgH\xc5', 
b'N\x82\x84\xe9\xb2\x83=\xdc\xedE\x89\xf5\xec\xbc\xbb\xd7\xf4/\xaf\x1f\x1b\xff}\xd9\xfb\xcb9\xbd+\x9d\xf1\x04q\x86[\xa5\xc6\x0fL4\xc7U\x80\x1djs\xfc\xf8\xf9.i\xc8\xc9~\xf3\x920\x05\xdd\xcf\x81\x96\n\x1a\xab\x9e\x13\x7fa\x08g;\xb7\xa9\xe3<\xa7\xb6 \xa1:\xd4\x94\x8d\xbe\xdfd\xefk\x11(\xb8\x10H\x03\xa2\xd2CA>\xd5t\x02\x99\xcaZ\x17)\xd0JG\'\xebr\xe1bP\xba\x06\xccB^8\xb4\x1e\x9c\xd1\xe5\x00#D\xf7n\x9a\xae\xb1%&\\\xc1O\x95\xc3]mp\xd62\x8ay\x16\xc2,eol\xfd\x87\xf6\x1c\xe4\x15\x9bF\xac\xcd\xc0\xa4\xf2\x07\xee\x0eT\xaa\xe6{K\xa8`\x0c\x8ew\x8f\xf0\x18\xb5\x8c\xdbQM\x98\xe7\x8b\xbf\xa01\x85\x88\xda\xa3\xfe6@\xb0\tx$5u\x14\x90\xad\x91\xa63*fI\xeaY!v\x01\xe8\xb9\xe0\xe2z"\x9f\xd37W\xc5\xc4hX\x19\xfa\rcR\x97?_|\x12\xceV\xd8\xde\x0b\xb3\x93-S', 
b'T\x1fM5\xbaj\x05\xb5^ n;m\x82"\x86\x88\xc4\x83\xaf\xa2\xa6\xaeE\xe0|\xc5\x91\x89\xdd\xdb\x17O\xb2zo=\x99\x9bc6\xd99\x1d\x84U\xc8\xe5<\xd5\x81\xb6Qd\xf4x\x9efC\x07\x800u\xac\xda\xee\x16\xed\xbe\xb9s\x15\x8d\xc1{\xe2\x1aI\xc9\x9fh\x94\xde\xce\xfe\xc6\x0e\x8e\xb47Y!\xe4\x1e$~r\xbd\x04\x8f\xab\xfb\xcf\x95}\xdf\xe9\xa9\x08\xfc?\xbbX\x873*\x85/\x0f\xe6\xd1\xe8\xe1\x90\xb8\x92V[g]\xb0\x0c\x01t\xf5\xa8(\x9aF\xc3\x034\xf1\\\xc0G\xe3\xdc\xef\xaa\x7f\x06H\x00\xa5>bW\x10,\x97\x11R\xff\xb7+\xf3K\xa11-\xca\xfa\xbf\xb3\xea\xa0\xec\xd4`S\xd3\xb1\xf0\xf2\xcd#\xa7\xe7\x13)\ni&Z.JNaeD@\xa4w\xcc8\xebA\x1bv\x8c\x02\xd0p\xd2\x8b\xc7l\xf6\xf8\xfd\xbc\x9c\xc2\xd62L\x18\x19\xa3\xd8\xcb\x93\x14_q\xf9\x9d\x96k\x8a\'\xd7\t\xf7yPB\x1c%\x98\r:\xad\x12\x0b', 
b'Q\x170H\tn:\xf5\xe5\xc5\x9bU\xde\x83E\xcaL\xe9\xd9\x8eO_\xc96\x97\xd5\xa1\xfe=*z\xba(,\x9c\xad\xf3\xb1e\xee\x80>\x0b\x92C\xfcm\x8dq\xd3\xb0g\xab\xf2lKP\xe0h\x0f9\x061x\xe1\xb8\xcedv\x9f|V\x16\xc6}\x99\x08R\x03\xc3\x02\xf7\nZ\xb3\xf4\xe6\r\x07S\x9e5\x11\x8f#\xc2/\xe7y\xa6\xd7\x14\x93\x94\xa4\xd8\xdf&\x8b\xa9\x1c\x19X8A\x81\xbc?\x84\xcb\x96^<\xa0\xc0\x10\x1b\xac`!D\xa7j\x1e{\x82rM\\\xe8\x1f\xb5\xf0f\xbf\xcf\xc7\x91\x9dJ~7\xae\xbb\x12\xaa\xeb\x87\x15\xc8\xa8T\xf1\xb2\xb9\xefo\xa5t \xd1%aG\x9a\xed\x95\xf9\xbe[\x90\xec\x1a\xf6@u\x0e\xd6\xd2\x98Y\x13i\xc4\xfak\x18\xe4\x86c\xd4\xff\xb6\xb7w\xbd3.\xeaB]\'\x8ab+;\x8c\xdb\xb42\xcc\xaf\xa3-\x7f\xcd\xfd\x85Ip\x88\xd04N\xc1\xda"\x89\xf8\x1d$\x04\x0c\x00\xfb\x01F\xa2\x05\xdc)\xe3\xdd\xe2Ws', 
b'\xb9\xac\x9d\x05\xa4\x84aG\xc4Q{_\xb13\xd5\x8b\x93\t\x01\x15\x88\xf5n5\xc2jA\xe6\xc9\x1bf\x1d>\x16\x8as91\xe1O\xd6JZ\xef\nxX\xf8\xcd\xb6\x0e\x89\xb5\xf0\x19N\xca\x1e=\x0b\xc1\x18\xde\xad\xf1!M\x04}\x8e\xf6\xf2%P\x86HB\x14q\x08dei\x82p(\xd1`\xcf\xc0\xf9Eu\xc6\xb4D\xcb\xbc\x97\xfbT\xb7\x98m\xb3\xedR\xe3\x06\xec\xee\xdf\xe0\xe54w|\xfc\xea\xa7\xbb\xb2\xd3\x9c\xc7\xd4\xd9]\x9b7?\x80^/\x8d\x1aC\x03\x83L-\xe8\x11r\xe2\xa9\xa16\x99.\x9f\xe98Fl\x1f\xa6\x9a\xa5\x87\xa3tI\x00\x10\x81\x1c\x13\xce\x07\xd7\\\x94\x9e\r<\x90\xfd\xa2\xc8,\x12\xd0U\x92+\xfa\xbeY\xf4b"\xd2\xae\xda\xdb\xd8cg\xfe\xbd\xeb\x91\xff\xcc\xc3\xaa[\x7f\xf7W\x17\x95\xb0\xbaS\xc5;#v\xe7\x0cK\xbf~:zo&V\x96\x0f\xf3y\xdd\xa0*\xe40h\x02\x8fk2)@\x8c\xab\xdc$\x85 \xb8\xa8\xaf\'', 
b'\xab\xd3\xdd0u1\x9b\x92\x86\xf6\x01\xb3A\x1a\xb9(\xed\xa3:\xb2\x02b\x95_\xfb\xacRf\xa7\xc3\x8a\xe5\xc9q\x08\x81J\xc7\xad\xe9\\jr\x8eH\xf9@w\xb5\xde&\xbb\xe3\x9c5\x97\xe8i\x90\x1d\xdbY\xce\xa5\xa4\xcf\xae6\xe73\xa2h\x8b\xbfdCg\x17\xf2\xe1\xa6\x1f"=^\xf1|\xd2\xd7\x10\x8f\x0f\xb0X\xd4\xeeyvV\xfa\x80\xf0\x9a\x87\xaf\xd98\x85\x84!\xc47\xaaF9z\xe0\x9f\x99\xa1\xe4\xb4-\x0b\x88\x0eo\xc8K\x14L\'x\xd8,\x192\xd6P\x03\x04?\n\xa0k\x13\x07~\xc6\xbe\xc1\xb8\x1eI<\x05\xeb\xcc\xbc\xef\x7fBG$Dt.\xf7\x0cn\xffl\xa8c\x18\x8d\x96\x91\x89O\x82e\xf5*\x83}M\xc2\tSU\x1c\xa9\xb1\xec[\xc5{\xf3>\x00\xb6)Q\xd0\xfc\xdc\x16\xfd\xcaWp/\xba+%\xc04\xfes\xf8N\xd1\xda\x93E\x12\xcb\x98\r]a\x06\x1b\x94\x15\xdf\x9d\xbd\x11;#\xe6TZ`\xe2\x9e\xf4m\xd5\xb7\xea\xcd\x8c ', 
b'\xb2\x11wuZ\xb7\xa5\xb1\xb6\x88\xe2~\x8b[]G\xcfV\x94\xd2\xfa\xb9\xfdN\xee\x9f\xa2\xe3mf\xc2\xd5\xa6\xc7\xf1g\xc9\xc1\xc3\xb3\xba\xdcAr/\xfc\x8c\x86\tM\x1f6\x93\xcee\xef\xae8\xd0\xaf\x0f\x14E\x057^F&\xe1\xa92*\x01\xc6|\xe7\xfb\x08\xa0\n_3\xd3\x18a\xd9k\xa7\x9c\xdfTC\x06\xb5\xf8L\x97\xb4\xdb\xcb\xe6\xd7\xf6\x9e\xfe$\x8f\x0bz\xdd0X+\xbcH=\x81\x7f\xb0J<\x07\xffOB-d\xa1:\x04\xf7\x84Y\x1e\x99?\xd8\xea\x8d\xecW\xbb)\xac\xf5!\xcdD%nx\xb8\xda\x13}5@\xe5y\xc8\xab\x19\xccqK\xc5j\xbd\xde\x02\x00\x90\xc4Q\xf4\xbeS\xf2\x91v9\xa3\xedI\'l\xeb\xc0#>{\x95\r\xa8"\xe8\x0e\xadP\x1c\x1b\x8e\\\xd4\x1d\x9b\xf0\x8a\x03o\xf9\xca\x1a\x16\x9a\xe4\x83\x89\xe0t\xf3\x85\xaa\x98\x92\xe9U1`\x10b\x12\xd6 i\x82ch\x874.\x9d\x96\xa4;\x17\xbfRs\x15(,\x0c\xd1\x80p', 
b'\x97\x00^\x1dn(\xe2\xcb;\xc6\xfb\xabcC/\xa9aI\x1f\x84\x14\xe8\x8c\xb8\x85Y\x933\x8a\xd9+\x08\xe1T\xed\xc15\xcf6p\x9f.\xaa\x18\x1b\'\xca\xce\xde\xb4!E$HP~\x13\xd2J\x91\xc8\xb7\xc7\t\xf2\x83F\xbf\xe6\x9c8\xd7\xb5\xc0\xbe-q\x03\xf8\xdc\xec\xac\x90\xcd\x1cZ\xd0A \xee\xa5\xa0r\x81\xb1\xd3t%\xa8\x04S\xd8\xe4\x07\\f)\x8b\xf7\x7f\xc4\x95m{\x98\xaf2O\xcc\x9e\xf4\x94M\xd4\xf3x\x05[\x8d\x06\xbc\xbb\xd6\xd1\rD\x1a\xfc\x96?\xdbQ\xe3]\xfa|z\x0bv@\x89\xf5\x029\x17\xdd\xeb\x9b7\xad\x82\xb9s\x16\xbd\nW\x0c>\xb6\xdf\x9d#\xa2\xb3,\xe9\xba\x10\xf6\xef\xda\xa6\xe7\x19LoB\x11ke\xa1\x88\xf0Kg\x99b&\x8e\xc3\xa7\x0f\xe5U=\xf91d\xae\xf1\xe0\x87\x9au"\xc2}h\xffj\x92\xa4GR<w\xeaV\xa3\x8f`y\x86\x15_0\xd5\x1e\xfe\x80\xfdX\xb0:\xc9\x0e\x12Ni\xc5l\x014\xb2*', 
b'AF6\x96@\xfc&\x86\x07,r\xa4\xccnE\xfe\x0b\xf6(\x14$`\x95\xc9\x05\x12\x9fc\x88\xdc\x04\xd3\x83\xe2Y\xa9B\x7fK!\xe6R\x9b\xecU\xaf\xd0o\xbe\xd5\xe0\xb1C\x81\x1e{\x03\xeb\x85\xb0I\xf8\xb9\xf2\xc6\xc4\xa6 \x8b\x80\xbd\xc7\xf4\x94\xd8/\xbb\xf9h\x113Z\x19k\xd9\x98\xb2\x08\xd6\x01\xcd\xdd\xdal;1\x17\xf7g\x1f?q\t=i\xe8ut-"\xf5\xa0\xc0Vm9\x8f\xc2\xadG\xe3\x9d\xe7\xee\xd7\x93\xca\xff\x1d\xcf^\xae:s\xf1TJe\xb7d\xedW\x0fN\xd2)\x9c\x18[w\x1a\xfd\x9a\xd1\x16\x99\xeaz\x91D\x9e}\xab\xd4\xf0\x13\x15\x82b\xaa\xb3X\'\\\xdf\xe9f\xcb<\xfaSj5\x0c\xfb\xdev\xa3\xb4\x1c\xc5\x92O\xef#\x8a\x00\x10MH\x8d\x0e\xc1_2\xbc\n\xce\x97\x84\xba\xbf\xc384\xe5*p\xb5\xb8aL\x1b\x8e\x89\x90~\xdb\xa7PQ\xc8\xac\xa8+\x02\xb6\xe1\xe4\x06\xa1.\x87\xf3>|70\x8c\xa2y\r\xa5%]x', 
b'N\xc8\x99\xb1=.\x7f\xb2\x14\xa57b\xc9\x0co\xb9\xda\x13\xe4w\xcb(\x9d<\xef\x93\xf4\xc0\xad6IJy\xe8#\xd7/\xfft1{3\xdc\x03\xdda\xf7We\xca\x92R\xbe\xac\xcc^\x07\x1c\x9b\x0b\xae\xe0\xc1\x97\x11\xcd9\x16E+\x01\xa9\x06gs\x17\xea"\x91\',\x9a\xafZC\xc2\xfb\x98;Mpz_n\x80\x12\x81u\xf8\xa0m\x9e\xe3\xd4\x02\x1a\xa6[\xa4\x8c\x1e\xee\x82G\x94\xf2f\xd0\x1b\xb6\xdb2\xdf:\x19Q~d\x04\x8f\x15}\t\x0e\xabSr8\\\xbb\xf9B\xa3j\x834\xf0\xe7\x8a\xd5\x90\xa1\xe6| \x86x\xfa\xb4\x96\x10h\n\xd6\xc5\x1fL\xce0A\xf3\xd8\x84\x1d\x0f\xb3l\xeb\x85\xf1\xbc\xd9\xe5\xba\xa7\xfek\x89\xde\xfd\x18\x8d\xb7\x9f\xc7@\xf5\xcf\xa2\xd2\rD\x8b\xc3*H\x8eV\xa8\xfcciYKO\xd1\x88$\xc4\xec\xf6X\xb0\xd3\xc6-\xed\xe1\x87\x08>q\xe9\x00!F\xb5\xbf&v?]\xe2\x9cT\xb8)\xbd5P`\x95%\x05U\xaa', 
b'\\8\xedG\x1b\xf3\x8f\xc6-;\xbb\x1f\xa5kl9\xf4\x1d\x95\xe0y{\xeb>u\x87\xf2\x92Z5\x0e\x13\xb5\xe8\xdd\xf86\x1e\x1cWmR\xbdxO\x0f:\xb4\xdf\n\xc1\x00C\xd4+j\x8d\xa3\x17\xb2\xf7\xa0\x9b)\xd6`\xdc\xea\xb8\x06\xad\xc4g\xfb\xd2<0]\xfc\xaa\xc5\x18PY*z\x8ct\xf6\x11o\xd7v\xb7|?\xab!\xff\x98\xd3\xa6\xc9\xcf\xae\x81\x85wq\r\x0c\xaf\x94\xa7"\xb0\x80K\xcc\'c=\x91\x03\x9a\x02D\xef\xf1\xec\xd8\x19Ea/\x96\xca\x89B\xc7\x15\x8aX_\x99\x0b\x103\xcdd\xce\xa4\xd5Hs4\x82\xfe\xe5\xcb,\xee\x90T7\x1ab\xe6\xbaQ\xe9\x05\x84\xb92\xdeV\x04(L\xfd@I\x97U\xa2n\xb1\xac\xa8\xf0#\xe2}A\x08\xb6\x7f\xc0\x86\xe3&\xf5\xe1\x16\x9f1iS\x8er\xb3\xa9\x14\xfa\xbf\xa1~h\xf9\t\xc2$\xc8\x93\xd1%Me\x83\xda\xbe\xe7J\x9d\xd9\x9e\x12\xdb[N\xbc\x07.fp\x8b \xc3\xd0\x9c\x01\x88F^\xe4', 
]

theflag = b'\xbc\xc0\n\xbc^\xf9\xb6\xd5\xc5\x08M\xb1U\t4\x95\x12\xceg\x08\xfb\x8a\xf1\xd2\x1a\xd8+d(\xc29r\xb4Bhz8#\xcf\x04\x904\x98\xe1\xe8\xb0\x0ci\x1d"\xb9a\x1f\x17*]\xe1\xff\\}1\xbe\x1ak\xd7\x1f\xa2C\x18\xab\xccW\xd0\x8d_\xccC,Ci\x96\xec\xcex\xa9\x06\xdd\x8e\x11\xa1\xfe\xca4\x0b\x90\xcb'

cipher = AES.new(key, AES.MODE_CBC, iv)
test = b"grouik"
enc = b""
for i in range(0, len(test)):
    idx = keytbl[i]
    enc += bytes([idx[test[i]]])
print(enc)
cipher = AES.new(key, AES.MODE_CBC, iv)
flag_enc = cipher.decrypt(theflag)[:-8]
print(len(flag_enc))

for i in range(len(flag_enc)):
  idx = i % len(keytbl)
  tbl = keytbl[idx]
  ch = bytes(tbl).find(flag_enc[i])
  print(chr(ch), end="")
print("")

Le flag est donc inctf{fly_m3_70_7h3_m00n_l37_m3_pl4y_4m0n6_7h3_574r5_4nd_l37_m3_533_wh47_5pr1n6_15_l1k3}.

That's all folks ! :þ