[PYTHON] Créer un décodeur Base64

Créer un décodeur Base64

Un certain Crackme est sorti avec une chaîne encodée avec quelque chose appelé custom_base64 ... Pour obtenir le drapeau, vous devez le décoder pour trouver la chaîne d'origine. Qu'est-ce que custom_base64 ... Pour trouver la réponse, nous sommes allés dans l'arrière-pays amazonien ...

Aperçu

Il existe un dictionnaire dans lequel 000000 à 111111 sont remplacés par des caractères dans le mécanisme de Base64. En Base64 normal, un dictionnaire auquel s'applique ʻABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + / `est utilisé dans l'ordre. Le contenu de la fonction custom_base64 a été remplacé par le dictionnaire spécifié. [Article implémentant Base64] Dans cet article, le décodeur est implémenté en Python en référence à 1.

Comment fonctionne Base64

Encoder

Vérifiez grossièrement le processus d'encodage Base64. Voir d'autres sites pour plus de détails.

  1. Convertissez la chaîne de caractères (ASCII) que vous souhaitez modifier en binaire (binaire)
  2. Divisez le binaire en 6 bits
  3. Lors du fractionnement, le dernier est inférieur à 6 bits, ajoutez donc 0 pour qu'il devienne 6 bits.
  4. Convertissez 6 bits en caractères à l'aide de la table de conversion
  5. Ajoutez "=" pour que le nombre de caractères soit un multiple de 4 à sortir en Base64 de 4 bits chacun.
  6. Achèvement de la chaîne de caractères base64 !!

Décoder

Le décodage est facile si vous comprenez le mécanisme d'encodage! En gros, suivez simplement la procédure inverse!

  1. Supprimez le "=" ajouté
  1. Utilisez la table de conversion pour convertir des caractères en binaire et les connecter.
  1. Divisez le binaire en 8 bits et supprimez les 0 ajoutés au codage 3.
  1. Convertissez les bits binaires en ASCII
01001000 → H
01101111 → o
01100111 → g
01100101 → e
01001000 → H
01101111 → o
01100111 → g
01100101 → e
  1. Le décodage est terminé!

Essayez de programmer

custom_base64_decoder.py


import sys
import argparse
BYTE_SIZE = 8

# 000000 ->Une fonction qui crée une liste de type dictionnaire caractère par caractère jusqu'à 111111
def makeDict(base64Dict_seed):
    dictionary = {}

    for i in range(0, 64):
        dictionary[format(i, '06b')] = base64Dict_seed[i]

    return dictionary


#Une fonction qui répertorie les chaînes séparées par n caractères
def split(string, n):
    split_list = []

    for i in range(0, len(string), n):
        split_list.append(string[i:i+n])

    return split_list


#Si la chaîne de caractères n'a pas n caractères, ce sera n caractères`c`Ajouter
def fillBlank(s, n, c):
    mod = len(s) % n

    if mod == 0:
        return s
    else:
        margin = n - mod
        return s + c * margin


#Passer une valeur de dictionnaire renvoie la clé de dictionnaire
def getValue(key, items):
    for v in items.items():
        # print(v[1])
        if v[1] == key:
            # print(v)
            return v[0]
    return ''


