Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[securitech - ch10] bien avancé mais bloqué

6 réponses
Avatar
Manu
Voici le début de mes recherches sur le challenge no 10.

Le but est de trouvé la chaine de 20 caractères qui passée dans
l'exécutable fourni donnera en sortie bidule suivant.

4FCAE075ACABDD28FED2BB0ABA499ED3-324-33927685-18B17B0A30A10411AB960E5F4213CF72C4444FA

Assez naivement j'ai commencé par construire quelques chaines en faisant
varier un caractère à chaque fois.
C'est en construisant une chaine faite de 20 caractères de code ASCII
0x01 puis en modifiant quelques caractères de ci et de là que je me suis
aperçu que seul les 4 premiers caractères modifiaient les 2 chiffres au
centre de la chaine (apparemment décimaux).
Ces deux chiffres représentent respectivement la somme et le produit des
4 premiers caractères de la chaine. Ce qui pour 324 et 33927685 nous
donne : 53, 55, 103, 113.

str[0] = 53;
str[1] = 55;
str[2] = 103;
str[3] = 113;

Sur la même logique de voir comment en modifiant 1 octet de la chaine de
façon à n'affecter qu'un bit à la fois cela affectait le résultat, j'ai
pû déterminer les octets 4 à 9 et les octets 16 à 19.

Pour les octets 4 à 9 je ne retoruve pas clairement comment je suis
arrivé à ce résultat, mais j'ai
str[4] = 0x75;
str[5] = 0x68;
str[6] = 0x34;
str[7] = 0x34;
str[8] = 0x6f;
str[9] = 0x71;

Et pour les octets 16 à 19 j'ai souvenir que cela ressemblait à un
changement d'alphabet. Je crois qu'un quartet de la chaine de départ se
traduisait en une chaine.
En tout cas le résultat était :
str[16] = 115; /* C F72 */
str[17] = 118; /* C 4 */
str[18] = 102; /* 4 4 */
str[19] = 111; /* 4 FA */

Reste 6 octets à déterminer, et la moindre modification d'un de ces
octet entraine de gros changement dans le milieu de la dernière partie
de la chaine. Peut-être un petit hash ou un CRC mais je n'ai pas
(encore?) trouvé.
De même la première partie ressemble à un MD5 ou un hash dans le genre
mais cela reste à déterminer.

A partir de là je me suis interessé au binaire.
En résumé :
- des paroles de ACDC se cachent à l'intérieur mais leur modification
ou le recourssisement de la chaine formé par ses paroles ne modifie
rien en sortie.
- le binaire est "protégé" contre une analyse du code assembleur. Le
code est excessivement compliqué; il y a des sauts dans tout les
sens.
- le binaire ne semble pas protégé contre l'utilisation d'un débuggeur.
Mais comme le code est compliqué il est très dur à suivre. Cependant
en automatisant un ptrace() on peut tirer des informations.
- vu la complication du binaire, son execution s'en trouve ralenti et
la tentative par brute-force echouent de fait.
- on trouve dans le binaire des valeurs significatives utilisée dans le
calcul MD5. Est-ce un leurre ou bien une évidence ?
- les affichages semblent passer par un espèce de printf interne au
binaire mais pas très standard. D'ailleurs il y a un zone pleine de
zeros juste après un %X dans le binaire, mais je ne pense pas que
cela soit exploitable voire même interessant à exploiter.

Partant de cette dernière constation je me suis mis à essayer par
brute-force mais sur le simple MD5 en supposant que le MD5 est fait sur
la totalité de la chaine; une modification dans la chaine change bien le
MD5, mais le MD5 pourrait aussi être calculé sur un sous produit de la
chaine...
Après quelques essais je me suis rendu compte que le simple brute force
pourrait mettre plusieurs jours. Il faut donc tenter sa chance en
réduisant le spectre (et en effectuant une optimisation dans le calcul
du MD5 qui a permis d'aller 3 fois plus vite).
Constatant que la plupart des valeurs déjà trouvées correspondent à des
caractères entre 'a' et 'z' inclus, j'ai tenté cette voie. Ce qui n'a
rien donné.
J'ai essayé de corriger le tir en faisant des permutations des 4
premiers caractères car le produit et la somme sont commutatifs, mais
cela n'a rien donné non plus.

Donc j'en suis réduit à :
- continuer le brute force (mais je n'ai pas les moyens de
parallèliser)
- analyser ce que le MD5 prend en entrée en utilisant le debuggeur
(sachant qu'avec l'automatisation du ptrace() on arrive à identifier
quelques grandes classes de boucles, certaines adresse reviennent
un nombre très précis de fois genre 200000 fois, 10000 fois...).
- analyser comment les changements en entrée modifient la sortie dans
la dernière partie (l'espèce de petit hash).
- revoir mes programmes à la recherche d'erreurs qui m'auraient fait
passer à coté de la solution.

Voilà.

- Manu

6 réponses

Avatar
Francois Cartegnie
Manu wrote:

4FCAE075ACABDD28FED2BB0ABA499ED3-324-33927685-18B17B0A30A10411AB960E5F4213CF72C4444FA

Partant de cette dernière constation je me suis mis à essayer par
brute-force mais sur le simple MD5 en supposant que le MD5 est fait sur
la totalité de la chaine; une modification dans la chaine change bien le
MD5, mais le MD5 pourrait aussi être calculé sur un sous produit de la
chaine...


Apparemment, le découpage volontaire de la chaine et tes analyses
montrent que le premier bloc est un MD5, suivi de son checksum.

Je dirais qu'on peut aussi supposer que la suite c'est un autre checksum
suivi du Tiger sum de la phrase.

Comme ca me parait impossible de sortir le MD5 si tu ne l'as pas trouvé
avec des mots simples. Les databases onlines peuvent peut être aider,
Par exemple ici http://md5.shalla.de/cgi-bin/search.cgi n'aide pas.

La solution se trouve peut être avec les sommes du milieu, qui ne
seraient peut être que deux autres encodages du même mot. 4 manières de
le trouver dont seulement 2 seules attaquables (milieu).

Les références à AC/DC peuvent aussi être un indice: par exemple
conversion AC->DC. (codage par sinusoide autour de la valeur du
charactere ou autre).

Voilà les pistes que j'entrevois... a défaut de temps pour les explorer.
bon courage à ceux qui cherchent !

Avatar
Francois Cartegnie
Manu wrote:

octet entraine de gros changement dans le milieu de la dernière partie
de la chaine. Peut-être un petit hash ou un CRC mais je n'ai pas
(encore?) trouvé.
De même la première partie ressemble à un MD5 ou un hash dans le genre
mais cela reste à déterminer.


J'ai annulé mon précédent message, mais apparemment:
MD5-somme-multiplication-TigerChecksum :)

Avatar
Manu
Francois Cartegnie wrote:

J'ai annulé mon précédent message, mais apparemment:
MD5-somme-multiplication-TigerChecksum :)


