Pour les dépassements de mémoire tampon, quelle est l’adresse de la stack lors de l’utilisation de pthreads?

Je prends un cours de sécurité informatique et il y a une assignation de crédit supplémentaire pour insérer du code exécutable dans un buffer overflow. J’ai le code source c du programme cible que j’essaie de manipuler et je suis arrivé au point où je peux écraser avec succès l’eip du cadre de stack de fonctions actuel. Cependant, je reçois toujours une erreur de segmentation, car l’adresse que je fournis est toujours fausse. Le problème est que la fonction actuelle est dans un pthread et que, par conséquent, l’adresse de la stack semble toujours changer entre les différentes exécutions du programme. Existe-t-il une méthode permettant de trouver l’adresse de la stack dans un pthread (ou d’estimer l’adresse de la stack dans un pthread)? (Remarque: le deuxième argument de pthread_create est null, nous n’affectons donc pas manuellement une adresse de stack.)

Je suggère de lire l’excellent article / tutoriel (s’il est un peu démodé) sur l’exploitation des vulnérabilités de débordement de la mémoire tampon Smashing The Stack For Fun And Profit .

Voici un bref extrait:

Le problème est que nous ne soaps pas où dans la mémoire du programme nous essayons d’exploiter le code (et la chaîne qui le suit) sera placé. Une solution consiste à utiliser un JMP et une instruction CALL. Les instructions JMP et CALL peuvent utiliser l’adressage relatif IP, ce qui signifie que nous pouvons passer à un décalage par rapport à l’IP actuelle sans avoir besoin de connaître l’adresse exacte de la mémoire où nous voulons aller.


Vous pouvez récupérer la valeur actuelle du pointeur de stack avec un peu d’assemblage en ligne. Tous les exemples de Smashing The Stack For Fun And Profit débordent d’un tampon dans main , mais vous pouvez tout aussi bien utiliser les mêmes techniques pour déborder d’un tampon dans une fonction appelée depuis un pthread. Le code ci-dessous est basé sur un exemple de l’article ( overflow1.c ) qui montre que les mêmes techniques fonctionneront à l’aide de pthreads. La technique que vous utiliserez dépendra du programme cible que vous essayez d’exploiter.

 /* get value of sp off the stack - not essential to example */ unsigned long get_sp() { __asm__("movl %esp,%eax"); /* equiv. of 'return esp;' in C */ } int foo() { char buffer[96]; /* overflow buffer to overwrite return address */ /* and place code to be executed into buffer. */ ... return 0; } void *thread(void *arg) { printf("thread stack 0x%x\n", get_sp()); foo(); return NULL; } int main(int argc, char **argv) { printf("main stack 0x%x\n", get_sp()); pthread_t t; pthread_create(&t, NULL, thread, NULL); pthread_join(t, NULL); return 0; } 

Sans en savoir plus sur l’application, il est un peu difficile à savoir, mais la première chose qui me vient à l’esprit est l’ épandage en tas .

En plus de ma réponse précédente, vous souhaiterez peut-être également lire ce qui suit:

  • Écrire des exploits de buffer overflow – un tutoriel pour les débutants

  • Une vulnérabilité étape par étape sur le buffer overflow

L’article suivant se concentre plus sur les débordements de tas:

  • w00w00 sur débordement de tas