¿Qué son exactamente los "cambios de contexto voluntarios"?

34

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?

cnmesr
fuente
55
Felicitaciones por descubrir por sí mismo el campo rico y aún no completamente comprendido de los ataques de canal lateral .
zwol
1
@zwol ¿Qué quieres decir con "rico"? Y, además, estamos tratando con ataques de canal lateral en la clase, perdón que no tengo "entiende completamente" su campo tan rápido ....
cnmesr
15
@cnmesr Lo tomé como un comentario sincero, no sarcástico, diciendo que zwol considera que el campo es interesante ya que todavía se están haciendo nuevos descubrimientos. No es que no lo haya entendido completamente, es que nadie lo entiende completamente, y eso es lo que lo hace interesante.
hvd
3
@hvd cnmesr Sí, eso es lo que quise decir.
zwol
@zwol Oh, lo siento, entonces! Te malinterpreté y lo vi como un ataque: p
cnmesr

Respuestas:

36

La página del manualtime explica el concepto de cambios de contexto voluntarios e involuntarios:

The resource specifiers [...] are:
   c      Number of times the process was context-switched involuntarily
          (because the time slice expired).
   w      Number of times that the program was context-switched voluntarily, 
          for instance while waiting for an I/O operation to complete.

(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.

ilkkachu
fuente
3
Aquí está el código fuente de la función que mencioné anteriormente pastebin.com/iTzheD4u Gracias, echaré un vistazo a las llamadas con strace y espero obtener más información. Acerca del temporizador aleatorio: si la contraseña tiene una longitud incorrecta, el tiempo de salida es el mismo (muy, muy rápido) y el temporizador aleatorio no se ejecuta. Si la longitud de la contraseña es correcta, la salida es aleatoria porque se ejecuta un temporizador aleatorio.
cnmesr
@cnmesr, ¡oh, eso es excelente!
ilkkachu