Apprendre le hacking #4 (suite) // Les pointeurs

in #busy6 years ago

Apprndre le hacking(2).png

Présentation

Et me revoilà dans cet article pour parler d'un sujet sérieux. Les pointeurs. J'ai en réalité déjà écris cet article mais Busy s'est déconnecté et mon article a disparu dans la nature ... J'avais pourtant passé quelques heures à sa rédaction. Mais comme un passionné que je suis, je ne me laisse pas abattre par ça.

Donc nous nous retrouvons pour parler des pointeurs. Un sujet bien compliqué pour la plupart des débutant. Mais vous, vous avez une bonne longueur d'avance. En effet, vous avez déjà utilisé les pointeurs. Le pointeur joue avec la mémoire et les adresses. Nous, nous le faisons depuis le début de ce cours. Cette notion devrait donc passer plus facilement pour vous.

Des pointeurs qui pointent

Regardons pourquoi nous allons toujours avoir besoin de cette notion. Nous savons que chaque variables que nous nous amusons à créer est stockée dans une case mémoire de notre PC. Nous nous sommes même déjà amusés à les chercher avec GDB. Seulement, il va nous arriver de vouloir copier ces variables dans d'autres fonctions de notre code source. Pour cela, les pointeurs sont nés. Ainsi, au lieu de copier un grand bloc mémoire et donc prendre de grandes et précieuses ressources à notre processeur, nous allons faire passer l'adresse de notre variable au début du bloc mémoire en question.

On déclare un pointeurs en mettant une étoile (*) devant le nom de la variable. Vous allez à présent voir ça partout dans nos programme. Créons notre premier programma qui utilise les pointeurs :

Capture.PNG

Ceci va nous donner, après compilation, l'erreur suivante :

Capture.PNG

Bien évidemment, cette faute est voulue, elle va vous empêcher de chercher des heures sur internet. En fait, nous venons de créer un tableau de 20 octets mais ce que nous voulons y stocker dépasse les 20 octets. Il faut donc rajouter de la place.

Capture.PNG

Voilà qui devrait être mieux !

Capture.PNG

Bon, c'est bien beau tout ça mais que fait ce programme ?

Et bien, nous créons un tableau de type char et de 30 octets puis deux pointeurs de type char aussi. On colle ensuite la chaine de caractères dans notre tableau de caractères. Après ceci, on place un pointeur au début de notre tableau. On affiche ce pointeur, ceci nous affiche notre chaîne de caractères. Ensuite, on donne pour valeur à notre deuxième pointeur, le premier plus 3 bytes. On affiche ce pointeur, la chaîne de caractères est affichée mais il nous manque lvo. On ajoute donc à ce pointeur une nouvelle chaîne de caractère et on affiche le tout.

Ainsi expliqué, ce n'est pas très vivace. Je vous invite donc à vous munir de votre débogueur (GDB) et à analyser tout ceci. Commençons par compiler notre programme comme il se doit :

Capture.PNG

Posons à présent un breakpoint après que le programme ait copié la chaîne de caractères dans notre tableau et placé le pointeur au début de ce tableau. Lançons ensuite l'exécution :

Capture.PNG

On voit ici que la chaîne est localisée à l'adresse 0x7fffffffddb0. Retenez bien que ce n'est pas la chaîne qui est stockée dans la variable pointeur mais seulement l'adresse de l'emplacement de où est stockée notre fameuse chaîne. Ici, nous avons seulement son adresse mémoire.

Si nous voulons voir l'adresse de notre variable pointeur, il faut utiliser un nouvel opérateur. Le adress-of, il est représenté par ceci : & et il se place juste devant la variable. Nous pouvons utiliser cette notation aussi bien avec GDB que directement dans notre code source.

Capture.PNG

On y voit que notre pointeur est localisé à l'adresse mémoire 0x7fffffffdda0 et contient l'adresse 0x7fffffffddb0. Nous utillisons beaucoup cette notation dans les programme, même dans les plus simples. Par exemple, stockons l'adresse d'une variable dans un pointeur.

Capture.PNG

Ici, rien de bien drôle mais regardons avec GDB. Posons un breakpoint juste après que le programme est donné l'adresse de la variable à notre pointeur.

Capture.PNG

Regardons la valeur de var :

Capture.PNG

On affiche ensuite l'adresse de où est stockée la valeur de la variable et aussi la valeur pointeur. Les deux nous donnent les même adresses. Donc, notre opération de placer l'adresse de la variable var dans notre pointeur est une réussite.

Capture.PNG

Enfin, on affiche l'adresse mémoire de notre variable pointeur :

Capture.PNG

Il y a un second opérateur que nous pouvons utiliser avec les pointeurs. Celui-ci est l'étoile (*), elle se place devant la variable et va afficher les informations que donnent l'adresse qui est donnée par notre pointeur. Par exemple :

Capture.PNG

Et voilà, j'éspère que le rythme n'est pas trop soutenu et que vous pouvez tous suivre correctement. Je vous conseil de vous renseigner à droite à gauche à propos des pointeurs et surtout de vous entraîner. Ce n'est pas bien compliqué surtout pour vous qui avez à présent l'habitude d'utiliser les adresses mémoire. La semaine prochaine nous terminerons un peu pour ce qui est des bases, ceci nous permettra de commencer à rentrer dans le plus complexe.




Hey ! J'éspère que cette série te plaîs ! N'hésite pas à me le dire en commentaire et aussi à me donner des conseils de rédaction, j'aime partager et apprendre des autres !

Tu peux aussi me suivre sur mes réseaux sociaux afin d'être informé de l'arrivé d'un nouvel article ou d'une nouvelle vidéo :


Coin Marketplace

STEEM 0.17
TRX 0.15
JST 0.028
BTC 60328.18
ETH 2426.92
USDT 1.00
SBD 2.48