Outils d'utilisateurs

Outils du Site


ndhquals2015:game_of_life

Enoncé :

  "We're born alone, we live alone, we die alone. Only through our love and friendship can we create the illusion for the moment that we're not alone." (Orson Orwell)
  Cells cells cells, the basis of life. Don't let them die and tell us their secret.
  Score
      150
  Link
      http://static.challs.nuitduhack.com/GOL.tar.gz 

L'archive contient un cipher.txt illisible, et un script Python suivant :

  #!/usr/bin/python
  #-*- coding:utf-8 -*-
  
  import hashlib, sys, itertools
  
  def creerGrille():
      result=[]
      for lignes in range(8):
          ligne=[]
          for colonne in range(8):
              ligne.append(0)
          result.append(ligne)
      return result
  
  def genKey(key):
      psk=hashlib.sha256(key)
      buff=""
      seed=""
      for char in psk.hexdigest():
          buff+=bin(ord(char))[2:]
      for c in buff:
          seed+=c
      return seed
  
  def initGrille(grille,seed):
      for (i, j), c in itertools.izip(itertools.product(xrange(len(grille)), reversed(xrange(len(grille[0])))), seed):
          grille[i][j] = c
      return grille
      
  def tourSuivant(grille):
      tabbuff=[[0]*8 for _ in range(8)]
      for j in range(8):
          for i in range(8):
              voisine=0
              if grille[(j-1%8)][(i-1)%8] != '0':
                  voisine+=1
              if grille[(j-1)%8][i] != '0':
                  voisine+=1
              if grille[(j-1)%8][(i+1)%8] != '0':
                  voisine+=1
              if grille[j][(i-1)%8] != '0':
                  voisine+=1
              if grille[j][(i+1)%8] != '0':
                  voisine+=1
              if grille[(j+1)%8][(i-1)%8] != '0':
                  voisine+=1
              if grille[(j+1)%8][i] != '0':
                  voisine+=1
              if grille[(j+1)%8][(i+1)%8] != '0':
                  voisine+=1
              tabbuff[j][i]=voisine
          
      for j in range(8):
          for i in range(8):
              if tabbuff[j][i]==3 and grille[j][i]== '0':
                  grille[j][i]='1'
              elif tabbuff[j][i] < 2 or tabbuff[j][i] > 3:
                  grille[j][i]='0'
      return grille
  
  
  def genBitstream(grille,key):
      bitstream=''
      for j in range(8):
          bitstream+=grille[j][7]
      return bitstream
  
  def xor(ent1,ent2):
      key=itertools.cycle(ent2)
      return ''.join(chr(ord(x) ^ ord(y)) for (x,y) in itertools.izip(ent1, key))
  
  def wrapper():
      key=sys.argv[1]
      fichier=open(sys.argv[2],'rb')
      encfile=''
      bitstream=''
      grille=initGrille(creerGrille(),genKey(key))
      for i in fichier.readlines():
          bitstream=genBitstream(grille,key)
          encfile+=xor(i,bitstream)
          tourSuivant(grille)
      print encfile
  
  wrapper()

La “clé” est attendue en premier argument, un fichier est attendu en 2ème argument.

Après lecture du source, on se rend compte que le fichier est XORé grâce à un bitstream déduit à partir de la clé.

Il faut noter que ce bitstream n'utilise pas la clé à chaque tour de boucle, contrairement à ce que la fonction genBitstream laisse supposer, elle est utilisée uniquement pour la génération de la grille de départ du Game of Life.

