;-- dreams of unicorns:
0x00; main 0x01; profile 0x02; projects 0x03; portfolio 0x04; contact
;-- section.1.__TEXT.__projects:
0x02; projects
;-- section.2.__TEXT._computing_and_security: 2023/07/23; PicoCTF: Keygenme ---BEGIN_NATIVE--- Tenemos una aplicación keygenme-trial.py. La misma incorpora en su propio código la versión completa y tenemos que buscar la forma de descifrar la clave de licencia para desbloquear la aplicación y así obtener la versión "FULL". Dado que tenemos el código fuente el reversing a utilizar aquí no viene de un desensamblado, la dificultad es baja puesto que ya podemos analizar el código fuente sin problemas. Para ello comenzamos revisando la parte del código identificando una variable esencial para poder generar el código completo de la aplicación, esta variable sería la variable dinámica, concretamente "key_part_dinamic1_trial". La clave usada como tal para poder generar el código completo de la aplicación es "key_full_template_trial", pero la misma clave es una clave compuesta, donde la parte dinámica es en la que tenemos que centrarnos "key_part_dinamic1_trial", siendo entonces la clave necesaria la siguiente composición: ---BEGIN_CODE--- key_full_template_trial = key_part_static1_trial + key_part_dynamic1_trial \ + key_part_static2_trial ---END_CODE--- También observamos declaraciones de variables de tipo string con el prefijo "b", esto significa conversión a "bytes string literal", esta declaración hace que creemos un objeto de bytes, no un objeto string unicode regular, lo que tendremos que tener en cuenta de cara a convertir o extraer datos. Luego observamos un conjunto de condicionales "if" donde hacen uso de la librería hashlib para hacer un hashing sha256 sobre la variable "username_trial" y usando una posición del resultado. Estos condicionales lo que hacen es recorrer la clave que nosotros introducimos por teclado, concretamente la parte dinámica de la clave "key_part_dinmac1_trial" y va recorriendo caracter a caracter para compararla en cada iteración con una posición concreta del hashing hacia "username_trial". Con esto ya sabemos que solamente tendremos que abrir una consola en python, pasar "bUsername_trial" como variable "username_trial", y ejecutar el hash para averiguar que valor tiene. ---BEGIN_CODE--- >>> hashlib.sha256(bUsername_trial).hexdigest()[4] 'e' >>> hashlib.sha256(bUsername_trial).hexdigest()[5] '5' >>> hashlib.sha256(bUsername_trial).hexdigest()[3] '8' >>> hashlib.sha256(bUsername_trial).hexdigest()[6] '4' >>> hashlib.sha256(bUsername_trial).hexdigest()[2] 'b' >>> hashlib.sha256(bUsername_trial).hexdigest()[7] '3' >>> hashlib.sha256(bUsername_trial).hexdigest()[1] '6' >>> hashlib.sha256(bUsername_trial).hexdigest()[8] '3' ---END_CODE--- Por lo tanto al ejecutar la aplicación ya tendríamos la parte dinámica de la clave resuelta. ---BEGIN_CODE--- =============================================== Welcome to the Arcane Calculator, SCHOFIELD! This is the trial version of Arcane Calculator. The full version may be purchased in person near the galactic center of the Milky Way galaxy. Available while supplies last! ===================================================== ___Arcane Calculator___ Menu: (a) Estimate Astral Projection Mana Burn (b) [LOCKED] Estimate Astral Slingshot Approach Vector (c) Enter License Key (d) Exit Arcane Calculator What would you like to do, SCHOFIELD (a/b/c/d)? c Enter your license key: picoCTF{1n_7h3_|<3y_of_e584b363} Full version written to 'keygenme.py'. Exiting trial version... =================================================== Welcome to the Arcane Calculator, tron! =================================================== ___Arcane Calculator___ Menu: (a) Estimate Astral Projection Mana Burn (b) Estimate Astral Slingshot Approach Vector (c) Exit Arcane Calculator What would you like to do, tron (a/b/c)? ---END_CODE--- ---END_NATIVE---
;-- section.3.__TEXT.__footer:
Copyright (c) 2004-2023 JS http://www.shidare.com created by JS a.k.a. "edwsec"