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 ...
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.
Vérifiez grossièrement le processus d'encodage Base64. Voir d'autres sites pour plus de détails.
Le décodage est facile si vous comprenez le mécanisme d'encodage! En gros, suivez simplement la procédure inverse!
SG9nZUhvZ2U=
→ SG9nZUhvZ2U
SG9nZUhvZ2U
→ 010010 000110 111101 100111 011001 010100 100001 101111 011001 110110 010100
01001000 01101111 01100111 01100101 01001000 01101111 01100111 01100101 00
01001000 → H
01101111 → o
01100111 → g
01100101 → e
01001000 → H
01101111 → o
01100111 → g
01100101 → e
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()
$ 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
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
Qu'est-ce que base64? ?? Je l'ai implémenté pour comprendre --qiita https://qiita.com/PlanetMeron/items/2905e2d0aa7fe46a36d4
Recommended Posts