2010-03-08 46 views
4

Je prends une classe en sécurité informatique et il y a une attribution de crédit supplémentaire pour insérer du code exécutable dans un débordement de tampon. J'ai le code source c pour le programme cible que j'essaie de manipuler, et je suis arrivé au point où je peux écraser avec succès l'eip pour le cadre actuel de la pile de fonctions. Cependant, je reçois toujours un défaut de segmentation, car l'adresse que je fournis est toujours fausse. Le problème est que la fonction actuelle est à l'intérieur d'un pthread, et par conséquent, l'adresse de la pile semble toujours changer entre les différentes exécutions du programme. Y at-il une méthode pour trouver l'adresse de la pile dans un pthread (ou pour estimer l'adresse de la pile dans un pthread)? (Remarque: le second argument de pthread_create est null, donc nous n'attribuons pas manuellement une adresse de pile)Pour les dépassements de tampon, quelle est l'adresse de la pile lors de l'utilisation de pthreads?

Répondre

0

Sans en savoir plus sur l'application, c'est un peu difficile à savoir, mais la première chose qui vient à l'esprit est heap spraying.

7

Je suggère de lire l'article/tutoriel excellent (si un peu daté) sur l'exploitation des vulnérabilités de débordement de tampon Smashing The Stack For Fun And Profit.

Voici un bref extrait:

Le problème est que nous ne savons pas où dans l'espace mémoire du programme nous essayons d'exploiter le code (et la chaîne qui suit -ci) être 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'adresse IP actuelle sans avoir besoin de pour connaître l'adresse exacte de l'emplacement dans lequel nous voulons passer.


Vous pouvez récupérer la valeur actuelle du pointeur de la pile avec un peu de montage en ligne. Tous les exemples dans Smashing The Stack For Fun And Profit débordent un tampon dans main, mais vous pouvez tout aussi facilement utiliser les mêmes techniques pour déborder un tampon dans une fonction appelée à partir d'un pthread. Le code ci-dessous est construit sur un exemple de l'article (overflow1.c) pour montrer que les mêmes techniques fonctionneront en utilisant 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; 
} 
+0

je en train de lire cet article. Je vais devoir l'étudier à nouveau, mais cette citation ne faisait-elle pas référence à l'obtention de l'adresse de "/ bin/sh", à l'intérieur du tampon?Ne devons-nous pas encore écraser l'eip pour qu'il pointe vers l'instruction de saut initiale? – t2k32316

+0

L'exemple que l'extrait est en train de générer pour déborder d'un tampon de caractères en utilisant 'strcpy()'. Le débordement écrase l'adresse de retour (adresse IP enregistrée) sur la pile de sorte qu'elle pointe vers une instruction JMP à l'intérieur du tampon. L'instruction JMP saute à l'instruction CALL qui appelle le 'execve()' de/bin/sh, qui a été copié dans le tampon comme shellcode. L'article suggère plus tard rembourrer le front de la mémoire tampon de débordement avec des instructions NOP de sorte que l'adresse de retour doit seulement pointer quelque part dans les NOP. – jschmier

+0

Merci, jschmier, pour toutes vos réponses. Mon TA a mentionné qu'en utilisant pthreads, le programme effectue efficacement la randomisation de pile comme technique de prévention contre les dépassements de tampon. La méthode des instructions JMP et CALL ne fonctionne que lorsque l'adresse de retour a été modifiée pour pointer vers mon code dans le tampon. Cependant, puisque le programme utilise pthreads, je ne sais pas quelle adresse de mémoire utiliser pour écraser l'adresse de retour. – t2k32316