Sam & Max » mraaaah http://sametmax.com Du code, du cul Sat, 07 Nov 2015 10:56:13 +0000 en-US hourly 1 http://wordpress.org/?v=4.1 E-ink et confiseries 29 http://sametmax.com/e-ink-et-confiseries/ http://sametmax.com/e-ink-et-confiseries/#comments Sun, 28 Jul 2013 18:34:21 +0000 http://sametmax.com/?p=6897 Pour conclure ma série d’articles autour du coffre secret de Sam et Max, je vais finir avec une présentation du cadeau qui était à décrocher.

]]>
Ceci est un post invité de MrAaaah posté sous licence creative common 3.0 unported.

Pour conclure ma série d’articles autour du coffre secret de Sam et Max, je vais finir avec une présentation du cadeau qui était à décrocher.

C’est vendredi matin à l’aurore qu’une hirondelle d’Afrique m’a livré le paquet tant attendu !

Le fameux colis

Peu de chance que cela soit une Thaïlandaise ou un kilo de boudin

La Kobo et des bonbecs

À l’intérieur, un (une?) Kobo mini, qui est une liseuse numérique de 5" vendue par la Fnac, accompagnée de 4 petits sachets de Dragibus pour que rien ne bouge dans le colis.

N’ayant l’appareil que depuis hier et n’ayant jamais utilisé d’eReader auparavant, je n’ai pas eu le temps de tester la bête en profondeur, mais je vais tout de même essayer de vous faire un petit compte-rendu.

Ce qui frappe tout de suite, c’est que c’est la taille (l’écran est 4 fois plus petit qu’un iPad), on peut ainsi se demander s’il est confortable de lire sur un écran de cette taille.
En fait, cela dépend du format et du type de l’ouvrage que l’on souhaite lire. Le Kobo supporte les fichiers PDF et les epub (le JPG, le PNG et le GIF aussi, mais bon …).

Les formats

Le point fort dû format PDF qui est de garantir une mise en page identique sur tous les OS et dans tous les logiciels est ici un gros défaut. Sachant que sur le Kobo cette mise en page est gardée et que l’on est sur un écran beaucoup plus petit qu’une page de livre, on passe son temps à zoomer et se déplacer sur le contenu ; si cette contrainte ne gêne pas trop sur smartphone ou tablette, car ces actions sont immédiates et naturelles à réaliser (où presque, selon les modèles). Dans le cas d’une liseuse, nous sommes en présence d’encre électronique avec un temps d’affichage très lent (par rapport à un écran “classique”), il faut pas loin d’une seconde pour chaque action (déplacement ou zoom) ce qui rend la navigation insupportable et pas pratique du tout.
En gros c’est vraiment un format à oublier pour un appareil de cette taille. Il existe bien des convertisseurs PDF -> ePub, mais ça ne ma pas donné quelque chose de concluant. Pour le PDF, un eReader de taille supérieure serait peut-être plus adapté (à tester), même si je pense qu’une tablette (type iPad) est le top (réactivité, taille, etc.)(sauf pour les yeux).

Pdf on Kobo

Lire un pdf sur la Kobo, c'est chiant …

Le format epub, lui est tout récent, car il est apparu avec ces eReader. Je n’avais jamais eu l’occasion de tester ce format et c’est tip-top pour ce genre d’appareil. L’ePUB c’est tout le contraire du format PDF, c’est libre, ouvert et surtout il laisse le soin de gérer la mise en page du contenu au logiciel, ce qui permet d’avoir accès à une table des matières, de modifier sa police, l’interlignage et tout un tas d’options relatives à la mise en page. Là où ça peu coincer, c’est pour les BD ou les livres où la mise en page n’est plus “traditionnelle”, wiki me souffle à l’oreille que le format “Fixed Layout” a été développé pour contrer ça, je n’ai pas testé donc je ne me prononcerais pas dessus.

Les options d'un epub sur la Kobo

On peut configurer l'affichage assez précisement sur les epub

