Tenemos un binario ELF para x86. Vamos a analizar strings:

Vemos las cadenas características de éxito/fracaso y también extrañas cadenas kill
, /etc/shadow
, /etc
, nonexist.txt
…
¿Qué dira ghidra al respecto? Curiosamente si intentamos decompilar la función main veremos que se queda prácticamente colgado. Al cabo de un minuto o dos vuelve a la vida y vemos que el proceso de decompilación las está pasando canutas:

¿Qué estará ocurriendo con ese binario? Creamos un docker para ejecutarlo con prudencia. chmod +x ./decoded
y antes de lanzarlo nos acordamos del «Don’t run as root» y viendo la cadena /etc/shadow
en el binario, igual es una buena idea hacerlo como usuario no-root, sí.

Vamos a trazarlo con strace ./decoded

No le gusta tampoco el strace. Mientras lo hacíamos, ghidra a vuelto a la vida y al menos nos deja curiosear por el desensamblado de main (el decompilador sigue loco)

Esas funciones generate_error_X sí que son descompilables. Por ejemplo, generate_error_1 es una simpática función que cambia los permisos de /etc/shadow

La cadena nonexist.txt
se debía a esto otro:

Como ejercicio interesante vamos a ver dónde detecta el tracer y parchear el binario para que no lo haga. Copiamos el binario en cracked, lo abrimos en radare con radare2 -w cracked
. Analizamos el mismo con el comando aaa
. Pulsamos V
(modo visual) y p
para ver el desensamblado. Pulsamos ahora _
para ver referencias a cadenas, tecleamos tracer
y pulsamos intro . Pulsamos x
(cross-references) para que nos lleve a la línea de código donde se usa la cadena tracer y pusalmos intro.

Nos situamos en 0x0000126a y pulsamos A
para empezar a añadir el código que queremos (je 0x1296). El mismo radare2 generará el código de operación necesario (742a). Pulsamos intro y guardarmos el resultado. Salimos con q
y quit
.

Ahora sí, strace nos informa de multitud de llamadas a funciones para generar errores:

Al haber eliminado esa protección anti-tracer también conseguiremos facilitar el análisis del binario con radare2, esta vez en modo debug. Veamos cómo hacerlo en el siguiente post.