Je suis simplement en train d'expérimenter mais j'ai trouvé un phénomène que j'apprécierais beaucoup si quelqu'un pouvait essayer de l'expliquer.
J'écris un programme simple Hello World en C. gcc
compiler ce programme dans un hello
Unix Executable File, et peut l’exécuter en utilisant ./hello
. Soigné.
J'ouvre cette hello
file, pour voir une série de 4 segments de caractères (si quelqu'un veut ajouter une description technique de ce que je vois ici, je ne me plaindrais pas.).
Ma question est la suivante: comment se fait-il que je copie et colle tous ces segments hexadécimaux dans un fichier séparé, appelons test
, et utilise chmod +x test
, Je n'ai pas les mêmes résultats ./test
comme je cours ./hello
?
Voici mon programme C:
#include <stdio.h>
int main(void)
{
int a;
a = 5;
printf("Memory address: %p\n", (void*) &a);
return 0;
}
puis compilé en (20 premières lignes seulement ...)
cffa edfe 0700 0001 0300 0080 0200 0000
1000 0000 1005 0000 8500 2000 0000 0000
1900 0000 4800 0000 5f5f 5041 4745 5a45
524f 0000 0000 0000 0000 0000 0000 0000
0000 0000 0100 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 1900 0000 2802 0000
5f5f 5445 5854 0000 0000 0000 0000 0000
0000 0000 0100 0000 0010 0000 0000 0000
0000 0000 0000 0000 0010 0000 0000 0000
0700 0000 0500 0000 0600 0000 0000 0000
5f5f 7465 7874 0000 0000 0000 0000 0000
5f5f 5445 5854 0000 0000 0000 0000 0000
300f 0000 0100 0000 3800 0000 0000 0000
300f 0000 0400 0000 0000 0000 0000 0000
0004 0080 0000 0000 0000 0000 0000 0000
5f5f 7374 7562 7300 0000 0000 0000 0000
5f5f 5445 5854 0000 0000 0000 0000 0000
680f 0000 0100 0000 0600 0000 0000 0000
680f 0000 0100 0000 0000 0000 0000 0000
Je copie ce fichier exactement comme avec un éditeur de texte.
En regardant en utilisant diff
, Je réalise qu'il y a une différence binaire?
fonctionnement ./test
renvoie: (20 premières lignes à nouveau)
./test: line 1: cffa: command not found
./test: line 2: 1000: command not found
./test: line 3: 1900: command not found
./test: line 4: 524f: command not found
./test: line 5: 0000: command not found
./test: line 6: 0000: command not found
./test: line 7: 0000: command not found
./test: line 8: 5f5f: command not found
./test: line 9: 0000: command not found
./test: line 10: 0000: command not found
./test: line 11: 0700: command not found
./test: line 12: 5f5f: command not found
./test: line 13: 5f5f: command not found
./test: line 14: 300f: command not found
./test: line 15: 300f: command not found
./test: line 16: 0004: command not found
./test: line 17: 5f5f: command not found
./test: line 18: 5f5f: command not found
./test: line 19: 680f: command not found
./test: line 20: 680f: command not found
Réponses:
Les codes hexadécimaux représentent des octets avec ces valeurs de caractère.
Ce qui suit montre les caractères réels (notez que tous ne sont pas des caractères imprimables à copier et coller):
Ce qui suit va rediriger la sortie de
./hello
à./test
Remarque: Ce qui suit copie explicitement l'exécutable:
la source
cat
La commande affiche le caractère représenté par la valeur de chaque octet.Laissez-moi vous montrer la première partie du programme de travail.
Les 16 premières valeurs de votre programme de travail sont:
cf
est hexadécimal pour le nombre 207.fa
est hex pour le nombre 250(Voir http://en.wikipedia.org/wiki/Hexadecimal pour plus d'informations).
Si vous ne faites que couper et coller cette ligne, vous en copiez une représentation et non les valeurs réelles.
Si vous les coupez et les collez dans un nouveau fichier, cela équivaut à avoir une flèche dans le code, ce qui le traduit en lettres.
'a r r o w'
et copier la traduction. Au cours du processus, les informations sont modifiées et vous n’avez plus de programme opérationnel.Ce que vous avez n’est rien d’autre qu’un fichier texte. Et apparemment, votre système essaie d’interpréter cela comme un script shell lorsque le bit exécutable est défini mais que ELFE en-tête ou case l'interprète est présent.
la source