Débordement de stack Exploiter en C

La question concerne en fait les débordements de stack en C. J’ai une cession que je ne peux pas terminer à vie, j’ai tout regardé dans le gdb et je ne peux tout simplement pas comprendre.

La question est la suivante:

int i,n; void confused() { printf("who called me"); exit(0); } void shell_call(char *c) { printf(" ***Now calling \"%s\" shell command *** \n",c); system(c); exit(0); } void victim_func() { int a[4]; printf("[8]:%x\n", &a[8]); printf("Enter n: "); scanf("%d",&n); printf("Enter %d HEX Values \n",n); for(i=0;i<n;i++) scanf("%x",&a[i]); printf("Done reading junk numbers\n"); } int main() { printf("ls=736c --- ps = 7370 --- cal = 6c6163\n"); printf("location of confused %x \n", confused); printf("location of shell_call %x \n", shell_call); victim_func(); printf("Done, thank you\n"); } 

Ok, alors j’ai réussi à poser correctement la première question, qui consiste à appeler arbitrairement l’une des deux fonctions non explicitement appelées dans le chemin principal. En passant, cela doit être fait pendant l’exécution du programme sans aucune modification. Je l’ai fait en exécutant le programme, en réglant N sur 7 , ce qui m’amène au pointeur de fonction de la trame victim_func , j’écris a[7] avec l’adresse mémoire confuse ou shell_call , et cela fonctionne. (J’ai une machine 64 bits, c’est pourquoi je dois l’obtenir à 7, car le pointeur EBI est large de 2 pouces au lieu de 1)

Ma question est la suivante: comment puis-je contrôler quel argument est transmis à la fonction shell_code ? c’est à dire. comment puis-je écrire une ssortingng à char* c . Le but est d’exécuter des commandes unix comme ps etc, en n’exécutant que le programme.

Je pensais écrire le pointeur EBI avec la représentation hexadécimale de ps et définir la liste arg de shell_call , mais cela ne fonctionnait pas. J’ai également essayé de saisir des arguments argsv et de définir la liste arg de shell_call sur la liste arg_list de main, mais cela ne fonctionnait pas non plus.

Je pense que la deuxième version devrait fonctionner, mais je crois que je ne mets pas correctement la liste arg du nouveau cadre de la stack (je l’ai fait en écrivant a[8] à 0 , car c’est la première partie du pointeur de la fonction, et en écrivant a[9]=736c et a[10]=0000 , mais ce n’est probablement pas correct car ce sont les parameters de victim_func . Alors, comment puis-je accéder aux parameters de shell_call ?

    Je ne devrais probablement pas faire tes devoirs pour toi. Mais le fondamentalement:

    Vous devez vous procurer un tampon de caractères quelque part en mémoire pour stocker la chaîne que vous souhaitez exécuter. Évidemment, vous pouvez le faire de la même manière que vous appelez les autres fonctions (c’est-à-dire que vous mettez également le texte sur la stack). Une fois que vous avez écrit cela, vous devez écrire un pointeur dessus sur la stack à l’emplacement où la fonction shell_code s’attend à trouver ses arguments.

    La meilleure façon de résoudre ce problème sans que je fasse tout le travail à votre place est d’écrire le contenu de votre stack / mémoire sur un morceau de papier / un tableau blanc. Ecrivez à quoi cela ressemblerait si vous appeliez shell_code normalement depuis le programme. Ensuite, écrivez ce que la stack ressemble à l’intérieur de victum_func et déterminez les choses à changer pour qu’elle ressemble “naturellement” (bien sûr, gardez à l’esprit que certaines choses sont “indifférentes” comme l’adresse de retour).

    C’est toute la charité que vous allez recevoir de moi aujourd’hui! 😛

    SoapBox a déjà fait un excellent travail pour vous guider dans la bonne direction.

    Pour plus d’informations; http://www.skullsecurity.org/wiki/index.php/Example_4

    Vous devez manipuler le cadre de stack de l’appelant ( main() ), et l’arranger de manière à ce que le retour à shell_call() partir du journal de l’épilogue de la victim_func() débordée victim_func() puisse trouver une stack réglée telle qu’elle a été appelé par le principal.

    Ce faisant, vous devrez probablement modifier le pointeur de l’image dans l’image de stack de la victime. Celui-ci sera restauré dans% ebp au moyen d’un leave .