def main():
    # -Vous pouvez entrer un dictionnaire personnalisé en ajoutant k
    parser = argparse.ArgumentParser(
    description='custom Base64 Decoder')
    parser.add_argument('-k', '--key', help="Use custom Seed to encrypt in base64 ", \
        default="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
    parser.add_argument('text', help='base text')
    args = parser.parse_args()


    # 0.Faire un dictionnaire
    base64Dict = makeDict(args.key)


    # 1. '='Retirer
    text = args.text.replace("=", '')

    binStr = ""


    # 2.Convertissez des caractères en binaire à l'aide d'une table de conversion et connectez-les.
    for i in text:
        binStr += getValue(i, base64Dict)

    # 3.Divisez le binaire en 8 bits, encodez 3.Puisque les 0 ajoutés par sont restants, supprimez-les
    splitCount = 8
    s = split(binStr, splitCount)

    if (len(s[-1]) != 8):
        s.pop(-1)


    # 4.Convertir le bit binaire en ASCII
    result =""

    for c in s:
        print(c + " → " + chr(int(c, 2)))
        result += chr(int(c, 2))

    print(result)

if __name__ == "__main__":
    main()

Comment utiliser

$ python3 customBase64Decoder.py <Texte en base64>
$ python3 customBase64Decoder.py -k <Dictionaire personnalisé> <Texte en base64>
$ python3 customBase64Decoder.py SG9nZUhvZ2U=
$ python3 customBase64Decoder.py -k xEPOKnvADqeG0m1VkZ47CM653jrtbzLsTc2ypoYUSWJ9ludQig+awf8XF/RNHBhI 4vBUjCcQj8C=

HogeHoge

Résumé

Base64 J'ai bien compris. Avec cela, vous pouvez créer un Base64 original et faire une communication secrète, vous l'avez fait

Un exemple de code peut être trouvé sur GitHub

--Encodeur - https://github.com/itiB/sandpit/blob/master/tools/customBase64Encoder.py

Les références

Qu'est-ce que base64? ?? Je l'ai implémenté pour comprendre --qiita https://qiita.com/PlanetMeron/items/2905e2d0aa7fe46a36d4

Recommended Posts

Créer un décodeur Base64
Faisons un jeu de squash
Faire un décorateur de fonction
Faire une matrice de distance
Je vais créer un mot de passe!
Créer un bouton Nyan
Créez un jeu à la Tetris!
Faisons un robot Discord.
Créer un backend Blueqat ~ Partie 1
Créer un backend Blueqat ~ Partie 2
Créer un LINE BOT (chat)
Créer un bookmarklet en Python
Faites une loterie avec Python
Faire de Responder un démon (service)
Faire un feu avec kdeplot
Faire une impression de forage de calcul
Faisons une rumba distante [Matériel]
Comment faire une traduction japonais-anglais
Créer un identifiant Santa à partir d'une image du Père Noël
Faisons une rumba distante [Logiciel]
Créer une boîte à Tweet pour Pepper
Faisons une interface graphique avec python.
Faites un son avec le notebook Jupyter
Faisons un service de vente au comptant 2
Comment créer un bot slack
Faisons une rupture de bloc avec wxPython
Faisons un service de vente au comptant 1
Comment créer un robot - Avancé
Comment créer une fonction récursive
Rendre la compilation C un peu plus facile
python / Créer un dict à partir d'une liste.
[Python] Faire de la fonction une fonction lambda
Créer un filtre avec un modèle django
Faisons un graphe avec python! !!
Faisons un spacon avec xCAT
Comment créer un robot - Basic
Créer un itérateur de modèle avec PySide
Créez un générateur de rideaux avec Blender
Faisons un service de vente au comptant 3
Faisons un jeu de shiritori avec Python
Créer un lecteur vidéo avec PySimpleGUI + OpenCV
[Python] Comment rendre une classe itérable
Faisons un noyau jupyter
Créer un diagramme de relations des modules Python
Créez un simulateur de gacha rare avec Flask
Faire de Jupyter Notebook un service sur CentOS
Créez un pipeline de notebook avec Kedro + Papermill
Faire de Unity Accelerator un service sous Linux
Faire une figure partiellement zoomée avec matplotlib
Créez un quiz de dessin avec kivy + PyTorch
Faisons la voix lentement avec Python
Créez un classificateur en cascade avec Google Colaboratory
Faisons un langage simple avec PLY 1
Fabriquez-vous quelque chose comme une fusée?
Faire un circuit logique avec Perceptron (Perceptron multicouche)
Faisons un site multilingue en utilisant flask-babel
Créer une animation GIF avec surveillance des dossiers
J'ai créé une API Web