Salut à tous,
En me renseignant sur les techniques d'obfuscation en Javascript j'ai appris que certains outils savaient remplacer les String en dur dans le code par des équivalents illisibles à bases de cast douteux entre Array, String et Number.
J'ai creusé un peu pour savoir jusqu'où on pouvait aller. Je me suis aperçu que simplement avec les caractères "[", "+" et "]", on pouvait déjà aller très loin !
+[] donne 0 par cast de l'opérateur +
Pour avoir 1, on pourrait essayer +[]++ mais on ne peut appliquer qu'un seul opérateur à la fois.
Cependant, si on place le tout dans une array dont on récupère le premier élément pour ensuite l'incrémenter, là ça fonctionne :
1: [+[]][0]++
Et comme on sait écrire 0, on arrive à :
1: ++[+[]][+[]]
qu'on peut écrire de manière plus courte par :
1: ++[[]][+[]] (merci Kaamo)
En suivant le même principe d'incrémentation à répétition, on arrive à récupérer tous les chiffres.
Maintenant les lettres !
"" : []+[]
"1" : []+1
"0" : []+0
undefined : [][+[]]
"undefined" : undefined + []
Génial, undefined en string, un tableau de caractères dont on va pouvoir récupérer certaines lettres via les index numériques (qu'on sait déjà coder)
On peut faire la même chose pour NaN : +[][+[]] pour récupérer le N majuscule et le a.
Dernière découverte de la soirée, on pourrait se servir de l'objet Infinity. Incrémenter de un à un jusqu'à l'infini est évidémment bien trop long, mais il existe une autre technique: caster le nombre en notation exponentielle. Comme on a le "e" grâce à "undefined", on peut écrire "1e1000" qui casté en nombre dépasse Number.MAX_VALUE, et donne Infinity. Bingo, des lettres en plus
Je n'ai pas d'autres idées pour le moment, mais j'ai déjà de quoi faire des trucs sympas. Par exemple lâchez ça en console Javascript :
[[]+[][+[]]][+[]][++[++[++[++[+[]][+[]]][+[]]][+[]]][+[]]]+[[]+[][+[]]][+[]][+[]]+[[]+[][+[]]][+[]][++[+[]][+[]]]+[[]+[][+[]]][+[]][++[+[]][+[]]]+[+[++[+[]][+[]]+[]+[[]+[][+[]]][+[]][++[++[++[+[]][+[]]][+[]]][+[]]]+[++[+[]][+[]]+[]][+[]]+[+[]]+[+[]]+[+[]]][+[]]+[]][+[]][++[++[++[++[++[++[++[+[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]]
Voilà la liste des caractères que j'ai trouvé et leur traduction en [+] :
0: +[]
1: ++[[]][+[]]
2: ++[++[[]][+[]]][+[]]
3: ++[++[++[[]][+[]]][+[]]][+[]]
4: ++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]
5: ++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]
6: ++[++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]
7: ++[++[++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]
8: ++[++[++[++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]
9: ++[++[++[++[++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]
undefined : [][+[]]
NaN : +[][+[]]
Infinity : +[++[[]][+[]]+[]+[[]+[][+[]]][+[]][++[++[++[[]][+[]]][+[]]][+[]]]+[++[[]][+[]]+[]][+[]]+[+[]]+[+[]]+[+[]]][+[]]
"" : []+[]
[]+1 : "1"
[]+0 : "0"
undefined + []: "undefined"
a: [+[]+[][+[]]+[]][+[]][++[[]][+[]]]
d: [[]+[][+[]]][+[]][++[++[[]][+[]]][+[]]]
e: [[]+[][+[]]][+[]][++[++[++[[]][+[]]][+[]]][+[]]]
f: [[]+[][+[]]][+[]][++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]]
i: [[]+[][+[]]][+[]][++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]]
n: [[]+[][+[]]][+[]][++[[]][+[]]]
t: [+[++[[]][+[]]+[]+[[]+[][+[]]][+[]][++[++[++[[]][+[]]][+[]]][+[]]]+[++[[]][+[]]+[]][+[]]+[+[]]+[+[]]+[+[]]][+[]]+[]][+[]][++[++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]]
u: [[]+[][+[]]][+[]][+[]]
y: [+[++[[]][+[]]+[]+[[]+[][+[]]][+[]][++[++[++[[]][+[]]][+[]]][+[]]]+[++[[]][+[]]+[]][+[]]+[+[]]+[+[]]+[+[]]][+[]]+[]][+[]][++[++[++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]]
I: [+[++[[]][+[]]+[]+[[]+[][+[]]][+[]][++[++[++[[]][+[]]][+[]]][+[]]]+[++[[]][+[]]+[]][+[]]+[+[]]+[+[]]+[+[]]][+[]]+[]][+[]][+[]]
N: [+[][+[]]+[]][+[]][+[]]
Bon on est bien d'accord que tout cela ne sert strictement à rien, ce n'est absolument pas performant en termes d'obfuscation, mais je trouve ça assez fun
Donc si vous avez d'autres idées pour aller trouver d'autres lettres, balancez !
Là j'ai peut-être une piste en cherchant avec les lettres dont je dispose une fonction dans le prototype de Array / String / Number / Object, puis caster cette fonction en String pour en récupérer une forme littérale. Quelque-chose comme ça :
[""][0]["big"]+[] --> "function big() { [native code] }"
Mais je ne trouve pas de fonction dont je dispose de toutes les lettres. Je pourrais aussi peut-être essayer de choper l'objet Date, mais il me manque le D majuscule...
Partager