shidare.com
;-- 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:
Creative Commons BY 3.0 Valid XHTML 1.0 Transitional B.Y.O.B.
Copyright (c) 2004-2023 JS 
http://www.shidare.com created by JS a.k.a. "edwsec"