¿Qué hace anti-debugging-techniques?
Manual de detección y evasión de técnicas anti-debugging. Útil al hacer ingeniería inversa de binarios protegidos que detectan depuradores mediante ptrace, flags PEB, comprobaciones de tiempo o manejadores de señales/excepciones en Linux y Windows.
Introducción
Las técnicas anti-debugging son mecanismos implementados por los desarrolladores de software para dificultar el análisis dinámico de sus binarios. Este skill proporciona un enfoque sistemático para identificar y eludir estas protecciones.
Plataformas compatibles
- Linux: Protecciones basadas en
ptrace, señales (SIGTRAP,SIGSTOP),/proc/self/status, y comprobaciones de tiempo. - Windows: Flags PEB (
BeingDebugged,NtGlobalFlag), APIIsDebuggerPresent,CheckRemoteDebuggerPresent, y manejadores de excepciones (VEH, SEH).
Técnicas cubiertas
1. Detección por ptrace (Linux)
- Identificación: Buscar llamadas a
ptrace(PTRACE_TRACEME, ...)en el código desensamblado. - Evasión: Parchear la instrucción
ptracepara que devuelva 0, o usar un depurador que intercepte la llamada (ej:LD_PRELOADcon una funciónptracefalsa).
2. Flags PEB (Windows)
- Identificación: Examinar el campo
BeingDebuggeddel PEB (offset0x2en 32 bits,0x2en 64 bits) o la flagNtGlobalFlag(offset0xBCen 32 bits,0xBCen 64 bits). - Evasión: Modificar el PEB en memoria usando un depurador como x64dbg (comando
eip+ escribir en dirección) o mediante un script de Python conpykd.
3. Comprobaciones de tiempo
- Identificación: Buscar llamadas a
rdtsc,GetTickCount,QueryPerformanceCounter, oclock_gettime. - Evasión: Parchear el binario para que devuelva valores constantes, o usar un plugin de depurador que normalice el tiempo (ej:
TimeTravelen x64dbg).
4. Manejadores de señales/excepciones
- Identificación: Código que instala manejadores personalizados para
SIGTRAP(Linux) o vectores de excepción (Windows VEH/SEH). - Evasión: Reemplazar el manejador por uno que pase el control al depurador, o eliminar la instalación del manejador mediante parcheo de bytes.
Ejemplos de uso
Linux: Evadir ptrace con LD_PRELOAD
# Compilar una biblioteca compartida que sobreescribe ptrace
gcc -shared -fPIC -o faketrace.so faketrace.c
export LD_PRELOAD=./faketrace.so
gdb ./binario_protegido
Contenido de faketrace.c:
#include <sys/ptrace.h>
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data) {
if (request == PTRACE_TRACEME) {
return 0; // Finge éxito
}
return 0;
}
Windows: Modificar BeingDebugged con x64dbg
- Abrir el binario en x64dbg.
- Ejecutar hasta el punto de entrada.
- En la consola de comandos, ejecutar:
dump fs:[0x30] + 2para obtener la dirección del PEB. - Escribir en esa dirección:
mov byte ptr [<dirección>], 0. - Continuar la ejecución.
Referencias
- [The