Explotación de Format String Bugs
Hoy le llego la hora al Exploit Writing, un tema que me encanta pero por falta de tiempo siempre lo tengo que dejar de lado. Hoy vamos a hablar de un tipo de bugs de la que todos han escuchado hablar, pero pocos saben explotar.
Se trata de los conocidos format string bugs. Estos errores son explotados desde la edad de piedra, pero siempre esta copado aprender algo que no se conoce, así que acá voy a ir anotando mis avances. Encima si ayudo a alguien aunque sea un poco a que entienda esto… entonces doble felicidad.
Antes de comenzar la explicación, voy a pegar una imagen que encontre aca, ese dibujito, resume muy bien cual es el bug 😉
La mayoría de los textos que van a encontrar dando vueltas por internet sobre este tema, explotan todo en Linux y usan el espartano gdb para analizarlo. Encima en ese tiempo no existia la tecla “Impr Pant” por lo tanto no encontras una captura de pantalla ni de suerte :-P.
Vamos a comenzar con un típico programa vulnerable de prueba, para entender la cosa:
#include <stdio.h> char cookie; int main(int argc, char **argv) { char *p; p = &cookie; printf(argv[1]); if(cookie == (char)0xFE) { printf("\n[+] You are a great exploit writer\n"); } else { printf("\n[-] -1 for you\n"); } return 0; }
Un programa muy simple, definimos una variable cookie a la cual no le asignamos ningún valor, pero la misma es comparada con un valor (0xFE), si es igual te imprime el good boy, sino el bad boy.
Antes de adentrarnos donde esta el error, vamos a comenzar viendo el programa:
Construyendo tipos de datos de C con ctypes
Seguimos con estos post dedicados a python y su libreria ctypes. En este caso voy a dar algunos ejemplos para saber que tipo de datos usar en cada variable que criemos.
Hago esto… porque yo como muchos reversers estoy acostumbrado a ver todo como BYTE, WORD, DWORD. Ya cuando me agregan palabras como punteros o integer, ya me rompe la paciencia 😛 por eso vamos a ver que tamaño le da a cada cosa nuestra querida librería de python.
Esta es la lista de estructura de datos que nos provee el librito “Gray Hat Python“:
C Type | Python Type | ctypes Type |
---|---|---|
char | 1-character string | c_char |
wchar_t | 1-character Unicode string | c_wchar |
char | int/long | c_byte |
char | int/long | c_ubyte |
short | int/long | c_short |
unsigned short | int/long | c_ushort |
int | int/long | c_int |
unsigned int | int/long | c_uint |
long | int/long | c_long |
unsigned long | int/long | c_ulong |
long long | int/long | c_longlong |
unsigned long long | int/long | c_ulonglong |
float | float | c_float |
double | float | c_double |
char * (NULL terminated) | string or none | c_char_p |
wchar_t * (NULL terminated) | unicode or none | c_wchar_p |
void * | int/long or none | c_void_p |
Calling conventions y ctypes
Comencé a leer el libro “Gray Hat Python” y ya comenzamos con escollos por el camino, como no podía ser de otra manera… el primer ejemplo que se me ocurrió probar me tiraba un error.
En estas poquitas lineas voy a dejar documentado como fue que la safe, para que a nadie le suceda de nuevo.
Tal vez el error se dio porque me apure a agarrar el interprete, antes de documentarme bien acerca de ctypes y python. Pero hay veces que leer tanto le quita la gracia, y uno quiere probar rápidamente si tal o cual cosa sirve para sus propósitos ❗
Recién comencé con el capitulo 2 y me tope con ctypes, una librería que no conocía y que provee la funcionalidad de usar .dll’s desde el mismo código de python. No hace falta decir lo valioso que puede ser para nosotros tener este poder al alcance de la mano.
En el libro tenemos el siguiente ejemplo:
from ctypes import * msvcrt = cdll.msvcrt message_string = "Hello world!\n" msvcrt.printf("Testing: %s", message_string)
ahí nomas sin dudarlo, agarre la consola interactiva y me dispuse a probar ese ejemplo.
Introduccion a RSA – parte I
Hoy traigo un ejemplo practico para comenzar a meternos en los crypto challenges de RSA, documentacion sobra por todos lados pero esta media pobre. Con pobre me refiero a que son medios para gente muy avanzada que ya esta en el tema hace rato y no dan muchas pistas de como resolvieron tal o cual problema
Por cuestiones de espacio el tute fue dividido en dos partes, en esta trataremos el reverseo del programa, y en la segunda vamos a darle un poco a las matematicas con python para tratar de resolverlo
nuestro objetivo sera un crackme inocente que encontre en crackmes.de bajo el nombre de Ninja Crackme by Bart
esto no va a ser un tute sobre como resolverlo, sino que voy a dar algunos pantallazos para que me puedan seguir (no esperen que explique como poner un bp)
carita del crackme
Finding the M.I.R.A.C.L.
Hola a todos, puede parecer que voy a encarar un tema religioso en las proximas lineas pero a no equivocarse. Lo que sigue va a ser una serie de articulos dedicados a la criptografia en diferentes crackmes.
Lo primero que note es que cuando me meti con RSA todos me decian: “usa la funcion tatata de euler que sale” y me tiraban una funcion copy/pasteada del tipo
esto me dio la pauta de que muy bien nadie sabe como funciona esto del crypto, y cada vez que preguntas algo te contestan con mas preguntas….. calculo que esa fue la primera piedra en el camino que me encontre, en unos dias le voy a dedicar un post enterito a Euler, pero por ahora vamos con otra cosa.
Si han leido algun tute por ahi sobre crackmes con criptografia RSA habran aunque sea oido de la libreria M.I.R.A.C.L. esta libreria nos ayuda a trabajar con numeros muy grandotes conocidos como BIGNUM, permitiendonos usar los numeros gigantes que manejan en este tipo de retos.
Si nos encontramos con algun programa que use esta libreria, veremos que tiene un monton de funciones inlineadas bastante complicadas de tracear, dichas funciones son de la libreria estatica miracl
basta con ir un rato a http://crackmes.de/ bajarse un reto con crypto echo en MASM y me juego la cabeza a que usaron miracl para algo
estas librerias que se añaden al ejecutable no tienen ningun nombre cuando las vemos con nuestros debuggers favoritos
Nuevo Plugin para FUU – dePFE
Hola amigos, hoy les traigo una pequeña reseña sobre el packer PFE CX v0.1 con el cual hice mis primeros pinitos en TitanEngine y FUU
primero echemos una mirada a la GUI del protector