HowTo :: Patch em binários no Linux

Introdução

Aprenda a aplicar patches em arquivos binários diretamente sem código-fonte usando edição hexadecimal e ferramentas de diff binário; essencial para corrigir bugs, aplicar patches de segurança ou modificar executáveis.

O Que é Patching de Binários?

Patching de binários é o processo de modificar arquivos executáveis compilados sem acesso ao seu código-fonte. Esta técnica é útil para:

Em vez de editar código-fonte de alto nível e recompilar, você modifica diretamente os bytes de código de máquina no arquivo executável. Isso requer compreensão de representação hexadecimal e formatos de arquivo executável.

O Que Você Vai Precisar

Método 1: Usando xxd (Edição Hexadecimal)

O comando xxd cria representações hexadecimais de arquivos binários que você pode editar com editores de texto, e então converter de volta para binário.

Passo 1: Converter Binário para Hex

Primeiro, crie dumps hexadecimais dos arquivos binários com os quais você quer trabalhar:

1
xxd prog1.bin > b1.hex

Isso converte prog1.bin em um formato hexadecimal legível salvo em b1.hex.

Exemplo de formato de saída:

1
2
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
00000010: 0200 3e00 0100 0000 7010 4000 0000 0000  ..>.....p.@.....

Cada linha mostra:

Passo 2: Editar o Arquivo Hex

Agora você pode editar b1.hex com qualquer editor de texto. Modifique os valores hexadecimais nas colunas do meio:

1
2
3
vim b1.hex
# Ou use seu editor preferido
nano b1.hex

Exemplo de modificação: Altere opcodes de instrução, valores de string, ou endereços de salto editando os bytes hexadecimais.

Passo 3: Converter Hex de Volta para Binário

Após editar, converta o arquivo hexadecimal de volta para binário:

1
xxd -r b1.hex new_prog1.bin

A flag -r diz ao xxd para reverter a conversão (hex para binário).

Passo 4: Comparar Binários Usando Diffs Hexadecimais

Para ver o que mudou entre duas versões, crie dumps hexadecimais de ambas e compare:

1
2
3
xxd prog1.bin > original.hex
xxd new_prog1.bin > modified.hex
diff original.hex modified.hex

Ou use vimdiff para comparação visual:

1
vimdiff original.hex modified.hex

Isso mostra exatamente quais bytes mudaram, facilitando documentar ou reverter suas modificações.

Método 2: Usando bsdiff (Patches Binários)

A ferramenta bsdiff cria e aplica arquivos de patch binários, úteis para distribuir modificações sem compartilhar binários inteiros.

Passo 1: Instalar bsdiff

Se ainda não estiver instalado:

1
2
sudo apt install bsdiff      # Debian/Ubuntu
sudo yum install bsdiff      # Fedora/RHEL

Passo 2: Criar um Patch Binário

Gere um arquivo de patch de uma versão antiga e nova de um binário:

1
bsdiff old_prog.bin new_prog.bin patch.bin

Isso cria patch.bin, que contém apenas as diferenças entre os dois arquivos; muito menor que distribuir o novo binário inteiro.

O que isso faz:

Passo 3: Aplicar um Patch Binário

Para aplicar um arquivo de patch ao binário original:

1
bspatch old_prog.bin output.bin patch.bin

Isso aplica as modificações de patch.bin a old_prog.bin, criando output.bin que corresponde a new_prog.bin.

Casos de uso:

Passo 4: Verificar o Resultado

Sempre verifique que o binário com patch corresponde às expectativas:

1
2
3
4
5
6
7
8
# Comparar tamanhos de arquivo
ls -lh old_prog.bin output.bin new_prog.bin

# Verificar integridade do arquivo se você tiver checksums
sha256sum old_prog.bin output.bin new_prog.bin

# Testar funcionalidade
./output.bin --version

Exemplo Prático: Aplicando Patch em um Binário Simples

Aqui está um fluxo de trabalho completo para aplicar patch em um binário para mudar uma string:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 1. Criar backup
cp myprogram.bin myprogram.bin.backup

# 2. Converter para hex
xxd myprogram.bin > myprogram.hex

# 3. Procurar a string que você quer mudar
grep -n "Hello" myprogram.hex

# 4. Editar o arquivo hex (mudar os bytes)
vim myprogram.hex
# Encontre a linha com "Hello" e mude para "Hallo" (ou o que couber)

# 5. Converter de volta para binário
xxd -r myprogram.hex myprogram_patched.bin

# 6. Tornar executável
chmod +x myprogram_patched.bin

# 7. Testar
./myprogram_patched.bin

Solução de Problemas

Melhores Práticas

Próximos Passos

Agora que você entende patching de binários:

  1. Aprenda assembly: Leia Syscalls do Linux em Assembly para entender o que você está modificando
  2. Domine o GDB: Use GDB para inspecionar binários e encontrar locais de patch
  3. Estude formato ELF: Aprenda sobre estrutura de arquivo executável para aplicar patches com segurança
  4. Pratique com CTFs: Desafios Capture The Flag frequentemente requerem habilidades de patching de binários

Veja Também