Chaîne littérale dans le programme C, peut-elle être trouvée en binary?

Par exemple:

int main(int argc, char *argv[]) { if (strncmp(argv[1], "password")) { printf("Incorrect password\n"); } return 0; } 

Puis-je désassembler le binary de ce programme compilé et voir la chaîne “mot de passe” quelque part dans le binary ou est-elle uniquement visible pendant l’exécution?

Typiquement oui. De plus, vous n’avez rien à “démonter”. La plupart du temps, vous pourrez le voir directement dans le binary compilé en l’ouvrant dans un éditeur de texte ou hexagonal.

Les chaînes ASCII ne subissent aucun codage / décodage spécial, elles apparaissent donc littéralement dans le fichier binary et apparaîtront lorsque le fichier binary est interprété comme un fichier ASCII (le plus souvent avec une apparence louche). Si vous y réfléchissez plus profondément, la seule alternative systématique à leur stockage dans le fichier binary serait un horrible registre central à l’échelle de l’OS, contenant toutes les chaînes de tous les programmes. S’ils étaient stockés dans un fichier séparé, ils pourraient être séparés du binary.

Cependant, le PO semble poser une question plus vaste sur la disposition du code et sur la compilation des données en lecture seule telles que les chaînes. Une façon plus pédagogique de “trouver” la chaîne consiste à visualiser l’étape de compilation intermédiaire d’un assemblage lisible par l’homme, dans laquelle la chaîne sera présentée et référencée par une étiquette. L’éditeur de liens (étape suivante de la compilation) résoudra alors l’étiquette en un décalage numérique à partir du début du fichier binary. Notez l’ .rodata (“section de données en lecture seule”) ci-dessous.

De la page de manuel gcc: -S Arrêtez après la phase de compilation proprement dite; ne pas assembler. La sortie se présente sous la forme d’un fichier de code assembleur pour chaque fichier d’entrée non assembleur spécifié.

Résultats:

  .file "foo.c" .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .ssortingng "password" .LC1: .ssortingng "Incorrect password" .section .text.startup,"ax",@progbits .p2align 4,,15 .globl main .type main, @function main: 

[les instructions en langage d’assemblage suivent]