Bonjour à tous,
Tout d'abords, bon courage pour la lecture ! J'espère avoir posté au bon endroit, mais ça je le redirai et et je préciserai pourquoi j'ai choisi la section C.
Premier point :
Je débute un peu en programmation, et je ne parviens pas à m'expliquer techniquement de façon clair le phénomène suivant :
Voici l'idée : dans mon programme, je déclare plusieurs variables, et je souhaite écraser le contenu de l'une d'elle, en lui envoyant une valeur choisie. La variable int uNe = 0 est déclarée avant les autres ; vient ensuite la variable int dEux = ____, puis enfin char tRois[XX].
Mon souhait, c'est d'écraser le contenu de dEux en jouant avec uNe puis tRois - le programme est conçu ainsi, il est prévu pour, il permet justement de comprendre ce que je ne comprends pas - : ce qu'il faut faire, c'est envoyer une valeur qui, selon une condition du programme, va effectuer un décrémentation de uNe. Après quoi on va envoyer les valeurs que l'on souhaite placer dans dEux, ces valeurs étant donnée à tRois qui, grâce aux opérations de décrémentation effectuées sur uNe, vont aller se placer dans dEux.
M'avez-vous suivi ? Tout se base sur un jeu de conditions et de boucles. Je ne peux vous communiquer le code source : c'est un challenge qui exige confidentialité =/
Je débute également en Assembleur et en déboggage, toutefois, je vais essayer d'être le plus clair possible par rapport à ce que je ne comprends pas :
- uNe = 0x00000000 == 00000000 en binaire.
- Je décrémente : uNe = uNe - 1 == 0xFFFFFFFF == 11111111
- Je décrémente encore une fois : uNe = uNe - 1 == 0xFFFFFFFE == 1 0000 0000 ===> Déjà, est-ce correct ?
- Je décrémente encore : uNe = uNe - 1 == 0xFFFFFFFD == 1111 1111 ?...
Il y a donc un problème - voulu - : l'un des bits de ' uNe - 2 ' va être écrit là où il ne faut pas sur la pile. La faille est là : j'utilise cette erreur pour déplacer esp car, comme je l'ai dit, l'une des conditions permet de placer des valeurs dans tRois, sauf que esp ne pointant pas là où il le faudrait à cause de la décrémentation, je pourrai écraser dEux.
C'est ça que je ne comprends pas :
- Cette erreur de bit, en quoi permet-elle de déplacer esp ?? Ça fait trois jours que je planche là-dessus, mais rien à faire. Je vais attaquer une opération de déboggage plus sérieuse pour essayer de comprendre, toutefois comme je débute je galère encore un peu.
- La deuxième décrémentation permet d'obtenir un bit en plus (1 0000 0000), mais je ne vois pas en quoi la troisième permet de déplacer esp de nouveau...
- Je parle de esp, mais je me trompe peut-être ^^
C'est un challenge que j'ai réussi plus par déduction logique que par compréhension technique, et c'est ce qui m'embête justement ^^ Du coup ça fait plusieurs fois qu'on m'explique le concept, j'ai encore des pistes de recherche, donc je vais continuer de bosser ça, mais si quelqu'un pouvait me l'expliquer à travers des schémas, je pense que ça m'aiderait beaucoup. Je fonctionne beaucoup à l'aide de schéma et de captures d'écran (de pile par exemple).
Deuxième point :
Que me conseilleriez-vous pour évoluer de façon considérable en programmation système (C) ? J'utilise des cours .pdf, mais ça trouve vite des limites...du genre "programmer un menu qui ptati patata"...donc en soit, rien qui ne nécessite de syscall ou autre...
Troisième point :
Comme je l'ai dit, j'espère avoir posté au bon endroit ^^ Car de base, le sujet est l'audit d'un code C. D'ailleurs comme je m'intéresse aussi à l'ASM, si vous aviez-vous des ouvrages à me conseillez pour bien comprendre l'Assembleur, je suis preneur. J'ai utilisé des ouvrages .pdf également, toutefois il y avait plus de code balancé comme exemple que d'explications concrètes avec tutoriel.
Merci aux courageux qui liront jusqu'au bout, et aux généreux qui m'aideront'
Partager