On essaye donc de rentrer une clé vide, en espérant que la génération de la grille sera à peu près similaire à celle qui a été utilisée pour chiffrer le fichier, pour que cela n'impacte pas beaucoup le déchiffrement du fichier :

  spl3en@box:~/Bureau/crypto/liv_GOL$ python jdlv.py "" cipher.txt 
  ;::::::;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::!!   !  !!   !  !!   !  Md maoifdrte eu usacetr
  Autdur : lolbredudr`gon
  Zhne ;!Sagale!"2
  
  (Tsacetr =!prauiqu`nt eu P`rkotr)
  Dequir la ouiu des!telps, m'hnmme ` tnujouss woulu!se!dép`ssdr et!terter res
                                                                              lhmitds. M'éwoluuion!est!une!amèliosatinn pdrmaoentd de!nos!cap`cit©s
  piysipues!et lent`les/ Dequis!toukourr l'iommd a woult exqlordr ld moode
  daor lequem!il vit/!Nous awnns vu m&appariuhon de m` roue pti a peslis à
  l'inmme de!re dépm`cer pltr facildlent, im!a apprhr à nafdr, à o`viguer/
                                                                          C'drt `insh- qt'auknure'huh- l` pltqaru der!tesres!ee ootrd!moode not ©tè
                                                                                                                                                   eyqmoréer/!Duranu!bette q¨riode!e&explos`uion, m`!socièu© a emmd aussh
                                                                                                                                                                                                                         ©voltéd. Peuit!à pdtiu notse rociètè nour a!imporé!des sèfles dt ees lnis/
  Ontrd!licdrt¨ dd!motwemdot du nnure!eérhr e&avdotusd sd!soou r¨duhu
  coorhd©racmdmdnt.!Ontse erqsiu aurrh r'esu!iacitu¨!á suhwse!ces!mnir et!ed
  ce f`iu 90% eer persnnoes suhvdnt ce!qt'on ldus dictdnu mêmd ri ellds!n’eo
  not!qas bnnrbienbd.!Ma vhmld!danr!l`puelmd 3.3 ddr itmaior whvroou do 2001
  esu souvenu subie qar ses iabitantr. La vimle, la qlupart ees gens!pensent
                                                                            la!bnnnaîusd. Il r&dn serwdot pous!uravaimmdr, almds flâods dans!mds
  bnuthques- tsaîndr eans mes!bars!../ Mair l&esseoce!mêmd dd la wilme, snn
  £me-!sa!qerrnnn`mit¨, qdu ed gdos do oou cnoschdncd/ Ldr rtds b`namhseou ldr
  personnds. Les rignalis`tions eu les paoneaux nnus dictdnt incoosciemmeot ou
  bonsciemlent notse chemio. L'urb`nisme sdrt un afencemenu savant!de la vhlle
  à des strictes fins d'utilité sociale. De ce fait des résistances se
  déploient, certaines concernent de nouveaux modes de penser l'architecture
  et l'urbanisme, d'autres la manière même d'y habiter et de s'y déplacer. Qui
  n'a pas eu envie à un moment ou l'autre de braver ces interdits et d'aller
  là où bon lui semble. Peu de gens prennent l'initiative de redécouvrir ou
  d'utiliser la ville autrement. Deux raisons majeures à cela, soit ils n'en
  ont pas le temps, soit ils n'en voit pas l'intérêt.
  
  Qu'est ce qu'un traceur me direz-vous ?
  Quel est son but ? Que recherche-t-il ?
  
  Un traceur est avant tout une personne qui refuse qu'on lui dicte où aller.
  Il se sert de la ville pour se déplacer autrement, prenant appui sur les
  murs, les bâtiments, les cloisons, les garde-fous, les rambardes, sur tout
  ce qui fait obstacle au mouvement, pour se projeter dans les airs en
  inventant des sauts et des figures. Il créé des instants de liberté en
  volant ou grimpant sur les obstacles quand d'autres les contournent. Il veut
  une totale liberté de mouvement. Face à un mur, la plupart des gens le
  contourne. Le traceur, lui, passe par dessus. S'il se trouve devant une
  barrière il essaye de la franchir le plus rapidement possible. Le traceur
  utilise les obstacles du mobilier urbain pour se déplacer.
  
  Son but est multiple :
  
  Il cherche à se connaître.
  
  Connaître ses limites, connaître ses capacités. Le traceur est une espèce à
  part qui cherche à repousser ses limites tout en les connaissant. Il n’y a
  pas de compétition sportive entre pratiquant mais une compétition avec
  soi-même. Devant un saut on est tout seul. Si on ne maîtrise pas la
  technique et que l’on souhaite épater la galerie, on est seul face à ses
  blessures. L’essence même du vrai traceur, c’est la pratique pour soi et non
  pour les autres. On cherche à s’améliorer intérieurement. A renforcer notre
  esprit. C’est pourquoi la préparation mentale est aussi importante que la
  préparation physique. Le mental joue énormément sur le physique et la
  confiance en soi. Peu de personnes en ont parfaitement conscience. Les
  difficultés rencontrées en Parkour nous servent dans la vie courante. Nous
  sommes plus fort mentalement face à des problèmes qui autrefois nous auraient
  paru impossibles à régler.
  
  
  
  La traceur cherche aussi à connaître.
  La ville est un formidable terrain de jeu et d’aventure construit au fil des
  ans par les architectes et les bâtisseurs. En connaître les moindres recoins
  est grisant. On n’imagine pas toutes les rencontres que l’on peut faire et
  tout ce que l’on peut trouver sur les toits des immeubles et dans les
  souterrains.
  Perché sur les hauteurs de la ville, le traceur observe la vie dans toutes ses 
  nuances.
  
  
  A force de pratiquer, l’esprit se développe et le traceur voit la ville
  différemment. De pratique sportive on passe à un art de vivre à part entière.
  Le traceur mange Parkour, vit Parkour, dors Parkour. Il voit en permanence
  de nouvelles possibilités de sauts quand la plupart des habitants ne voient
  qu’un simple mur ou une simple bouche de sortie de métro. L’imagination
  s’intensifie et on se laisse aller à rêver de sauts inimaginables. On est en
  quête constante de nouveaux endroits à découvrir et de nouvelles techniques à
  essayer. Avec le temps, les habitués repèrent rapidement les traces de
  passage d’un autre traceur. Une trace de semelle sur un mur, une branche
  d’arbre usée par endroit etc.
  
  Le traceur est en perpétuelle évolution. Il cherche à sauter toujours plus
  haut toujours plus loin. Une fois les techniques de bases apprises, il ne
  lui reste plus qu’à les maîtriser parfaitement. Passe-muraille, tic-tac,
  saut de chat, saut de bras font partie du vocabulaire des traceurs. Pour le
  commun des mortels cela ne veut rien dire...
  
  Nous sommes des milliers de part le monde à pratiquer cette activité comme
  un sport ou un art de vivre. Depuis sa création le Parkour à vu naître
  plusieurs mouvements. Les pratiquants du Parkour originel et ceux qui
  mélangent les acrobaties avec les techniques propre au Parkour. Certains ont
  vu dans ce nouveau mouvement un formidable moyen d’engendrer des revenus.
  Nous avons vu apparaître des conflits entre pratiquants. Des débats
  s’organisent sur la médiatisation et la récupération de ce nouveau sport par
  les publicitaires et le rouleau compresseur capitaliste. Des associations
  sportives pour promouvoir ce nouveau sport commence à apparaître. D’ailleurs
  qu’en est-il vraiment. Le Parkour est-il un sport et/ou un art de vivre ?
  A chacun de définir « son » Parkour et sa voie. Mais sachez une chose, il y
  aura toujours quelqu’un pour faire différemment de vous. Arrêtez de vous
  chamailler et de débattre sur un sujet qui ne finira sans doute jamais. Si
  vous vous dites traceurs dans l’âme, allez donc vous entraînez.
  
  Je suis un traceur de part mon goût pour l’exploration et l’envie d’évoluer
  mentalement et physiquement. Je suis un traceur de part ma façon de vivre ma
  ville. Je serez toujours un traceur quoiqu’il arrive.
  
  A bientôt peut-être sur un toit ou dans une autre vie.
  
  Flag : ToBeAndToLast

Le début du fichier illisible, mais très rapidement, l'état du Game of Life se stabilise dans un état similaire à celui qui à chiffré le texte.

Par “chance”, le flag est à la fin du texte : Flag : ToBeAndToLast

ndhquals2015/game_of_life.txt · Dernière modification: 2017/04/09 15:33 (modification externe)