Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/04/2014, à 11:38

Bybeu

[résolu] Besoin d'aide pour comprendre du C (Nasty)

Bonjour
J'ai le programme nasty qui génère des chaînes de caractères et les teste pour retrouver ma passphrase gpg.

C'est très très long bien sûr et il est buggé car il ne sait pas interpréter un de ses paramètres (longueur minimale de la chaîne) mais il sait gérer une interruption et reprendre là où il en était (si c'est pas une coupure de jus, parce que là, adieu l'enregistrement de l'état). Je gère en venant de temps en temps lui faire un Ctrl+C et une reprise.
J'ai fais des test avec une très courte passphrase de clé bidon et il y a un autre bug: on peut lui donner un fichier de sortie pour qu'il y enregistre le résultat final, mais dès qu'il y a eu au moins une interruption (Ctrl+C) pendant le calcul, il oublie le paramètre de fichier de sortie et se contente du résultat à l'écran (en cas de coupure de jus, adieu le résultat).

Alors j'essaye de piger le mécanisme de stockage du point d'arrêt mais malgré l'aide du cours de C de Mathieu Nebra sur OpenClassroom je sèche.

Je ne comprends pas comment il convertit le point courant juste avant l'interruption:

#define MAX_PP_LEN		128

unsigned char passphrase[MAX_PP_LEN + 2];
unsigned char passphrase_template[MAX_PP_LEN + 2];

......

char valtohexdigit(int n)
{
	if (n > 9)
		return 'A' + (n - 10);

	return '0' + n;
}

.......

void sighandler(int sig)
{
	FILE *fh = fopen("nasty.state", "w");
	if (fh)
	{
		int loop, len;

		.....

		len = strlen(passphrase_template);
		fprintf(fh, "cur=");
		for(loop=0; loop<len; loop++)
			fprintf(fh, "%c%c", valtohexdigit(passphrase_template[loop] >> 4), valtohexdigit(passphrase_template[loop] & 15));
		fprintf(fh, "\n");

......
}

Y'a une astuce dans ce code qui m'échappe ( >> 4 et & 15 )
Merci de me mettre sur la piste. J'ai essayé de décoder la chaîne héxa cur=3B2F1B27 trouvée dans le fichier de reprise par comparaison avec les infos pré et post interrution sans succès. Nasty affiche environ toutes les 2 secondes là où il en est. Je l'utilise en mode incrémental et mes 2 points avant/après étaient 0jPb et imPb, et le dictionnaire de caractères est 0-1 @ A-Z a-z (Les caractères les plus à droite sont les plus lents à changer). Le dictionnaire ascii est sauvegardé en héxa dans le fichier de reprise (j'ai un peu bricolé le code pour qu'il limite le dico):

charset=0030....3940...5A61....7A

Dernière modification par Bybeu (Le 03/04/2014, à 10:14)

Hors ligne

#2 Le 02/04/2014, à 13:37

claudius01

Re : [résolu] Besoin d'aide pour comprendre du C (Nasty)

Bonjour,

Bybeu a écrit :

Y'a une astuce dans ce code qui m'échappe ( >> 4 et & 15 )
Merci de me mettre sur la piste.

Un exemple vaut bien un long discours:

$ cat ope.c
#include <stdio.h>

int main(void)
{
  unsigned int pattern = 0x12345678;
  unsigned int result1 = (pattern >> 4);
  unsigned int result2 = (pattern & 15);

  printf("pattern [0x%x] result1 [0x%x] result2 [0x%x]\n",
    pattern, result1, result2);

  return 0;
}

$ gcc -o ope ope.c

$ ./ope
pattern [0x12345678] result1 [0x1234567] result2 [0x8]

En français:
   - L'opération '>> 4' revient à diviser par 16 (car 16 = 0x10 = 10000 en binaire et attention aux nombres négatifs)
   - L'opération '& 15' réalise un masque des 4 bits de poids faibles (car 15 = 0xF = 1111 en binaire ;-)

En espérant que cela t'aide car le reste est pour moi du chinois...


Cordialement, A+
--
Claudius

Hors ligne

#3 Le 02/04/2014, à 16:47

Bybeu

Re : [résolu] Besoin d'aide pour comprendre du C (Nasty)

Merci Claudius ... j'ai plus qu'à comprendre smile
Le %c%c au début, c'est bien pour afficher 2 caractères? Le premier le résultat de la division par 16 et le deuxième pour le masquage ?

Dernière modification par Bybeu (Le 02/04/2014, à 16:53)

Hors ligne

#4 Le 02/04/2014, à 17:18

claudius01

Re : [résolu] Besoin d'aide pour comprendre du C (Nasty)

Oui c'est exactement cela.
Mais cela suppose que Le premier le résultat de la division par 16 et le deuxième pour le masquage sont bien des valeurs qui rentrent dans un octet (de 0x00 à 0xFF) et qui sont en plus "imprimables" (de 0x20 à 0x7F) sinon gare aux résultats de fprintf() (cf. Table ASCII  ;-)

NB: Je ne comprends pas le ... "j'ai plus qu'à comprendre :-)"

Hors ligne

#5 Le 02/04/2014, à 20:15

Bybeu

Re : [résolu] Besoin d'aide pour comprendre du C (Nasty)

Merci gars pour les précisions et les mises en garde. Je pense que tout ça doit être bordé, car ça a l'air de marcher.
J'ai [n'ai] plus qu'à comprendre, c'est simple: tu expliques... et j'essaye de comprendre. C'est tout nouveau pour moi.
Mes déductions:
1) l'ordi travaille en binaire
2) Moi je marche en caractères ascii imprimables
3) Le programme lui ben .... un peu des trois smile (avec de l'hexa entre les 2, je pense que je sais pourquoi: les caractères ascii sont numérotés de 32 à 126, donc leur code est de longueur variable en décimal, mais en hexa ça fait toujours 2 de long de 20 à 7E, ça doit faciliter la vie du programmeur qui bricole des chaînes)

Je viens de faire 2 "dumps" successifs pour voir:
A) interruption entre B5ug et i9ug  -> chaîne stockée = 05083A2C
B) interruption entre i9ug et 0Eug  -> chaîne stockée = 110D3A2C
C) interruption entre !!jh et ~~jh  -> chaîne stockée = 07312F2D
Pas mal non, ça donne des idées: 2 lettres identiques à la fin => on dirait 2 hexa identiques à la fin du stockage
Dernière lettre incrémentée de 1 (h=g+1) => le stockage augmente de 2C à 2C+1=2D (ou au moins de C à D).

