IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[Ludique] Coder en Javascript avec seulement 3 caractères


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut [Ludique] Coder en Javascript avec seulement 3 caractères
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[]+[][+[]]][+[]][++[++[++[++[+[]][+[]]][+[]]][+[]]][+[]]]+[[]+[][+[]]][+[]][+[]]+[[]+[][+[]]][+[]][++[+[]][+[]]]+[[]+[][+[]]][+[]][++[+[]][+[]]]+[+[++[+[]][+[]]+[]+[[]+[][+[]]][+[]][++[++[++[+[]][+[]]][+[]]][+[]]]+[++[+[]][+[]]+[]][+[]]+[+[]]+[+[]]+[+[]]][+[]]+[]][+[]][++[++[++[++[++[++[++[+[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]]
    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...

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par SylvainPV Voir le message
    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


    Chacun trouve son petit plaisir comme il peut, mais il est clair que l'on ne pratique pas les mêmes méthodes.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Avec Infinity tu as le "i" en majuscule et minuscule. Peut-être peux-tu trouver une fonction qui te permettrait de réaliser des conversions majuscules / minuscules et inversement ?

    Tu as aussi "d", "e", "f" il doit bien y avoir une relation logique entre ces lettres, non ? Et ainsi trouver les lettres manquantes ?

  4. #4
    Membre Expert Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Par défaut
    génial, tout simplement génial !

    tu peux recup NaN plus simplement : {}+

    avec ca tu peux avoir "[object Object]" : ({})+[]
    --> tu peux ensuite récupérer les lettres : (({})+[])[1]
    --> ca fait 6 lettres en +

    -----------
    une piste possible avec les opérateurs binaires ?

  5. #5
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    @Auteur: j'aimerais bien pouvoir faire un toLowerCase ou toUpperCase, ou même juste un charcodeAt, mais c'est loin d'être facile avec les éléments à disposition. Si je pouvais j'aurais de quoi faire l'objet Date.

    @Lorenzo: ha oui mais en utilisant les signes { } et ( ) c'est trop facile

  6. #6
    Membre Expert
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Par défaut
    Salut Sylvain !
    Haha je vois que je ne suis pas le seul fou à bord. J'avais commencé à m'amuser avec ça y'a quelques mois.

    Le 1, tu peux l'avoir plus facilement ++[[]][+[]].
    Idem donc pour les autres chiffres, tu peux gagner un caractère (le +).

    ++[+[]][+[]] === ++[[]][+[]]

  7. #7
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    Merci Kaamo
    J'en suis pas encore à l'étape d'optimisation, j'aimerais vraiment débloquer d'autres lettres, après quoi ça laisserait porte ouverte à tout et n'importe quoi

Discussions similaires

  1. [Article] Coder en JavaScript avec seulement six caractères
    Par vermine dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 05/06/2016, 22h02
  2. Réponses: 3
    Dernier message: 04/05/2014, 14h27
  3. [PHP-JS] var javaScript avec test php
    Par lepierre dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/12/2004, 12h58
  4. Requete avec chaine de caractère commence par
    Par jazzes_dean dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/08/2004, 13h07
  5. [imprecis]Réaliser a^n avec seulement l'opérateur d'addition
    Par Amon dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 08/11/2002, 22h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo