[BUUCTF] REVERSE —— [GWCTF 2019] re3

[GWCTF 2019] re3

anexo

paso

  1. Programa de 64 bits, sin shell, abierto directamente con ida, en primer lugar para recuperar la cadena en el programa
    Inserte la descripción de la imagen aquí
  2. De acuerdo con el salto correcto para encontrar la función relacionada con la bandera, a continuación puede ver ABC ...... * /, supongo que hay encriptación base64 en el programa
    Inserte la descripción de la imagen aquí
  3. No hay f5 aquí. Se estima que jz pot ha afectado el funcionamiento normal de ida. Primero , echemos un vistazo a la función
    principal main () anterior. La
    Inserte la descripción de la imagen aquí
    longitud de la cadena de entrada es de 32 bits. Utilice la función mprotect para modificar la dirección de longitud 0xF000 en dword_400000 a Legible, escribible y ejecutable, los datos en sub_402219 () han sido XORed.
  4. Se puede ver que la función sub_402219 () no solo participa en el XOR como datos, sino que también es referenciada como una función, y esta función no se puede abrir Después de
    adivinar el XOR, esta función es la función real. Entonces, primero restaure los datos en sub_402219 (), y
    haga clic directamente en sub_402219 en la parte del pseudocódigo para saltar a su segmento de datos. Debe buscarlo en el código ensamblador y
    Inserte la descripción de la imagen aquí
    presionar D para convertirlo al tipo de datos y
    Inserte la descripción de la imagen aquí
    luego usar el script idc para restaurar los datos. Primer contacto con el script idc, simplemente registre
    primero shif + f2 para llamar al editor del script, y luego puede editar el script idc. La sintaxis es un poco similar a c. Para la sintaxis específica, consulte este artículo y este artículo para
    Inserte la descripción de la imagen aquí
    explicar brevemente el método de escritura. Primero, defina una variable local addr, que es la posición inicial de los datos que queremos reparar, i se usa para atravesar, y la subsecuente for loop copia la función principal, y la última es PatchByte(addr+i,Byte(addr+i)^0x99)esta oración.
    Primero mire la gramática de PatchByte, esta oración comienza desde addr, usa i para recorrer la dirección y establece el valor de la dirección correspondiente en byte_402219 [addr + i] = byte_402219 [addr + i] ^ 0x99
    Inserte la descripción de la imagen aquí
    Haga clic en ejecutar para restaurar la data
    Inserte la descripción de la imagen aquí
    y seleccione los datos después de restaurar Presione c, seleccione forzar para forzar la ejecución y convierta los datos en código.
    Inserte la descripción de la imagen aquí
    Luego presione p para crear una función al comienzo del código en 0x402219.
    Inserte la descripción de la imagen aquí
    Ahora regrese y observe nuestra función principal
    Inserte la descripción de la imagen aquí
    sub_402219 ( ). Esta función se puede abrir. El salto en la línea 19 es Baidu. Mira, para ver la nieve para una explicación

Error de reconocimiento de límites de función, o
debido a algunas razones, el compilador separará algún código, no almacenado en un área continua, pero en otras ubicaciones, estos bloques a veces son reconocidos por ida, llamados fragmentos, y algunos no pueden ser reconocidos. En este punto, tienes que configurarlo manualmente tú mismo.
Si se trata de un error de reconocimiento de límites, entonces alt + p para encontrar el final correcto;
si es el último, agregue el área objetivo a esta función a través de append_func_tail. Además, primero debe indefinir el área objetivo.