L’engin

Bon, passons un peu à lecture et au confort. Je n’avais jamais testé d’eReader auparavant et je suis bien surpris du confort de lecture par rapport à une tablette qui t’éclaire la tronche et te crame les yeux. L’eReader simule le rendu de l’encre sur du papier, il faudra donc une source de lumière à proximité pour voir quelque chose. La résolution n’a pas l’air exceptionnelle, quand les textes sont trop petits ils sont à la limite de disparaitre, mais avec une police de taille raisonnable c’est très propre. Ça supporte aussi les images, sauf que l’écran est en noir et blanc, pour tout ce qui est schéma c’est ok, mais pour des photos ça peut vite être dégueulasse.
Le confort change également beaucoup selon le type de livre. On m’a demandé si la lecture de gros pavés n’était pas trop galère sur un reader de cette taille. Je pense que pour un livre classique (roman/nouvelle) il n’y aura pas trop de problèmes. Par contre, ça risque d’être beaucoup plus chiant pour les livres contenant de nombreux schémas/dessins (genre livre technique, manuel de maths, etc), ainsi que pour des livres d’informatique contenant du code où celui-ci sera étalé sur de nombreuses pages impliquant des retours en arrière (sans parlé du nombre de colonnes).

Un livre d'info sur Kobo

Un petit livre sur l'informatique, même avec quelques schéma, ça passe nikel

L’objet en lui même à l’air de bonne qualité, ça tient bien dans les mains et c’est bien fini. Ça tient facilement dans une poche, ça sort de veille très vite et surtout ça ne consomme rien (juste aux changements de pages).

Le moins

S’il n’y a rien à redire sur l’appareil en lui même, c’est au niveau du contenu proposé que ça pèche. Petit exemple, avec Le trône de fer, tome 1 [Poche] chez Amazon ; qu’on me vende un bouquin physique 10€ ou plus ne me dérange pas, le papier et l’encre ne se sont pas donnés, ça reste un bel objet, on peut le prêter, le revendre, en louer, etc. Mais qu’on me vende un putain d’epub au même prix, voir des fois plus chères que l’ouvrage physique, un truc doit m’échapper ! Ici, 9€ le tome 1 de GoT au format numérique et 8,10€ la version poche, euh …
Bon, je ne vais pas plus loin sur ce point, il faut savoir qu’il y a aussi des bouquins gratuits (de manières légales ou pas…).

La librairie du Kobo

Conclusion

Cette version mini est super pour stocker un tas de bouquins “traditionnels” dans sa poche (1.2 go de livre pour 134g) tout en offrant un bon confort de lecture. Pour un usage à domicile, la taille supérieure est certainement un plus. Pour les amateurs de BD’s, comics ou autre bouquin contenant plein d’images (ou du code) il faudrait tester sur une liseuse plus grosse (par contre il ne me semble pas qu’il y’ai encore de version couleur) ou alors une tablette plus classique (iPad, ou autre). Pour ceux qui veulent un test plus en détail, il y’a un article sur lesnumériques.com

En tout cas, merci Sam et Max c’est un chouette cadeau ! Je ne sais pas trop pour le moment quelle sera mon utilisation et si ça va devenir un objet utilisé au quotidien, mais pourquoi pas. Je ne lis plus depuis quelques années (excepté des bouquins techniques et quelques bds), ça pourrait être l’occasion de s’y remettre vu la praticité de l’objet ! (Ah et pour les dragibus, ils ce sont pris une grosse branlée)

]]>
http://sametmax.com/e-ink-et-confiseries/feed/ 29
Ouverture du coffre : la méthode simple, bourine, mais efficace 15 http://sametmax.com/ouverture-du-coffre-la-methode-simple-bourine-mais-efficace/ http://sametmax.com/ouverture-du-coffre-la-methode-simple-bourine-mais-efficace/#comments Fri, 26 Jul 2013 10:16:07 +0000 http://sametmax.com/?p=6789 Ceci est un post invité de MrAaaah posté sous licence creative common 3.0 unported.

