C strings

Na linguagem C foi criado um padrão para saber programaticamente o fim de uma string: ela precisa ser terminada com um byte nulo. Sendo assim, a string ASCII "fernando", se utilizada num programa escrito em C, fica no binário compilado (no .exe final, ou outro formato) da seguinte forma:

66 65 72 6e 61 6e 64 6f 00

É importante não confundir o nullbyte com o caractere de nova linha. Este pode ser o Line Feed (0x0a), também conhecido por \n em sistemas Unix/Linux. Já no DOS/Windows, a nova linha é definida por dois caracteres: o Carriage Return (0x0d) seguido do Line Feed, sequência conhecida pelo jargão CrLf em linguagens como Visual Basic.

Se a string for UTF-16, então dois bytes nulos serão adicionados ao fim. Se for UTF-32, quatro. :-)

O leitor pode estar se perguntando a razão pela qual este conceito é útil ao engenheiro reverso. Bem, no caso de busca de strings num binário compilado, você pode refinar a busca por sequências de bytes na tabela ASCII, usando ou não uma codificação UNICODE (já que os valores ASCII são os mesmos) terminados com por um ou mais nullbytes. Por exemplo, supondo que você esteja buscado a string "Erro" dentro de um programa, o primeiro passo é descobrir quais são os bytes equivalentes na tabela ASCII desta string. Ao invés de usar a tabela, você pode usar o comando hd no Linux:

$ echo -n Erro | hd
00000000 45 72 72 6f |Erro|

Alternativamente, você pode experimentar a função bh_str2hex() do projeto bashacks, disponível para Linux, macOS e Windows 10:

$ bh_str2hex Erro
45 72 72 6f

Agora sabemos que a sequência de bytes a ser procurada vai depender do tipo de string.

  • Em ASCII:

45 72 72 6f

  • Em UTF-16-LE (Little Endian, que é o padrão) ou simplesmente UTF-16:

45 00 72 00 72 00 6f 00

Mas para sermos mais assertivos, caso não haja mais nada depois do "o" da palavra "Erro" no programa, podemos adicionar o nullbyte na busca:

  • Em ASCII:

45 72 72 6f 00

  • Em UTF-16:

45 00 72 00 72 00 6f 00 00 00

Claro que os programas feitos para buscarem texto dentro de arquivos já possuem esta inteligência, no entanto, a proposta deste livro é entender a fundo como a engenharia reversa funciona e por isso não poderíamos deixar de cobrir esta valiosa informação. ;-)

Edit on GitHub