Fui a Baidu para el wp de esta pregunta y descubrí que no la afectó, así que no continué lanzándola.

  1. Continúe mirando main (), y luego llame a sub_40207B ()
    sub_40207B (), su parámetro unk_603170 () no se puede ver directamente en ida, y luego muévase para ver si
    sub_40207B () llama a la función sub_401CF9, es demasiado larga, simplemente No publicado, de acuerdo con
    Inserte la descripción de la imagen aquí
    el código de característica de
    Inserte la descripción de la imagen aquí
    Inserte la descripción de la imagen aquí
    la función , puede encontrar que este es el código de característica del algoritmo p273 del cifrado md5 n1book.Esta función realiza principalmente el cifrado md5 en la tabla base64 dos veces.

  2. Luego está sub_402219 ()
    Inserte la descripción de la imagen aquí
    sub_400A71 ().
    Inserte la descripción de la imagen aquíPrimero, se repite 4 veces como un todo. Al procesar los datos, se usa el byte_4023A0.
    Inserte la descripción de la imagen aquí
    De acuerdo con la imagen en el n1book que publiqué arriba, podemos encontrar que este es un s encriptado AES box, por lo que la función de esta función es unk_603170(base64表进行了两次md5加密后的结果)Incoming ya que la clave
    sub_40196E () tiene el mismo código de característica, que debería ser el paso del cifrado AES, por lo que su función es usar la unk_603170(上一层传入的base64表进行了两次md5加密后的结果)clave como clave para realizar el cifrado AES en los datos lo ingresamos y lo obtenemos
    después de 9 ~ 11 líneas de procesamiento Tome los datos en byte_6030a0, extraiga los datos en
    Inserte la descripción de la imagen aquí
    byte_6030a0 byte_6030a0 = BC0AADC0147C5ECCE0B140BC9C51D52B46B2B9434DE5324BAD7FB4B39CDB4B5B

  3. En este punto, se aclara la lógica del programa.
    Primero, el resultado de que la tabla base64 esté encriptada en md5 dos veces se pasa a unk_603170
    unk_603170, y los datos que ingresamos
    están encriptados con AES para obtener el byte_6030a0 unk_603170. Se puede ajustar o en línea md5 plataforma de cifrado. Consígalo o escriba su propio script de cifrado md5 y ejecútelo

  4. Ajuste el valor de unk_603170 (principalmente porque no puedo obtener la clave correcta después de usar el sitio web de la herramienta dos veces el cifrado md5, y el python escrito por mí mismo está atascado entre la conversión de codificación)
    porque es un archivo elf, por lo que necesito usar un ajuste móvil virtual, con respecto a cómo usar IDA para ajustar el archivo ELF (usando una máquina virtual), lea este artículo en detalle. La
    premisa es que la máquina física y la máquina virtual pueden hacer ping entre sí. Si el ping falla, reinicie la tarjeta de red de la máquina virtual.
    Después de ajustar durante mucho tiempo, finalmente lo descubrí por mí. unk_603170=CB8D493521B47A4CC1AE7E62229266CE
    Inserte la descripción de la imagen aquí
    Aquí hay un registro de los pozos en la depuración de esta pregunta. En
    Inserte la descripción de la imagen aquí
    primer lugar, puede ver que el programa puede omitir esta salida (0) siempre que la cadena de entrada la longitud es 32, pero en la operación real, no está funcionando. Mi forma de omitir es ejecutar el if para juzgar el siguiente punto de interrupción, y luego
    Inserte la descripción de la imagen aquí
    establecer el siguiente punto de interrupción antes de ejecutar la asignación en unk_603170, y luego ejecutar f9 al primer punto de interrupción , y luego ctrl + f7 para ejecutar el segundo descanso. Haga clic, y luego un solo paso f8 para unk_603170 para completar la asignación, simplemente vaya a unk_603170.

  5. Finalmente, use unk_603170 para descifrar byte_6030a0, la herramienta en línea no puede descifrar, publicar la exp de otro maestro python2 y la conversión codificada con python3 está bloqueada.

from Crypto.Cipher import AES
import codecs

aes = AES.new(decode_hex('CB8D493521B47A4CC1AE7E62229266CE')[0], AES.MODE_ECB)
print(aes.decrypt(decode_hex('BC0AADC0147C5ECCE0B140BC9C51D52B46B2B9434DE5324BAD7FB4B39CDB4B5B')[0])) 

bandera {924a9ab2163d390410d0a1f670}

Fuente de exp: https://www.cnblogs.com/Mayfly-nymph/p/12829168.html

Supongo que te gusta

Origin blog.csdn.net/mcmuyanga/article/details/114360856
Recomendado
Clasificación