Si je trouve pas illico, je verrai demain vers 13h quand les chaînes générées auront une longueur de 5 en ascii si la chaîne stockée fait 10 de long. Il y a peut-être une embrouille dans mon neurone avec les MSB/LSB. normalement les LSB sont à droite mais ici c'est par analogie comme si j'avais la trotteuse à gauche, puis les minutes, puis les heures, les jours, etc...
Faut positiver: au rythme où ça va, ce qui est bien c'est que ça laisse du temps pour comprendre smile

Actuellement le pc en est encore à b0rj (j'ai pas relevé les "digits" exacts de gauche pour l'exemple C), il a passé ~11 millions de combinaisons avec un "dictionnaire" de 63 caractères (à ~60/s)

@+ et merci de ton aide

Dernière modification par Bybeu (Le 02/04/2014, à 20:25)

Hors ligne

#6 Le 03/04/2014, à 10:14

Bybeu

Re : [résolu] Besoin d'aide pour comprendre du C (Nasty)

Merci Claudius, j'ai fini par trouver l'énigme:
Pas de façon intelligente, mais en relevant et en observant les valeurs connues
Le gars Volker refait une table de correspondance hexa continue à partir 0x01 pour chaque élément du dictionnaire. Il aurait pu simplement faire une translation vers le bas de la table standard, mais comme son programme permet de choisir des tranches de caractères (0-1 et/ou et/ou a-z et/ou A-Z ou 0x20-0x7E ou 0x20-0xFF, j'ai pas vérifié s'il contrôle les redondances possibles), ça lui permet de gérer des boucles d'incrémentation de 1 sans avoir besoin de tester à chaque fois s'il y a des trous ou si les caractères du dico sont dans un certain ordre.
Mon dico de 63 caractères est donc codé comme ça visible dans le fichier de reprise:

charset=0030....3940...5A61....7A

Mais pendant le travail, à l'interruption et à la reprise il se sert de
010203....3F
Si j'avais retenu en plus p.ex les 6 ascii entre Z et a, la table de travail/stockage aurait fini à 0x45, peu importe où la tranche 0x5B-0x60 soit placée dans le dico
Le 00 au début du dico doit servir de contrôle.

Je pense que je vais maintenant pouvoir répartir le boulot par tranches sur 2 ou 3 PC en bricolant le fichier nasty.state smile

Merci encore de m'avoir tenu la main, même si je n'ai pas été un élève brillant, c'est cool d'échanger.

@+

Hors ligne