Por que o `strip` não remove os cabeçalhos das seções dos executáveis ​​do ELF?

9

Um executável ELF mínimo requer apenas o cabeçalho ELF e pelo menos um cabeçalho do programa para funcionar. No entanto, quando executo strip em um executável curto, ele decide não jogar fora a tabela de cabeçalho da seção ou a seção de strings da seção, mantendo-as por perto, embora elas não tenham nenhum objetivo (tanto quanto eu saiba) para a execução do programa.

Existe uma razão para que eles não sejam removidos por tira? Existe outro utilitário que remove tudo o que não é necessário para a execução do executável? Eu tentei editar manualmente o executável de código de golfe que eu estava criando para remover os cabeçalhos de seção, e parece funcionar bem e ser muito menor.

Mystor
fonte
Não é despojado provavelmente porque ele pode quebrar alguns programas / tempos de execução
gato

Respostas:

3

A documentação para o GNU binutilsstrip alude à razão, mas não é explícita, mencionando na descrição --only-keep-debugdessa

Nota - os cabeçalhos das seções removidas são preservados, incluindo seus tamanhos, mas o conteúdo da seção é descartado. Os cabeçalhos da seção são preservados para que outras ferramentas possam corresponder o arquivo debuginfo ao executável real, mesmo que esse executável tenha sido realocado para um espaço de endereço diferente.

Ou seja, a menos que solicitado explicitamente por meio da -Ropção, stripmanterá os cabeçalhos das seções para ajudar outros programas (inclusive gdb) a fazerem seu trabalho.

A página Uso correto do comando strip (parte da Engenharia Reversa usando o Sistema Operacional Linux ) observa

A execução do stripcomando em um executável é o método de proteção de programa mais comum. Em sua operação padrão, o stripcomando remove a tabela de símbolos e qualquer informação de depuração de um executável. É assim que é normalmente usado. No entanto, ainda há informações úteis que não são removidas.

e continua a enumerar várias coisas úteis que podem ser deixadas para trás - para análise de um executável "despojado".

No Learning Linux Binary Analysis , isso é reiterado, comentando que os cabeçalhos de seção normalmente só estão ausentes quando alguém os removeu deliberadamente , e sem os cabeçalhos de seção gdbe objdumpsão quase inúteis.

Thomas Dickey
fonte