Introduccion Al Cracking en Linux 01 - Introduccion
Introduccion Al Cracking en Linux 01 - Introduccion
Introduccion Al Cracking en Linux 01 - Introduccion
Introducción:
Por fin, después de un tiempo trabajando con linux he podido hacer algo de cracking en este S.O.; no
es nada novedoso, pero la verdad es que voy a empezar desde cero en el análisis de programas en
linux; ya que siendo un sistema libre ,donde casi todos los programas son gratis, nunca ha tenido
mucho interés el cracking. Eso también se puede comprobar por las pocas herramientas especificas
que he encontrado y sobretodo en la poca información que podemos encontrar sobre el tema. Y como
siempre en español, todavía menos; lo poquito que he encontrado está en el magnífico ezine Set
(Saqueadores Edición Técnica):
http://www.set-ezine.org/noticias/index.php
El trabajo CRACKING BAJO LINUX de SiuL+Hacky estaba en varias partes por lo que yo lo he
juntado en un solo documento que acompaña a este tute.
De todos modos, las pocas herramientas y la poca información no nos va a impedir poder hacer
muchas cosas; pues como sabemos lo mas importante del cracking es nuestra habilidad y paciencia
para utilizar el sistema en nuestro favor; y en eso linux nos va a ayudar; pues esta claro que contra
mas conozcamos y manejemos los sistemas unix, mejor podremos estudiar y manipular los
programas que corren sobre él.
Respecto a Linux, yo me he decantado por Debian Etch; pero en general cualquier distribución
actual puede servirnos. La gran ventaja de Debian y todos sus derivados (como Ubuntu,Knoopix...)
es la instalación de paquetes; que gracias al programa apt-get es muy sencilla, evitándonos todos los
problemas de dependencias. También se puede usar aptitude (para consola) o Synaptic para el
entorno gráfico; ambos basados en apt-get, que hacen el manejo de la instalación de programas más
fácil.
Al Atake:
Como este crackme es muy fácil lo vamos a resolver con bastantes herramientas; es la mejor forma
de empezar a manejarlas y ver como actúan. De esta manera tendremos una primera impresión de
todas la posibilidades que nos ofrece linux, tanto si queremos usarlas para la ingeniería inversa o para
el estudio de nuestros programas.
Primero vamos a verlo en acción, funciona dentro de una consola; por lo que hay que ir hasta carpeta
donde tengamos el crackme; yo suelo utilizar Konqueror y cuando llegas a la carpeta con F4 se te
abrirá la consola en la posición que te interesa (también va muy bien MC y no hay que salirse de la
consola). Primero miramos si tiene permiso de ejecución ( si no, hay que dárselo $ chmod u+x
crackme ), lo ejecutamos colocando antes del nombre ./
y vemos lo que nos pide:
Como vemos nos dice que tenemos que conseguir un serial valido; como hoy no tengo el día y no lo
he acertado pues me dice que lo intente otra vez :-)
En otras distribuciones habrá una forma similar y normalmente suelen venir en el CD o DVD de
instalación.
Por cierto, todos estos programas se ejecutan desde una consola, en este caso desde Konsole pues
utilizo KDE como escritorio.
Esta herramienta creo que esta presente en todos los Unix y nos da información del tipo de archivo
que le pongamos como argumento:
$ file crackme
crackme: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.0,
dynamically linked (uses shared libs), for GNU/Linux 2.2.0, not stripped
Como vemos los archivos ejecutables en linux son del tipo ELF, muy diferente del formato PE de
windows, que habrá que estudiar mas adelante, pues he encontrado muy poca información sobre su
estructura. Además podemos ver que es un ejecutable LSB, osea que cumple el Linux Standard
Base; que son unas serie de reglas para intentar compatibilizar las diferentes distribuciones y que
permita que el programa se pueda ejecutar en cualquier sistema linux.
Respecto a “dynamically linked” se refiere a que en su compilación con gcc (compilador por
defecto en linux) se ha hecho un linkado dinamico; osea que al ejecutarse y necesitar de librerias
ajenas ( shared libs= librerias compartidas); las buscará en tu ordenador. Este es el formato normal
de compilar en Linux (para evitarlo debes colocar el argumento -static en tu compilación) y es lógico
pues hace un ejecutable mas pequeño y rápido; pero también da lugar a las dependencias ( una
palabra maldita para los que luchamos con este S.O .); si al ejecutarse, las librería que necesita no
están, no se podrá ejecutar y habrá que instalárselas para que funcione.
Por último vemos “ not stripped”, esto significa que no se han eliminado los símbolos del fichero
objeto; que son símbolos que genera el compilador y que nos van a dar mucha información. Si
usamos un programa llamado strip, eliminara toda esa información y hará el ejecutable todavía mas
pequeño y en la información saldrá “stripped” como es lógico. No confundir estos símbolos con los
que busca gdb al iniciarse, esos símbolos es el código del programa que normalmente en los
programas free de linux se tienen y se pueden utilizar, pero que nosotros nunca tendremos
Por cierto, en el caso de tener el código fuente, para ayudar a la depuración se puede añadir el flag -g
al compilarlo, eso dejará mucha información para el debugger y nos ayudará a encontrar los
problemas.
1.b nm
$ nm -D crackme
w __deregister_frame_info
w __gmon_start__
08048604 R _IO_stdin_used
U __libc_start_main
U printf
w __register_frame_info
U scanf
U strcmp
Pues nada mas y nada menos que nuestras amadas APIs, como vemos aquí
casi todas son derivadas del lenguaje C ( gran parte de linux esta hecho con ese
lenguaje) y que no nos vendrá mal repasar sus funciones. En este caso llama la
atención strcmp, que compara dos cadenas de caracteres; y me huele que sera
nuestra estrella invitada en este tute,jeje.
1.c. strings
$ cat strings.out
/lib/ld-linux.so.2
libc.so.6
printf
__deregister_frame_info
strcmp
scanf
_IO_stdin_used
__libc_start_main
__register_frame_info
__gmon_start__
GLIBC_2.0
PTRhP
QVhP
[^_]
-[ Linux CrackMe (Level:2) by cyrex ]-
-[ TODO: You have to get the valid Password ]-
Enter Password:
47ghf6fh37fbgbgj
-[ Good, You're ready to begin linux reversing ]-
-[ Ohhhh, your skills are bad try again later ]-
Como veis, este crackme es una madre, tiene el valor correcto entre las strings
del programa. Como os comente, ya no habría que hacer nada mas, si
probamos ese serial vemos que es el correcto. Pero como hoy estamos viendo
las herramientas, nos va a venir muy bien, es nuestro crackme de Cruehead
para linux :-p
1.d. strace.
Como veis, en este caso no nos sirve mucho; pero es una arma poderosa y
además nos ayuda a comprender el funcionamiento del programa. Es curioso
que las llamadas del sistema son muy simbólicas y la mayoría son cómodas de
entender.
1.e. ltrace.
Como veis de esta manera también queda resuelto, de forma mas elegante y
clara. Por cierto, insistiendo en la información de “man” y para que veáis lo útil
que puede ser; imaginaros que es un programa grandísimo y la información que
nos da de esta forma ltrace necesita horas para digerir; pero si la protección es
parecida podríamos probar de esta forma:
Como veis concreto y al grano. En este caso he colocado el serial correcto, para
que veáis el significado del numero que aparece al final de cada linea; es el
número que devuelve la función después de ejecutarse; strcmp devuelve 0 si
la comparación es correcta y -1 si es incorrecta.
Por cierto, la dirección 0x80484ab no es la dirección donde se llamo a la API,
es la dirección de retorno al programa, donde como vemos ya sabe el valor de
retorno de la función. Esto lo comprobé con la siguiente herramientas, el
debugger.
2.GDB y DDD.
En realidad gdb también es una herramienta del sistema; pues aunque no suele
venir instalado, es el debugger de GNU, el mas completo y en el que se basan
los otros que veremos. Pero también es complicado de utilizar; por lo que vamos
a utilizarlo con DDD; que solo es un entorno gráfico para gdb. Esto nos ayudara
a conocer las ordenes básicas de gdb y verlo todo un poco mejor ;-)
$ ddd crackme
Hay dos motivos para hacerlo asi, primero es lo mas rápido y segundo, aunque
sea un componente grafico con sus ventanitas y todo; las informaciones de
salida de errores “stderr” son mas completos en consola y dan mucha
información, esto nos vale siempre para linux, sobretodo, si como a veces pasa,
el programa no arranca. En este caso, en la consola veréis muchos errores que
no tienen importancia, y además, sale un mensaje de aviso:
Esto debe estar relacionado con los archivos de depuración, que como he
comentado aparecen al compilar un programa con la opción -g, la verdad es
que no lo se, pero el error no tiene importancia.
Lo aceptamos y el programa arranca sin problemas, como ya lo he ejecutado
varias veces sale con el código:
Realmente la primera vez que lo ejecutas se queda todo en blanco, pues no hay
código fuente, y lo importante es que la ventana inferior debe quedar como
veis; es el gdb, puro y duro, y se queda con el prompt (gdb) esperando recibir
ordenes. Por tanto, podemos usar tanto el gdb directamente o lo que es mas
comodo, mediante las opciones de ddd, vamos al menú “View > Command
tool” y nos sale una ventanita con los comandos mas utilizados:
Y por último, desde el menu “Source > Breakpoint”, sale una ventana con
todos los breakpoint que tenemos puestos, los puedes editar y puedes poner
otros nuevos dándole al símbolo de stop.
De cualquier manera, una vez colocado el bpx se le da a run, en este punto es
importante saber que DDD para todos los programas que funcionan en consola,
como el crackme; va a llamar a xterm como consola predeterminada; por lo
que como yo no la tenia instalada me dio algunos problemas, hasta que lo
solucione con el clásico #aptitude install xterm
Por tanto, al darle a run nos aparecerá una ventana con xterm ejecutando el
programa; aunque en este momento en blanco y el ddd parado en el bpx que
hemos colocado:
Como veis la flecha verde indica donde esta parado el programa y la señal de
stop que hay colocado un bpx. Ahora es un buen momento para sacar los
valores del registro, “Status > Registers”:
En el mismo menu de “status” hay otras opciones interesantes, como los
threads, sygnals....etc.
Bueno vamos al asunto, sabemos por ltrace que la función strcmp esta en
0x80484ab, la buscamos en el source y vemos lo que os comente antes:
Como veis en 0xb7ed4e0a compara al con el valor que indica edx. Por cierto,
para liarlo todo un poco mas, el desensamblado que vemos es igual al formato
que he visto en el cursillo de HLA ( un saludo FL :-) , por lo que en Ollydbg seria
cmp al, byte ptr [edx], osea el origen y destino están al revés. En el registro
vemos:
Otra manera mas directa que admite ddd, es colocar el bpx directamente en
la API, para ello en el código inicial seleccionamos la función y con un clic
derecho le colocamos el bpx:
Como veis en gdb es un simple break strcmp; esto nos lleva directamente a la
zona caliente y fácilmente veremos la comparación.
3.EDB.
Una agradable sorpresa para el cracking en linux y para los amantes del
Ollydbg, es un programa que encontré en el foro de Woodmann, es un frontends
para gdb pero la verdad muy conseguido y al igual que el Olly, da mucha
información de forma rápida (tanto cuesta hacer las cosas asi?? que porque sea
linux, todo tiene que ser complicado??grrrrrrrrrrr)
Lo podéis encontrar en:
http://www.codef00.com/projects.php#Debugger
Instalación:
$ qmake
$ make
Selección Alternativa
-----------------------------------------------
*+ 1 /usr/bin/konqueror
2 /usr/bin/iceape
3 /usr/bin/iceweasel
Por tanto, en este caso el sistema esta predispuesto a utilizar qt3 y tuve que
cambiarlo en varias puntos. Para ello se ejecuta:
# update-alternatives –all
Y donde salia las dos opciones, elegía qt4 y listo. Vuelvo a repetir el qmake y el
make y el programa se compila perfectamente, quedando los ejecutables,
librerías y plugins en la misma carpeta donde lo hemos descomprimido.
Por último como dice el readme hay que enlazar los simbolos, para ello se
ejecuta un script que acompaña al código:
$ ./make_symbolmap.sh
Como veis tuve que poner el bpx en el EP; pues paraba antes, y también he
puesto el bpx en la llamada a strcmp, solo es necesario darle a “Add
Breakpoint” y darle la dirección; después le damos a F9 y nos para sin
problemas. A partir de aquí seguimos con F7 al principio y después con F8
hasta llegar a la zona caliente:
Conclusión.