2013-02-09 6 views
1

Je trouve cette source dans le livre de Jon Erickson, Hacking: The Art of Exploitation,C, appel système écrire, écrire int

userid = getuid(); // get the real user ID 
// Writing data 
if(write(fd, &userid, 4) == -1) // write user ID before note data 
    fatal("in main() while writing userid to file"); 
write(fd, "\n", 1); // terminate line 

j'ai essayé de compiler ce code, et a constaté que sur le fichier que j'écris, userid (ce que J'écris dans le code ci-dessus) n'est pas juste; ils ont juste écrit un personnage étrange (je pense qu'il n'est pas important de l'écrire ici). Donc, le problème est que j'essaie de passer un int à une fonction qui nécessitait char *, à cause de cela le résultat sur le fichier que je veux écrire est faux.

Donc c'est un bug, non?

+3

'write (fd, & userid, 4)' écrit la représentation binaire dans le fichier. Votre éditeur de texte ne le comprendra pas. –

+0

utilise 'man write' (ou google it). L'appel système 'write' prend un' const void * ', pas un' char * '. C'est un problème avec la représentation binaire (c'est-à-dire que votre entier n'est pas encodé en char) et non l'entier. – RageD

Répondre

5

La fonction write() attend un void * pour son tampon; il écrit des données binaires arbitraires. Si vous avez besoin d'une conversion en chaîne, utilisez printf().

Vous ne montrent pas la déclaration de userid, mais la ligne write() doit être écrit comme:

if (write(fd, &userid, sizeof(userid)) != sizeof(userid)) 

Ce détectera court écrit (peu susceptible d'être un problème pour un type entier) et d'autres problèmes, et fonctionne correctement quel que soit le type de userid. La version originale de la ligne est discutable, par conséquent. Sinon, le bug semble être dans vos attentes plutôt que le code en soi.

2

Non, ce n'est pas un bogue, c'est plutôt un malentendu de votre part. L'appel write va juste écrire ce qui est en mémoire, la représentation binaire. Vous auriez besoin de quelque chose comme fprintf pour obtenir une version lisible.

Par exemple, la représentation binaire de 7 peut être les quatre octets 0, 0, 0 et 7, qui sont peu susceptibles de ressembler à la représentation textuelle, un seul octet 55 (en supposant ASCII).

C'est également une mauvaise idée de coder en dur les longueurs de type 4 pour un nombre entier puisque ce n'est pas portable. Mieux serait d'utiliser quelque chose comme sizeof(userid).

+0

merci, je l'ai eu. Il n'y a pas de bug sur ces sources code.it juste écrire ce que dans la mémoire. qui est 4 bits (la taille normale d'un integer