Salut à toutes et à tous c’est MrAaaah, je suis celui qui réussi à résoudre le plus rapidement les énigmes du coffre secret de Sam et Max, on ma demandé de vous faire un "petit" article expliquant un peu ma démarche et mes méthodes.

Avant-propos

Avant de me lancer dans la résolution des énigmes je tiens à signaler que je n’ai qu’un an de python dans les pattes, de ce fait le code peut paraitre cradoc et peut-être un poil bourrin vu que je ne connais pas encore très bien python, ses librairies et ses subtilités (ça a également été codé très vite). Je n’ai pas retouché le fonctionnement de mes scripts, j’ai juste renommé quelques variables et mis des commentaires, donc c’est du brut, y’a pas de vérif, ça plante à la fin, etc.

Y U NO OPEN?

Un petit meme : "Code Y U NO WORK?"

Première énigme http://game.sametmax.com/ : un message, un champ d’entrée et une image. Comme beaucoup je suppose, je commence par rentrer diverses conneries dans le formulaire, toujours le même résultat : le message “I don’t GET it.”.

Je parcours le code source de la page à la recherche d’un éventuel script où autre indice dans le code, nada.

Si on regarde l’url on peut voir que le code est envoyé via la méthode GET : http://game.sametmax.com/?code=monnezsurtescouilles. En relisant le message de ci-dessus on peut deviner qu’il faut balancer une requête de type POST. Pour faire ça rien de plus simple, on sort Firebug (ou équivalent), on édite le code source en changeant l’attribut method du formulaire et on renvoi avec un code bidon.

Modification de la methode d'envoi d'un formulaire avec Firebug.

Là on obtient un nouveau message : “Error log : areyouhuman”. Bon je retente des codes bidon (genre “yes”, etc.). Je cherche sur le net “areyouhuman”, mais rien de concluant.

Au final rien de bien complexe, mais y’a moyen de tourner un peu en rond, il suffit «juste» d’allez sur l’URL http://game.sametmax.com/areyouhuman

areyouhuman

À partir de là des connaissances en Python (basiques) vont être nécessaires. (j’utilise ici Python 2.7)

La page nous renvoie ce qui ressemble à une définition de classe NextUrlContainer avec un attribut next suivi d’une bouillie de caractères en commentaire.

NextUrlContainer = type("NextUrlContainer", (), {'__init__': (lambda s, n: setattr(s, 'next', n))}) # Y2NvcHlfcmVnCl9yZWNvbnN0cnVjdG9yCnAwCihjX19tYWluX18KTmV4dFVybENvbnRhaW5lcgpw MQpjX19idWlsdGluX18Kb2JqZWN0CnAyCk50cDMKUnA0CihkcDUKUyduZXh0JwpwNgpJMjA5NzM1 MQpzYi4=

Avec un peu de recherche on découvre que la soi-disant bouillie n’est autre que du texte encodé en base64. Une fois décodé (il y a des utilitaires en ligne qui font ça très bien), on obtient quelque chose qui nous parle un peu plus (quoique).

