Este documento presenta un taller de reversing aplicado a sistemas Windows y CTFs. Incluye información sobre herramientas de reversing como editores hexadecimales y depuradores, así como sobre la configuración de un entorno de laboratorio con máquinas virtuales y proxies. También describe retos de la plataforma Atenea para practicar reversing, como crackmes y programas protegidos, y explica conceptos básicos para empezar en reversing como arquitectura x86 y formato PE.
2. Who Am I
@voidm4p
voidm4p@protonmail.com https://voidm4p.me
• Mariano Palomo
• Graduado en Ingeniería Informática por la UGR
• Malware Analyst en Entelgy InnoTec Security
• Con interés en reversing, análisis de malware y no tan
análisis...
4. Hardening
• Instrucción CPUID y clon de BIOS: fichero .vmx
• Direcciones MAC
• Registros, tamaño disco duro, número de
procesadores, etc.
cpuid.1.ecx="0---:----:----:----:----:----:----:----"
SMBIOS.reflectHost = TRUE
9. ATENEA
• Plataforma de desafíos de seguridad informática
• Compuesta por diferentes retos
• Criptografía y Esteganografía
• Exploiting
• Forense
• Networking
• Reversing https://atenea.ccn-cert.cni.es
10. ATENEA ESCUELA
• Plataforma básica de desafíos de seguridad informática
• Fomentar el aprendizaje de los usuarios menos entendidos en el
campo de la seguridad.
https://atenea.ccn-cert.cni.es/escuela/home
11. Reversing: ¿por donde empezar?
• Arquitectura de computadores
• Ensamblador sintaxis Intel x86
• Formato Portable Executable (PE)
• Desensamblador/Decompilador
• Código ensamblador
• Depurador
• Programación: C/C++, Delphi, .NET, Python, …
• Microsoft Developer Network (MSDN)
• Unpacking
13. Crackme! If you can…
• El objetivo principal del crackme es obtener determinada clave
codificada embebida dentro del binario.
• Dicha clave podrá visualizarse en claro cuando se ejecute el mismo
de la manera adecuada.
8fd4bfa088881776a16b1155e7639bbe
14. Crackme! If you can…
$ file Crypt0-8fd4bfa088881776a16b1155e7639bbe.exe
Crypt0-8fd4bfa088881776a16b1155e7639bbe.exe: PE32 executable
(console) Intel 80386, for MS Windows
• DETECT IT EASY (DIE)
• Compilador: Visual C/C++
• No parece estar empaquetado
15. Crackme! If you can…
• Análisis estático para entender el flujo del programa
• Partimos del Entry Point
• Este no es el “Main” que ha creado el programador, hay código
que ha insertado el compilador.
16. Crackme! If you can…
• Pseudocódigo C de la
función main generado
por el decompilador
• param_1 > 2: hay que
pasarle al menos dos
parámetros al programa
• FUN_0040100 tiene que
devolver != 0
17. Crackme! If you can…
• FUN_0040100
• Comprobación de procesos en ejecución con blacklist
https://docs.microsoft.com/en-us/windows/desktop/api/tlhelp32/nf-tlhelp32-createtoolhelp32snapshot
https://docs.microsoft.com/en-us/windows/desktop/api/tlhelp32/nf-tlhelp32-process32first - https://docs.microsoft.com/es-es/windows/desktop/api/tlhelp32/nf-tlhelp32-process32next
https://docs.microsoft.com/es-es/windows/desktop/api/tlhelp32/ns-tlhelp32-tagprocessentry32
23. Matrioska
• Averigua la flag y supera este reto de especial dificultad.
• PISTA: Piensa en el verdadero cifrado...
• La contraseña del zip es infected
56cec8a0d69e0e458ffdc6855ea97834
29. Matrioska - T.exe
• Array con los botones de la GUI
• offset con el código que maneja
la pulsación de cada tecla
• Poniendo un breakpoint en cada
uno y pulsando las teclas
podemos averiguar cuál
corresponde con cada uno…
33. Matrioska - T.exe
• Llama la atención una cadena
con cabezera MZ
• >>> chr(0x4d)+chr(0x5a)
• 'MZ'
• A continuación una escritura
en fichero “t.tmp”
34. Matrioska - T.exe
• Hay varias secciones de código
iguales a esa
• ¿Qué orden siguen?
• xrefs de cada variable
35. Matrioska - T.exe
• Se podría extraer cada parte y concatenarla en un fichero, pero…
Hemos venido a jugar!!
• Localizamos dónde es llamada cada función en la que tenemos esas
cadenas
Parte 1
Parte 2
Parte 3
Parte 4
Parte 5
Parte 6
Parte 7
Parte 8
A
OK
OK
C
45. Matrioska - a.exe
• Si se introduce el
valor esperado
• Se escribe en una
clave de registro la
segunda parte (6
caracteres)
• Se iguala a 1
byte_452BC4
61. Matrioska - 1.ps1
• Se escribe el valor tras el XOR en
un fichero “dork”
• Se calcula el carácter resultado
de restar 4056 a cada valor de un
array
• Se escribe en un fichero
“a.xsl”
• Se ejecuta mediante wmic
(técnica de bypass)
• Se borra
62. Matrioska - a.xls
• Fichero XML con código JScript.
• Técnica dotNetToJscript
63. Matrioska - a.xls
• _0x2cf9: Un
array con
valores
codificados en
base64
• Funciones
varias…
65. Matrioska - a.xls
• Objeto
serializado
• No es
funcional,
pero basta
para
analizar su
código
66. Matrioska - serialized_obj
• La fecha del sistema debe
ser 1/1/2019
• La URL devuelve 500 El
flujo continúa en el catch
67. Matrioska - serialized_obj
• p: ciphertext
• dork: w10123shark01
• Se borran “p” y “dork”
• Anti-debug basado en
tiempo
• Descifrado con AES de “p”
usando con la clave de dork
68. Matrioska - serialized_obj
• La fecha del sistema debe
ser 1/1/2019
• La URL devuelve 500 El
flujo continúa en el catch
69. Matrioska - w
• El verdadero cifrado…
http://www.cyber-forensics.ch/how-to-find-truecrypt-containers/
70. Matrioska - w
• ¿Cuál es la pass? John…
• $ python truecrypt2john.py w_decoded > true_hashes.txt
• john --wordlist=rockyou.txt true_hashes.txt
https://raw.githubusercontent.com/magnumripper/JohnTheRipper/2a18678301cef281a168ea6d84980449d5c8e4da/run/truecrypt2john.py
71. Matrioska - w
• ¿Cuál es la pass? Hashcat…
$ dd if=w_decoded of=w_decoded_hidden bs=1 skip=65536 count=512
$ hashcat --help | grep "True" -A 14
62XY | TrueCrypt | Full-Disk Encryption (FDE)
X | 1 = PBKDF2-HMAC-RIPEMD160 | Full-Disk Encryption (FDE)
X | 2 = PBKDF2-HMAC-SHA512 | Full-Disk Encryption (FDE)
X | 3 = PBKDF2-HMAC-Whirlpool | Full-Disk Encryption (FDE)
X | 4 = PBKDF2-HMAC-RIPEMD160 + boot-mode | Full-Disk Encryption (FDE)
Y | 1 = XTS 512 bit pure AES | Full-Disk Encryption (FDE)
Y | 1 = XTS 512 bit pure Serpent | Full-Disk Encryption (FDE)
Y | 1 = XTS 512 bit pure Twofish | Full-Disk Encryption (FDE)
Y | 2 = XTS 1024 bit pure AES | Full-Disk Encryption (FDE)
Y | 2 = XTS 1024 bit pure Serpent | Full-Disk Encryption (FDE)
Y | 2 = XTS 1024 bit pure Twofish | Full-Disk Encryption (FDE)
Y | 2 = XTS 1024 bit cascaded AES-Twofish | Full-Disk Encryption (FDE)
Y | 2 = XTS 1024 bit cascaded Serpent-AES | Full-Disk Encryption (FDE)
Y | 2 = XTS 1024 bit cascaded Twofish-Serpent | Full-Disk Encryption (FDE)
Y | 3 = XTS 1536 bit all | Full-Disk Encryption (FDE)
$ hashcat -m 6211 w_decoded -w 3 rockyou.txt --force
$ hashcat -m 6211 w_decoded_hidden -w 3 rockyou.txt --force
75. Matrioska - Flag
import sys
import subprocess
for cipher,v in rockyiu.iteritems():
for digest,v2 in v.iteritems():
for x in v2:
bashCommand = 'openssl %s -d -md %s -in %s -out ./decrypt/Flag-%s-
%s-%s.txt -pass pass:%s' % (cipher.lower(), digest.lower(), sys.argv[1],
cipher.lower(), digest.lower(), x, v2)
process = subprocess.Popen(bashCommand.split(),
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = process.communicate()
print output
print error
76. Matrioska - Flag
import string
import sys
printable_chars = set(bytes(string.printable, 'ascii'))
with open(sys.argv[1], 'rb') as f:
printable = all(char in printable_chars for char in f.read())
if printable:
print(sys.argv[1])
https://stackoverflow.com/questions/42064158/checking-if-a-byte-is-ascii-printable