Ler código à mão
Seguir um programa linha por linha, anotando os valores, para saber o que ele aceita ou faz.
Muitas vezes a resposta está escrita no próprio programa: a regra que confere uma senha, a conta que gera um código. Ler código à mão (em inglês, tracing) é seguir o programa linha por linha, como se você fosse o computador, anotando o valor de cada variável.
Quando o programa confere uma entrada, o caminho mais curto costuma ser andar de trás para a frente: em vez de chutar entradas, você pega a condição final e desfaz cada passo.
Exemplo. Este programa aceita um código:
ALVO = [106, 112, 99]
def confere(c):
return [ord(x) + 1 for x in c[::-1]] == ALVO
Leia de dentro para fora. c[::-1] inverte o texto. ord(x) dá o número de cada letra na tabela ASCII (a = 97). O + 1 soma um. O resultado tem que ser [106, 112, 99]. Desfazendo, do último passo para o primeiro: tire 1 de cada número (105, 111, 98), converta em letras (i, o, b) e desinverta: o código é boi. Quem esquece de desinverter responde iob, e o programa recusa. A ordem dos passos importa, e é aí que se erra.
Dicas que ajudam:
- Escreva uma tabela com uma coluna por variável e uma linha por passo.
- Teste a sua resposta no próprio programa, se puder rodá-lo (
python3 programa.py). - Desconfie de comentários: eles podem estar velhos. Vale o que o código faz.
Isso importa porque é o trabalho de quem analisa programas suspeitos e de quem resolve "crackmes": entender exatamente o que o código faz, sem precisar adivinhar.