8
votes

C code Comment changer l'adresse de retour dans le code?

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");
}


8 commentaires

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); `


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 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?


3 Réponses :


17
votes

Pour ce que je comprends, vous voulez que le code exécute l'instruction 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>

Cependant, ce qui pourrait être fait est de faire fonctionner fonctionne () effacer sa propre adresse de retour afin que le code saute directement sur printf ("\ nx est 0 \ n \ n "); code>. Cela signifie sauter sur x = 1; code> aussi. P>

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>

echo 0 > /proc/sys/kernel/randomize_va_space


1 commentaires

Pouvez-vous expliquer comment vous avez écrit ce qui suit: Imprimez "123456AAAAAAAA" X1 "," \ x49 \ x84 \ x04 \ x08 "



-4
votes

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.


4 commentaires

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.



2
votes

L'adresse de retour de Func est sur la pile, à proximité de ses variables locales (l'une d'elles est tampon ). Si vous souhaitez écraser l'adresse de retour, vous devez écrire au-delà de la fin de la matrice (éventuellement à tampon [24 ... 27] mais je suis probablement erronée - pourrait être tampon [ 28 ... 31] ou même tampon [24 ... 31] Si vous avez un système 64 bits). Je suggère d'utiliser un débogueur pour trouver les adresses exactes.

BTW se débarrasser de la variable RET - Vous n'abandonnez rien en l'ayant autour, et cela pourrait confondre vos calculs. < p> Notez que ce "buffer dépassement exploit" est un peu difficile à déboguer car Strcpy 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: xxx

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.


0 commentaires