Français [Trend Micro 2015] [Progamming 100] Write-Up

Description

Click on the different color.

Resolution

Comme la description l’indiquait, il fallait cliquer sur le carré qui avait une couleur différente des autres.

Ca a commencé doucement avec 2×2 blocs, résolvable humainement.

Et à chaque clic, la grille s’agrandissait et les couleurs devenaient de moins en moins distinguables.

blocs 5 Puis (ça commence à être tendu) :

blocs 12

Voyant le nombre de possibilités s’accroitre, nous avons alors codé un outil pour résoudre ce challenge :

<?php
 $page = 'http://ctfquest.trendmicro.co.jp:43210/click_on_the_different_color';
 $border = 3;
 
 while (true) {
  $data = file_get_contents($page);
  if (preg_match('#ocation\.href=\'/(.+?)\?#', $data, $regs)) {
   $dest = $regs[1];
   if (preg_match('#<img src="(.+?)"#', $data, $regs)) {
    $img = imagecreatefrompng('http://ctfquest.trendmicro.co.jp:43210'.$regs[1]);
    if ($img) {
     $bordercolor = imagecolorat($img, 0, 0); // Couleur de la bordure
     $colorref = imagecolorat($img, $border+1, $border+1); // Couleur du bloc après la bordure

     for ($i = 1; true; ++$i) { // Check de la taille du bloc
      if (($color = imagecolorat($img, $border+$i, $border+1)) == $bordercolor) { // Si la couleur n'est pas celle de la bordure
       $blocksize = $i; // Taille d'un bloc
       $blocs = (imagesx($img)-$border)/($blocksize+$border); // Nombre de blocs
       echo "Size: $i\nRef: $colorref\nColor: $color\nBorder: $bordercolor\nBlocs: $blocs\n"; // Debug
       for ($x = 0; $x < $blocs; ++$x) { // Recherche du bloc différent
        for ($y = 0; $y < $blocs; ++$y) {
         $rx = ($blocksize+$border)*$x+$border+1;
         $ry = ($blocksize+$border)*$y+$border+1;
         
         $test = imagecolorat($img, $rx, $ry); // Couleur du bloc à tester
         
         if ($test != $colorref) { // Si couleur différente de la référence, bingo ?
          echo "$rx / $ry : $test : $colorref\n"; // Debug
          $page = 'http://ctfquest.trendmicro.co.jp:43210/'.$dest.'?x='.$rx.'&y='.$ry;
          continue 4;
         }
        }
       }
       
       break;
      }
     }
    } else {
     break;
    }
   }
  } else {
   echo $data;
   break;
  }
 }

Au bout de quelques secondes, jusqu’à arriver à 80×80 blocs à analyser, nous obtenons le flag !

Le flag est : TMCTF{U must have R0807 3Y3s!}

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *