L'open bar à smoothies

Qui a dit "Hors sujet" ?

a marqué ce sujet comme résolu.

Mon venin empoisonne Arius dans son ventre, car il n’y est pas immunisé.

Match nul :p !

ToxicScorpius

ToxicScorpius, Lances un D20. J’ajoute un bonus de +2 pour ce lancer, la personne en face n’étant pas immunisée contre les morsures et elle ne peut ni parer, ni esquiver.

Je viens de découvrir le projet M/o/Vfuscator2 qui consiste en un compilateur C traduisant un programme exclusivement en instructions mov. o_O

Taurre

Ouais c’est assez terrible. J’ai pas creusé dans les détails le fonctionnement du bousin, mais à l’époque je pensais à des techniques pour obfusquer du code genre :

1
2
3
4
jmp $+12
mov rax, 0x04eb909090909090
jmp $-8
mov rax, 0x9090909090909090

Tu vois facilement les 0x90 qui correspondent à des NOP (on pourrait y compacter d’autres micro-instructions plus grandes évidemment) et le 04eb exprimé en petit boutiste (little endian en anglais) et qui en fait correspond à eb 04 soit un jmp 4 octets plus loin… Soit jusqu’à la tétrachiée de 0x909090 suivants.

J’ai pas testé, c’est juste que je me souviens avoir vu ce genre de code dans un crackme. C’est un coup à complètement faire chier non seulement un algorithme de désassemblage type linear sweep (gdb) mais aussi un peu plus poussé genre recursive traversal (sous IDA par exemple).

<3

Edit : pour faire mumuse : https://defuse.ca/online-x86-assembler.htm#disassembly

+2 -0

Mon venin empoisonne Arius dans son ventre, car il n’y est pas immunisé.

Match nul :p !

ToxicScorpius

Je suis un Olympien, je peux prendre n’importe quelle forme et je n’ai — de base — pas de forme physique. C’est pas un problème. :-°

+0 -1

Ouais c’est assez terrible. J’ai pas creusé dans les détails le fonctionnement du bousin, mais à l’époque je pensais à des techniques pour obfusquer du code genre :

Ge0

Le principe est expliqué dans un PDF sur le dépôt GitHub et part du remplacement des comparaisons par une simple suite d’instructions mov. Pour le cas de l’égalité, par exemple entre la valeur du registre rax et du registre rbx, il utilise leur valeur comme une adresse et y place respectivement 0 et 1.

1
2
3
movq $0, (%rax)
movq $1, (%rbx)
movq (%rax), %rcx ; On récupère le résultat

Si la valeur « référencée » par rax est 1, alors c’est que la valeur de rbx est identique (puisqu’il aura écrasé la valeur précédente), sinon c’est qu’ils sont différents. Une fois que l’on a le résultat, on peut employer d’autres stratagèmes pour obtenir le même effet qu’un embranchement.

Par exemple, pour traduire if (x == y) x = 100, il est possible d’employer un tableau de deux pointeurs, l’un pointant vers x, l’autres vers une zone quelconque. Ce qui donne quelque chose comme ceci en C.

1
2
3
4
5
int x = 1;
int y = 1;
int *tab = { &osef, &x };

tab[x == y] = 100;

Bon, après, cela reste assez théorique ici et il faut voir comment c’est effectivement mis en oeuvre, mais je trouve cela sacrément ingénieux. ^^

1
2
3
4
jmp $+12
mov rax, 0x04eb909090909090
jmp $-8
mov rax, 0x9090909090909090

Tu vois facilement les 0x90 qui correspondent à des NOP (on pourrait y compacter d’autres micro-instructions plus grandes évidemment) et le 04eb exprimé en petit boutiste (little endian en anglais) et qui en fait correspond à eb 04 soit un jmp 4 octets plus loin… Soit jusqu’à la tétrachiée de 0x909090 suivants.

Ge0

J’ai toujours eu du mal avec ce fameux symbole $ (qui est un . avec la syntaxe de gas il me semble). Que fait ce morceau de code exactement ? ^^"

+0 -0

Que fait ce morceau de code exactement ? ^^"

Là ? Absolument rien.

C’était pour démontrer que tu pouvais compacter des instructions les unes dans les autres. Mais si tu veux, on va imaginer quelque chose de plus concret : mettre le registre rcx à 0.

Une instruction pour y parvenir serait :

xor rcx, rcx

Ce qui, assemblé en opcodes intel x64, donne 48 31 c9.

Maintenant assemble ce code :

1
2
jmp $+4
mov rax, 0x9090c93148909090

Ici, on voit pas vraiment que le registre rcx sera mis à 0. Le listing avec les opcodes donne ceci :

1
2
3
0:  eb 02                   jmp    4 <_main+0x4>
2:  48 b8 90 90 90 48 31    movabs rax,0x9090c93148909090
9:  c9 90 90 

tu vois bien les 48 31 c9. Tu vois même un eb 02 qui, une fois désassemblé, donne jmp $+4. En gros tu sautes 4 octets plus loin à partir de l’adresse mémoire courante.

Et ton xor rcx, rcx, ne fût-il pas désassemblé, est bel et bien exécuté. ^^

Petite démo : https://imgur.com/a/uoHw0

Ma pauvre tante vient de m’envoyer un mail. Elle semble avoir des problèmes. De graves douleurs aux intestins, elle est à l’hôpital. On va lui faire une coloscopie pour vérifier ce que c’est, mais le cancer est à craindre. Elle a un besoin urgent d’argent. Il faut que je lui fasse un prêt par carte bleu rechargeable et que je lui envoie les codes ; c’est urgent.

Ma pauvre tante s’est faite pirater sa boite mail.

+3 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte