Un resumen de cómo Python implementa la conversión binaria.
Conversión de cadenas y hexadecimal
Por ejemplo, Baidu CTF 65438, el primer misceláneo de la segunda sesión de febrero.
1
666 c 61677 b 65633862326565302d 336165392d 346332313031322d 3038616135666137626536377d
Un método relativamente simple es llamarlo directamente. decode('hex ') descifra la cadena, pero ¿cómo lo resolverías sin esta función?
Una idea es dividirlo primero en dos grupos, calcular el valor ASCII de cada grupo y fusionar las cadenas para obtenerlo. El código específico es el siguiente.
1234567
importar RES = ' 666 c 61677 b 6563862326565302d 336165392d 3463323130313031322d 3038616613566661376626536 Fendal. {2} ', s)s = mapa(lambda x: chr(int(x, 16)), s)imprimir ' '. Agregue gt gt gt flag { EC 8 B2 ee 0-3ae 9-4c 21-a 012-08 aa 5a 7 be 67 }
Mencioné la función decodificar('hex ') de la cadena, y También hay otras dos funciones que se pueden convertir a 16, que se resumen aquí.
La función incorporada hex()
Solo se pueden convertir 10 números enteros decimales a hexadecimal y las cadenas no se pueden convertir.
Hexlify() y b2a_hex() de la biblioteca binascii
La función de estas dos funciones es convertir cadenas a hexadecimal, y las funciones de descifrado correspondientes son unhexlify() y a2b_hex( ).
Conversión binaria
Binario, octal, hexadecimal a 10 es relativamente simple, llámalo directamente.
Función int
1
Int(str, base) //Devuelve un entero decimal, pero tenga en cuenta que el primer parámetro es una cadena.
Las funciones de descifrado correspondientes son
12345
Bin() //10 decimal a binario oct() //Decimal a octal hex() // Decimal a hexadecimal.
Pero convertir directamente el binario a 16 es un paso más. Primero use int para convertir decimal y luego use la función hex() mencionada anteriormente para convertir decimal a hexadecimal. Una forma más sencilla de escribir es
1
Map (lambda x: hex (int (x, 2)), ['0011'])//expresión lambda
Quizás
1
[hex (int (x, 2))for x in[' 0011 ']]//Análisis de lista
El la función de descifrado correspondiente es
1
map(lambda x: bin(int(x, 16)), ['ef'])
Adjunte el último El último gadget de conversión binaria que escribí en Python, su función principal es convertir un conjunto de binarios, ascii o hexadecimal en cadenas. Creo que este tipo de problema se encuentra a menudo en ctf.
1234567891011121314151617181920212223242526272829303132333435363738394041424344
# make by Jiang señor #Codificación: utf-8 import re import arg parse def bin tostr(texto): texto = texto . reemplazar(' ', ' ')text = re.findall (r '.{8} ', text) s = map(lambda x: chr(int(x, 2)), Text)# Indicador de lote binario a decimal = ' '. Join(s) return flag def ascii tostr(texto): if ' ' en texto: texto = text.split(')elif ', ' en texto: texto = split(', ')s = map(lambda x. :chr(int(x)), texto) bandera = ' '. unirse(s) devolver bandera def hextostr(texto): texto = re encontrar todo(r '. {2} ', texto) # imprimir texto s = map(lambda x: chr(int(x, 16)), texto ) #print s bandera = ' '. Si _ _ nombre _ _ == ' _ _ principal _ _ ', la unión devuelve indicadores: parser = argparse. analizador de argumentos () analizador. agregar _ argumento ("-b") analizador. agregar _ argumento ("-a") analizador. agregar _ argv = analizador _ args () # imprimir argv si argv. (argv . b)elif argv . a:RES = asciitostr(argv . a)elif argv .x:RES = hextostr(argv . x)print RES
Uso:
十Hexadecimal a cadena:
666 c 61677 b 65633862326565302d 336165392d 346332313031322d 3038616135666137626536377d
12
bintostr py-x "6. 66 c 61677 b 65633862326565302d 336165392d 346332312d 613031322d 30386161356666137622
Binario a cadena:
Puede tener espacios o no.
00101111 01100110 00110110 00110111 0065438 010011 00110010 00110100 00110001 00110000 01100006543 8 0 01100001 0110 0100 01100011 00110000 00110011 006543 8 010111 01100110 01100010 00110000 01100011 0654 38 0100010 01100001 01100001 00 00110000 01100011 00110111 00110101 00110011 00110001 001100 11 00110111 00110011 00101110 0111010 0 01111000 01110100
12
bintostr .py-b " 001011111100110 0111111100 0165438
Ascii a cadena
se puede separar por espacios, También puede estar separado por espacios
s = ' 45 46 45 46 32 45 32 46 46 45 46 32 46 46 46 46 46 46 32 45 46 46 46 46 32 46 45 45 46 46 45. 46 32 45 46 46 46 46 32 46 46 46 32 46 46 32 46 32 46 32 46 46 46 32 46 46 46 46 45 46 46 32
bintostr .py-a " 45 46 45 46 32 45 32 46 45 46 32 46 45 46 46 46 46 32 45 46 46 46 32 46 46 45 45 46 45 46 45 45 32 45 46 46 32 45 46 32 46 46 46 46 32 46 46 46 46 46 46 46 32 46 46 46 46 46 46 32 46 46 46 46 32 46 46 46 46 32. -.-..-.. -.....-.....- .- -..... -..
Los ejemplos anteriores provienen todos de algunas preguntas del concurso ctf.
Resumen