Je viens d'écrire un code C ci-dessous:
#include<stdio.h> #include<string.h> void func(char *str) { char buffer[24]; int *ret; strcpy(buffer,str); } int main(int argc,char **argv) { int x; x=0; func(argv[1]); x=1; printf("\nx is 1\n"); printf("\nx is 0\n\n"); }
3 Réponses :
Pour ce que je comprends, vous voulez que le code exécute l'instruction Cependant, ce qui pourrait être fait est de faire fonctionner fonctionne () effacer sa propre adresse de retour afin que le code saute directement sur Ceci n'est possible que possible parce que vous envoyez à FUNC () tout ce qui est passé à travers la cmd-ligne et la copie directement à un tampon de taille. Si la chaîne que vous essayez de copier est plus grande, le tampon alloué, vous finirez probablement de corrompre la pile et d'écraser potentiellement l'adresse de retour de la fonction. P> Il existe de superbes livres comme Celui-ci sur le sujet , et je vous recommande de les lire. p> Chargement de votre application sur gdb em> et désassemblant la fonction principale, vous verrez quelque chose de similaire à celui-ci: p> x = 1; code> puis saute sur le principe suivant afin qu'il n'imprime que
x est 0 code>. Il n'y a aucun moyen de le faire. strong>
printf ("\ nx est 0 \ n \ n "); code>. Cela signifie sauter sur
x = 1; code> aussi. P>
echo 0 > /proc/sys/kernel/randomize_va_space
Pouvez-vous expliquer comment vous avez écrit ce qui suit: Imprimez "123456AAAAAAAA" X1 "," \ x49 \ x84 \ x04 \ x08 "
Ce n'est pas possible - ce serait possible, si vous connaissez le compilateur et la manière dont cela fonctionne, le code d'assembleur généré, les bibliothèques usagées, l'architecture, la CPU, l'environnement système et les numéros de loto de demain - et si Vous avez eu cette connaissance, vous seriez assez intelligent pour ne pas demander. Le seul scénario où il serait logique, c'est quand quelqu'un essaie une sorte d'attaque et ne s'attend pas à ce que quelqu'un soit prêt à vous aider avec elle. P>
Je pense qu'il est important de comprendre comment les dépassements de tampon fonctionnent, surtout si vous programmez en C, il est donc important de fournir de l'aide!
Je devais le chercher, mais cela semble être que le consensus général est que les questions de chapeau noir vont bien. Il est impossible d'établir une intention, alors supposez simplement que les questions de sécurité exploitent des objectifs défensives. Voir: ici et ici < / a>.
@Anatolyg: Peut-être que cela ne résulte peut-être pas de dépasser la mémoire tampon, cela dépend de lourdes sur l'architecture usagée - Imagine Harvard Architectures ou un nouveau mécanisme de protection de Stack Smash, le compilateur pourrait l'aligner (ou l'omettez-le complet), de beaucoup de possibilités, de la question sans sens . Dans mes yeux quand il veut savoir quelque chose sur les dépassements de tampon, il devrait lui demander.
Certains États-Unis essaient peut-être de comprendre comment cela fonctionne pour corriger réellement des bugs. Tout le monde n'est pas malveillant.
L'adresse de retour de BTW se débarrasser de la variable et donner l'adresse sur la ligne de commande comme une chaîne hexadécimale. Cela rend un peu plus clair ce que vous essayez de faire et plus facile à déboguer. P> p> Func code> est sur la pile, à proximité de ses variables locales (l'une d'elles est
tampon code>). Si vous souhaitez écraser l'adresse de retour, vous devez écrire au-delà de la fin de la matrice (éventuellement à
tampon [24 ... 27] CODE> mais je suis probablement erronée - pourrait être
tampon [ 28 ... 31] code> ou même
tampon [24 ... 31] code> Si vous avez un système 64 bits). Je suggère d'utiliser un débogueur pour trouver les adresses exactes.
RET CODE> - Vous n'abandonnez rien en l'ayant autour, et cela pourrait confondre vos calculs. P> < p> Notez que ce "buffer dépassement exploit" est un peu difficile à déboguer car
Strcpy code> arrête de copier des trucs lorsqu'il rencontre un octet zéro et que l'adresse que vous souhaitez écrire sur la pile contient probablement un tel octôle . Il sera plus facile de le faire comme ceci: p>
Danger! Ce n'est probablement pas ce que vous voulez faire. Cela vous fera trop de problèmes.
Votre code n'a aucun sens ... qu'essayez-vous de faire?
En dehors du code malveillant, personne n'a besoin de faire ce que vous demandez. S'il vous plaît montez avec un design différent.
Ce n'est pas clair ce que vous voulez faire. Voulez-vous avoir un programme séparé pour faire cela? Parlons-nous de l'exploitation de logiciels? Shellcode? C'est tellement dangereux
Strcpy (tampon, str); code> `
Vous essayez essentiellement d'accomplir quelque chose comme un «retardé» - bonne chance. Et profitez de tous les accidents forcés que vous êtes sur le point de générer tout en essayant de faire ce travail.
Soit vous êtes un débutant, dans ce cas, recherchez
si code> dans un bon livre de débutants, ou si vous essayez de faire quelque chose de très intelligent. Malheureusement, des choses extrêmement intelligentes ne sont jamais, jamais intelligentes à long terme.
Essayez-vous de faire quelque chose de similaire à Ce ?
@Santosh était cette question à laquelle répondit-il?