Como preparar y como saltarse un antidebuggers sencillo en Gnu/Linux
No se como llegó este tema aquí, pero la propuesta es esa, veremos:
- Como hacer ingeniería inversa a un programa que nos pide una contraseña ( muy rápidamente ).
- Como añadir un anti-debugger sencillo a ese programa para evitar que se recupere la contraseña.
- Como eliminar nuestra propia protección.
Veamos, entonces el programa, nos enfrentamos a esto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Así que lo compilamos e intentaremos extraer la contraseña:
1 |
|
La contraseña se comprueba contra nuestro intento con strcmp, así que podemos obtener la original simplemente traceando las llamadas a librerías ( ltrace ):
1 2 3 4 5 6 |
|
En el strcmp() se puede observar la contraseña, si se comprueba funciona :), ahora a lo interesante...
Anti-debugging
Por muy complicado que pueda sonar es bastante simple, el truco está en que tanto el gdb ( el debugger de GNU ) como las herramientas strace y ltrace se basan en el syscall ptrace, que permite controlar un proceso, pero con un detalle, un proceso solo puede ser controlado por otro ( o por si mismo a la vez ), nunca por más de uno, así que si nos traceamos a nosotros mismos, solucionado, si llamamos a ptrace con los argumentos adecuados y no nos deja tracearnos ya sabemos que pasa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
1 |
|
1 2 3 4 5 6 |
|
Y con eso, evitamos a los cotillas, por ahora...
Anti-Anti-debugging
En este apartado mejor no esperar una solución tan sencilla como la anterior, editaremos el binario para evitar la protección, es un reversing trivial, pero es un momento tan bueno como otro cualquiera para desperezarse y sacar el desensamblador. Primero desensamblamos el ejecutable y localizamos el trozo de código a ejecutar, para el ejemplo usaré objdump para el desensamblado y gHex2 para editar los binarios, simples pero cumplen su cometido:
1 |
|
Lo resaltado es el código que hace la comprobación, el detalle es que el call devolverá 0 si el resultado es satisfactorio y -1 si falla, si el traceado no se utiliza más podemos simplemente sobreescribirlo con un XOR EAX,EAX y NOPs. Buscamos la cadena de caracteres del string y la reemplazamos por:
- 31 C0 : XOR eax, eax
- 90 : NOP
- 90 : NOP
- 90 : NOP
Y asunto resuelto:
1 2 3 4 5 6 |
|
Saludos