ccopy_reg
_reconstructor
p0
(c__main__
NextUrlContainer
p1
c__builtin__
object
p2
Ntp3
Rp4
(dp5
S'next'
p6
I2097351
sb.

Encore un peu de recherche et je découvre que c’est un fameux pickle, on sort notre Python préféré.

# -*-coding:Utf-8 -*
import base64, pickle
 
NextUrlContainer = type("NextUrlContainer", (), {'__init__': (lambda s, n: setattr(s, 'next', n))})
 
b64 = "Y2NvcHlfcmVnCl9yZWNvbnN0cnVjdG9yCnAwCihjX19tYWluX18KTmV4dFVybENvbnRhaW5lcgpw MQpjX19idWlsdGluX18Kb2JqZWN0CnAyCk50cDMKUnA0CihkcDUKUyduZXh0JwpwNgpJMjA5NzM1 MQpzYi4="
 
# on décode et on dépickle-ise
obj = pickle.loads(base64.urlsafe_b64decode(b64))
 
print obj.next

Et on obtient un objet de type NextUrlContainer contenant l’id de la prochaine URL : 2097351.
En ce rendant sur http://game.sametmax.com/areyouhuman/2097351 on se retrouve avec de nouveau un pickle encodé en base64. Après en avoir fait deux URL à la main, on ressort Python pour automatiser tout ça.

Notre script doit :

  • Récupérer le contenu de la page http://game.sametmax.com/areyouhuman/:id. (j’utilise ici la librairie httplib)

  • Décoder le contenu. (base64)

  • Dépickle-iser (je ne connais pas le terme “officiel”). (pickle)

  • Récupérer le prochain id.

  • Recommencer à la première étape jusqu’à… la fin.

Voilà le script utilisé. Il affiche chaque nouvel id et plante quand on arrive au bout.

# -*-coding:Utf-8 -*
import httplib
import base64, pickle
 
# la classe donnée sur la page http://game.sametmax.com/areyouhuman
NextUrlContainer = type("NextUrlContainer", (), {'__init__': (lambda s, n: setattr(s, 'next', n))})
 
# initialisation de la connection
connection = httplib.HTTPConnection("game.sametmax.com:80")
 
# Fait une requête sur l'URL http://game.sametmax.com/areyouhuman/:id
# Et retourne le contenu de la page
def make_request(id):
    url = "/areyouhuman/%i" % id
    connection.request("GET", url)
    response = connection.getresponse()
    return response.read()
 
 
# id de départ
id = 2097351
 
# tant que ça plante pas ça suit les liens
while 1:
    # récupération du pickle en base64 contenant l'id de la prochain URL
    response_crypt = make_request(id)
 
    # on décode et on dépickle-ise
    obj = pickle.loads(base64.urlsafe_b64decode(response_crypt))
 
    # on remplace l'id courant par le prochain afin de pouvoir recommencer
    id = obj.next
 
    print id

On le lance et ça tourne un petit bout de temps avant d’en arriver au bout. (le serveur doit adorer)

    3245669
    2993679
    1050294
    .......
    9683898
    8147905
    9664723
    wololo.zip
    Traceback (most recent call last):
      File "1_requests.py", line 27, in 
        response_crypt = make_request(id)
      File "1_requests.py", line 14, in make_request
        URL = "/areyouhuman/%i" % id
    TypeError: %d format: a number is required, not str

On a donc notre prochaine destination : http://game.sametmax.com/wololo.zip

Wololo

Petit strip humoristique en réference à AOE et ses prètres wololoteur

Pour pas me prendre la tête j’ai télécharger le .zip dans le même répertoire que mes scripts.

On commence par dézipper wololo.zip, on obtient one_more_time_1.zip que l’on dézippe, on obtient one_more_time_2.zip que l’on dézippe, on obtient one_more_time_3.zip que l’on dézippe, etc.

Bon par besoin de chercher très loin pour savoir quoi faire, l’algo est simple :

  • On dézippe wololo.zip (zipfile)

  • Tant que ça marche

  • On dézippe le fichier venant d’être extrait

Ce qui se traduit en python par :

# -*-coding:Utf-8 -*
import zipfile
 
# archive de départ
archive_name = "wololo.zip"
 
# tant qu’il y a quelque chose à dézipper, ça tourne
while 1:
    # ouverture de l'archive
    archive = zipfile.ZipFile(archive_name, 'r')
 
    # récupération du nom du fichier contenu dans l'archive
    file_to_extract = archive.namelist()[0]
 
    # extraction
    archive.extract(file_to_extract)
 
    print file_to_extract
 
    # le fichier tout fraichement extrait sera le prochain à être dézippé
    # (ça plantera quand y'aura plus de .zip)
    archive_name = file_to_extract

On exécute

one_more_time_1.zip
one_more_time_2.zip
one_more_time_3.zip
...................
one_more_time_998.zip
one_more_time_999.zip
one_more_time_1000.zip
youdiditjonhy.txt
Traceback (most recent call last):
  File "2_zips.py", line 10, in 
    archive = zipfile.ZipFile(archive_name, 'r')
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/zipfile.py", line 712, in __init__
    self._GetContents()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/zipfile.py", line 746, in _GetContents
    self._RealGetContents()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/zipfile.py", line 761, in _RealGetContents
    raise BadZipfile, "File is not a zip file"
zipfile.BadZipfile: File is not a zip file

On se retrouve donc avec un nouveau petit fichier youdiditjonhy.txt contenant le texte

api.json

ainsi que 1000 fichiers zip … un petit rm one_more_time* dans son terminal (sur Windows débrouillez-vous) pour cleaner tout ça et on repart pour l’énigme suivante.

api.json

On se rend donc sur http://game.sametmax.com/api.json

Et on se prend ça dans la tronche :

{"\f": ["."], " ": ["."], "$": [".", "."], "(": [".", ".", "."], ",": [".", "."], "0": [".", "."], "4": ["."], "8": [".", ".", "."], "<": ["."], "@": [".", ".", "."], "D": [".", ".", "."], "H": [".", "."], "L": [".", "."], "P": ["."], "T": [".", "."], "X": [".", ".", "."], "\\": [".", "."], "`": ["."], "d": ["."], "h": [".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."], "l": [".", ".", "."], "p": [".", ".", "."], "t": [".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."], "x": [".", ".", "."], "|": [".", ".", "."], "\u000b": [".", ".", "."], "#": [".", ".", "."], "'": [".", ".", "."], "+": [".", "."], "/": [".", ".", "."], "3": [".", "."], "7": [".", ".", "."], ";": [".", "."], "?": ["."], "C": [".", ".", "."], "G": ["."], "K": [".", "."], "O": ["."], "S": [".", ".", "."], "W": ["."], "[": ["."], "_": [".", "."], "c": [".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."], "g": [".", ".", ".", ".", ".", ".", ".", ".", ".", "."], "k": ["."], "o": [".", ".", "."], "s": [".", "."], "w": ["."], "{": [".", "."], "\n": [".", "."], "\"": ["."], "&": [".", "."], "*": ["."], ".": [".", ".", "."], "2": ["."], "6": [".", "."], ":": ["."], ">": [".", "."], "B": ["."], "F": [".", "."], "J": ["."], "N": ["."], "R": [".", "."], "V": [".", "."], "Z": [".", ".", "."], "^": [".", "."], "b": [".", ".", "."], "f": [".", ".", "."], "j": [".", "."], "n": [".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."], "r": [".", "."], "v": [".", "."], "z": [".", ".", "."], "~": [".", "."], "\t": ["."], "\r": [".", ".", "."], "!": ["."], "%": [".", "."], ")": ["."], "-": [".", "."], "1": [".", ".", "."], "5": [".", "."], "9": [".", ".", "."], "=": [".", "."], "A": ["."], "E": [".", ".", "."], "I": [".", "."], "M": ["."], "Q": [".", ".", "."], "U": ["."], "Y": [".", ".", "."], "]": ["."], "a": [".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."], "e": [".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."], "i": [".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."], "m": [".", ".", "."], "q": [".", "."], "u": [".", "."], "y": [".", ".", "."], "}": [".", ".", "."]}
Sir Patrick Stewart jurant à la vu de ce fichier json

Même Sir Patrick Stewart semble contrarié par ce fichier !

Bon déjà on sait que c’est du JSON, on se fait un nouveau script pour voir ce que donne ce json en Python :

# -*-coding:Utf-8 -*
import httplib
import json
 
# on récupère le json
connection = httplib.HTTPConnection("game.sametmax.com:80")
url = "/api.json"
connection.request("GET", url)
response = connection.getresponse()
 
# on transorme en python
decoded = json.loads(response.read())
 
print decode

Bon c’est pas beaucoup mieux, on à affaire à un dictionnaire avec pour clé un caractère Unicode avec une liste de ‘.’ plus où moins longue associé. En mettant un peu en forme ça donne un truc du genre :

Y :  . . . 
Z :  . . . 
[ :  . 
\ :  . . 
] :  . 
^ :  . . 
_ :  . . 
` :  . 
a :  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
b :  . . . 

Soit pas grand-chose d’exploitable, je modifie le script pour obtenir le nombre de points associé à chaque caractère :

# -*-coding:Utf-8 -*
import httplib
import json
 
# on récupère le json
connection = httplib.HTTPConnection("game.sametmax.com:80")
url = "/api.json"
connection.request("GET", url)
response = connection.getresponse()
 
# on met ça en python
decoded = json.loads(response.read())
 
# on passe le dico en liste pour pouvoir le trier
items = decoded.items()
items.sort()
 
for i in items:
    print "%s : %s" % (i[0], len(i[1]))
Z : 3
[ : 1
\ : 2
] : 1
^ : 2
_ : 2
` : 1
a : 50
b : 3

À partir de là je tente de convertir des mots en remplaçant les lettres par le nombre de ‘.’ associé, par exemple “Max” => 1503. J’arrête vite mes conneries et me rend compte qu’une grosse partie des caractères n’est associé qu’a 1,2 ou 3 points et quelques autres sont à 50, 30, 60, étrange…

Je garde juste les plus grosses valeurs, les tris dans l’ordre croissant, soit : 10 20 … 80. En reprenant chaque clé associée, on obtient le mot gnitaehc, soit cheating à l’envers. Peu de chance que ce soit là par hasard.

On se rend sur http://game.sametmax.com/cheating, on arrive à la fin.

↑↑↓↓←→←→BA

Retour sur la page d’accueil avec cette fois-ci le Konami code en message (↑↑↓↓←→←→BA). Pas de temps à perdre, on va sur http://game.sametmax.com/konami.

Achievement unlocked

Et c’est là que ce termine la série d’énigmes ! Au final la difficulté était plutôt bien dosée, pas trop hard pour un débutant tout en offrant du challenge et du cassage de tête.

J’espère avoir été clair dans mes explications, si y’a des questions sur certains point allez-y, même si ce n’est pas moi je pense qu’il y’aura toujours quelqu’un pour vous éclairer.

Si vous avez utilisé d’autres techniques ou s’il y a des remarques sur mon code, allez-y. Dans les commentaires de l’article original, il y’a une solution “collaborative” similaire à la mienne (bon leurs codes est quand même un peu plus propre), y’a également Recher qui nous propose d’utiliser un éditeur hexadécimal pour l’énigme du zip.

Je suis assez amateur de ce genre de puzzle/challenge, si ça interesse des gens il y a quelques sites bien sympa pour se prendre la tête :

  • http://www.pythonchallenge.com/ : qui est un grand classique, très orienté python, niveau énigme c’est vraiment dans la même veine que cette ouverture de coffre, pour ma part j’avais testé il y’a quelque temps et je m’étais assez vite retrouvé coincé… (par contre il ne faut pas s’arrêter à l’aspect graphique qui fait un peu saigner les yeux…)

  • http://www.newbiecontest.org/ : ce site est beaucoup plus général en proposant des épreuves de crypto, hacking, prog, logique, crackme, etc. Et y’a largement de quoi péter des plombs. La partie programation est assez interessante pour se faire un peu de python. (par contre il est necessaire de s’inscrire)

  • Y’en a plein d’autre je suppose, mais je n’ai testé que ces deux là, si vous avez quelques bonnes adresses n’hésitez pas à partager.

Sur ce, bravo à ceux qui ont tenté le jeu, bon voyage à Max et encore merci à nos deux taulier !

]]>
http://sametmax.com/ouverture-du-coffre-la-methode-simple-bourine-mais-efficace/feed/ 15