Tengo un archivo binario y se supone que debo descifrar su contraseña (tarea). También se proporcionó una función (una función que forma parte del archivo binario). Esa función mostró que la cadena de entrada se comparó con la contraseña correcta carácter por carácter y se devolvió falsa instantáneamente cuando un carácter estaba equivocado (esa no es una forma segura de hacerlo, supongo porque es tiempo de fuga y tenemos una idea de la longitud correcta de la contraseña como ejemplo). Pero nuestro maestro ha agregado un temporizador aleatorio que devuelve el resultado (Correcto / Incorrecto) para que sea un poco más difícil para nosotros ...
De todos modos, ya lo hice con éxito con ingeniería inversa y obtuve la contraseña correcta. Ahora estoy jugando con él en la línea de comando:
/usr/bin/time -v ./program_name enter_password
Con este comando, obtengo mucha información, como la hora del sistema, los intercambios, el tiempo de ejecución ... Pero lo que más me interesa es "Cambios de contexto voluntarios" porque cuanto más caracteres correctos de la contraseña ingreso, menos "Cambios de contexto voluntarios " ¡Yo obtengo!
Cuantos más caracteres incorrectos ingrese, más "Cambios de contexto voluntarios" obtendré.
Me tomó casi dos horas descifrar la contraseña simplemente ingresando ese comando, ingresando caracteres y observando "Cambios de contexto voluntarios". Cada vez que UN personaje era correcto, los "Cambios de contexto voluntarios" disminuían en uno.
Mi pregunta, ¿qué son exactamente los "cambios de contexto voluntarios" y por qué me ayudaron a descifrar la contraseña?
fuente
Respuestas:
La página del manual
time
explica el concepto de cambios de contexto voluntarios e involuntarios:(la cita es de mi sistema Debian, la página man vinculada tiene un texto ligeramente diferente)
Es decir, un cambio de contexto es voluntario, si el proceso abandona la CPU porque no tiene nada más que hacer (mientras espera que ocurra algo externo). Involuntario, si le gustaría continuar algunos cálculos, pero el sistema operativo decide que es hora de cambiar a algún otro proceso.
Cómo algo de esto está relacionado con el programa de verificación de contraseña, depende de lo que el programa realmente haga.
Del código fuente vinculado en los comentarios, vemos que el programa llama
usleep()
una vez por cada carácter que no coincide, continuando el ciclo de comparación en el siguiente carácter después. Dormir es casi tan voluntario como el rendimiento de la CPU, por lo que estas llamadas se mostrarán como cambios de contexto voluntarios para cada personaje que no sea mecanizado.En Linux, también debería poder ver las llamadas
strace
.El retraso final proviene de un sueño aleatorio de
T * (rand() % 3)
, es decir, 0, 1 o 2 veces una constante. Esa es una granularidad bastante gruesa, por lo que debería ser fácil promediar haciendo múltiples intentos con la misma contraseña.fuente