Eu tenho um arquivo binário e devo quebrar sua senha (lição de casa). Também havia uma função fornecida (uma função que faz parte do arquivo binário). Essa função mostrou que a string de entrada foi comparada com o caractere de senha correto por caractere e retornou falso instantaneamente quando um caractere estava errado (isso não é uma maneira segura de fazê-lo, acho que porque está perdendo tempo e temos uma ideia do tamanho correto da senha como exemplo). Mas nosso professor adicionou um temporizador aleatório que retorna o resultado (Correto / Errado) para tornar um pouco mais difícil para nós ...
De qualquer forma, eu já fiz isso com sucesso com engenharia reversa e obtive a senha correta. Agora estou brincando com ele na linha de comando:
/usr/bin/time -v ./program_name enter_password
Com esse comando, recebo muitas informações, como hora do sistema, swaps, tempo de execução. Mas o que é mais interessante para mim é "Opções de contexto voluntárias" porque, quanto mais caracteres corretos da senha eu digito, menos "Opções de contexto voluntárias " Eu recebo!
Quanto mais caracteres errados eu digitar, mais "opções de contexto voluntárias" eu recebo.
Levei quase duas horas para decifrar a senha apenas digitando esse comando, digitando caracteres e observando "Voluntary context switches". Sempre que UM caractere estava correto, o "Voluntary context switches" diminuía um.
Minha pergunta, o que exatamente são "opções de contexto voluntárias" e por que elas me ajudaram a decifrar a senha?
fonte
Respostas:
A página do manual
time
explica o conceito de alternância de contexto voluntária e involuntária:(a citação é do meu sistema Debian, a página de manual vinculada tem um texto ligeiramente diferente)
Ou seja, uma troca de contexto é voluntária, se o processo sair da CPU, porque não há mais nada a fazer (enquanto aguarda que algo externo aconteça). Involuntário, se desejar continuar com alguns cálculos, mas o sistema operacional decide que é hora de mudar para outro processo.
Como tudo isso está relacionado ao programa de verificação de senha, depende do que o programa realmente faz.
A partir do código fonte vinculado nos comentários, vemos que o programa chama
usleep()
uma vez para cada caractere não correspondente, continuando o ciclo de comparação no próximo caractere posteriormente. Dormir é tão voluntário quanto produzir a CPU, portanto, essas chamadas serão mostradas como alternâncias voluntárias de contexto para cada caractere que não seja de maching.No Linux, você também poderá ver as chamadas
strace
.O atraso final vem de um sono aleatório de
T * (rand() % 3)
, isto é, 0, 1 ou 2 vezes uma constante. Essa é uma granularidade bastante grossa, portanto deve ser fácil calcular a média fazendo várias tentativas com a mesma senha.fonte