[COMINFOR2017] Étape 6 – Du b2uit dans le signal

[COMINFOR2017] Étape 6 – Du b2uit dans le signal

L’énoncé était composé d’un gif indiquant l’intervalle [33 ;126], et d’un long texte de caractères sans aucun sens apparent.

J’ai passé beaucoup de temps sur ce challenge. Je pensais qu’il s’agissait d’une épreuve de cryptanalyse, j’ai donc effectué une analyse fréquentielle et obtenu les résultats suivants :

	 " : 1    (0.0002\%)
	 , : 6334 (1,4185\%)
	 . : 6385 (1,4300\%)
	 / : 6240 (1,3975\%)
	 0 : 6311 (1,4134\%)
	 2 : 1    (0.0002\%)
	 7 : 1    (0.0002\%)
	 8 : 1    (0.0002\%)
	 9 : 1    (0.0002\%)
	 : : 1    (0.0002\%)
	 = : 1    (0.0002\%)
	 ? : 2    (0.0004\%)
	 B : 1    (0.0002\%)
	 L : 6275 (1.4053\%)
	 N : 6338 (1.4194\%)
	 P : 6291 (1.4089\%)
	 R : 6315 (1.4143\%)
	 S : 6264 (1.4029\%)
	 T : 6333 (1.4183\%)
	 U : 6253 (1.4004\%)
	 W : 6410 (1.4356\%)
	 X : 6395 (1.4322\%)
	 Y : 6252 (1.4002\%)
	 Z : 6287 (1.4080\%)
	 c : 1    (0.0002\%)
	 i : 1    (0.0002\%)
	 o : 6393 (1.4318\%)
	 r : 1    (0.0002\%)
	 t : 1    (0.0002\%)
	 y : 1    (0.0002\%)

On constate que les fréquences sont lissées, il n’est donc pas possible que ce soit une substitution mono-alphabétique comme un chiffre de César. J’ai donc cherché à appliquer un chiffre de Vigenère mais sans aucun résultat. Puis j’ai repensé au titre, du bruit, j’ai donc essayé d’isoler les caractères ayant une faible fréquence d’apparition (en dessous de 10), on obtient alors le texte : 7=28iBt?c9″?:yr
Ayant remarqué que les flags faisaient 10 caractères alphanumériques et que la chaîne précédente en fait 15, j’ai intuité que le clair était de la forme: flag :XXXXXXXXXX

J’ai ensuite appliqué un chiffre de César avec un décalage mais il y avait des caractères spéciaux qui apparaissaient. J’ai donc codé un script python pour borner le chiffre de césar dans l’intervalle [33 ;127] :

chars = "7=28iBt?c9\"?:yr"
offset= 47
output = ""
for i in range(0,len(chars)):
	if ord(chars[i]) > 78:
		new_char = ord(chars[i]) - offset;
	else:
		new_char = ord(chars[i]) + offset;
	output += chr(new_char)
	#print "Origin : %s (%s)" % (chars[i], ord(chars[i]))
	print "New : %s (%s) " % (chr(new_char),new_char)

print output

On obtient alors le texte : flag :qEn4hQniJC et on peut donc valider le challenge.

Leave a Reply

Your email address will not be published. Required fields are marked *