Pular para o conteúdo
Todos os conceitos

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.

o programa, lido de dentro para fora c[::-1] ord(x) + 1 boi iob 105 111 98 106 112 99 == ALVO - 1 em letras desinverte sem este passo: iob, recusado você desfaz, do último passo para o primeiro
O programa inverte o código, troca cada letra pelo número ASCII e soma 1; desfazendo do último passo para o primeiro, 106 112 99 volta a boi, e quem pula o último passo fica com iob.

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.

Aparece nestes desafios