OK, mais comment en êtes vous arrivez à cette conclusion pour le hash
Tiger ?

Une recherche basique sur des valeurs caractéristique du hash Tiger ne
donne rien. Mais ça n'est pas une preuve...
Je crois pas que la dernière partie soit un simple Tiger. A la limite un
bout de hash tronqué.

Avatar
Francois Cartegnie
Manu wrote:
Francois Cartegnie wrote:

J'ai annulé mon précédent message, mais apparemment:
MD5-somme-multiplication-TigerChecksum :)



OK, mais comment en êtes vous arrivez à cette conclusion pour le hash
Tiger ?

Une recherche basique sur des valeurs caractéristique du hash Tiger ne
donne rien. Mais ça n'est pas une preuve...
Je crois pas que la dernière partie soit un simple Tiger. A la limite un
bout de hash tronqué.


On a 2 checksum en tete et fin qui sont en Hexa, et dont la taille
correspond à des checksum courants.

Celui qui a proposé le problème n'a pas voulu le rendre insolvable. On a
affaire à 4 types de checksum (on en a déjà 3), et trouver la manière au
final d'exploiter la faiblaisse de certains, voire leur faiblesses
conjuguées.

Personnellement le mot aurait été un mot du dictionnaire, j'aurais
utilisé la propriété du second pour extraire tous les mots donc les 4
premieres lettres correspondent. Resterait ensuite à exploiter une autre
faiblesse, ou tester directement un md5 sur chacun. Mais là, 20 lettres
sans que ce soit un mot, c'est difficile...

Reste l'histoire de l'AC/DC que vous avez constaté dans le code de
cryptage. C'est peut être un indice. Si le checksum 2 correspond aux 4
premieres lettres, elle peuvent aussi correspondre à la somme de toutes
les lettres. En effet, DC c'est une valeur redressée (donc positive) et
l'AC passe dans le négatif. Donc on pourrait supposer qu'il faut aussi
travailler avec des valeurs négatives. Le pur ASCII étant sur 7bit, on
peut diviser l'octet en +128 et -128 ce qui rend possible une somme sur
l'ensemble. Pure hypothèse rapide.


Avatar
Manu
Francois Cartegnie wrote:

On a 2 checksum en tete et fin qui sont en Hexa, et dont la taille
correspond à des checksum courants.


C'est un peu faible. D'autant que la propriété "d'avalanche" hash est
qu'une petite modification dans l'entrée entraine donne un hash très
différent.
Ce qui n'est pas le cas pour la dernière partie du résultat. Relisez mon
premier post ou expérimentez vous même.
Donc la dernière partie n'est PAS un tiger.

Reste l'histoire de l'AC/DC que vous avez constaté dans le code de
cryptage. C'est peut être un indice. Si le checksum 2 correspond aux 4


Je parlais des paroles du groupe de rock AC/DC. Mais ça peut aussi être
un indice.

Avatar
Francois Cartegnie
Manu wrote:
Francois Cartegnie wrote:
C'est un peu faible. D'autant que la propriété "d'avalanche" hash est
qu'une petite modification dans l'entrée entraine donne un hash très
différent.
Ce qui n'est pas le cas pour la dernière partie du résultat. Relisez mon
premier post ou expérimentez vous même.
Donc la dernière partie n'est PAS un tiger.
Je n'ai pas l'occasion de tester, mais c'était le seul checksum 192bits

natif...
Mis à part çà, la solution est sur le web... Elle montre comme quoi ne
faut pas éliminer certains pistes tout de suite :(