2014-07-06 5 views
1

Avant de créer ce post j'ai essayé et lu tous les précédents Q & A mais ils ne semblent pas répondre à ma question exacte .J'ai pointé EIP à l'adresse ESP et mis mon shellcode dans ESP avec succès, mais je reçois un défaut SIGSEGV, Segmentation

Je fais aussi référence au guide sur le lien ci-dessous, mais il me manque quelque chose de crucial.

https://www.corelan.be/index.php/2009/07/19/exploit-writing-tutorial-part-1-stack-based-overflows/

Voici ce que je l'ai fait jusqu'à présent, il y a un dépassement de mémoire tampon dans le programme et j'ai compris l'offset (à l'aide des outils) pour EIP msf et EBP. Il est 267 et 263 respectivement.

Le programme me demande d'entrer "42" comme première entrée, puis il demande une autre question où je peux donner A * 264 pour déborder le tampon. Ci-dessous la charge utile que j'utilise, elle comprend la chaîne 42, un tas de chariots NOP (263 précisément), préservant la valeur EBP, le décalage mémoire ESP (0xbffff480) à écraser sur EIP et mon shellcode.

http://pastebin.com/g4kK2pC8

Après avoir exercerai ci-dessus, dans gdb quand je vois les valeurs de l'ESP et EIP sont les mêmes à savoir 0xbffff480

C'est là que je l'ai mis mon shellcode et EIP pointe cela. Mais, pourquoi mon shellcode n'est-il pas exécuté? Il échoue avec "Program received signal SIGSEGV, Segmentation fault".

Je ne sais pas où je vais mal. Donc, mon idée de pointage/écrasement EIP à la valeur ESP est faux? Ou quelque chose à faire avec mon shellcode? Comment puis-je écrire un simple shellcode/payload qui imprime quelque chose par exemple ou simplement vérifier si l'exécution est en cours?

Mise à jour:

J'ai utilisé le script checksec.sh pour vérifier si le binaire a NX activé et ci-dessous est la sortie que je suis arrivé.

RELRO   STACK CANARY  NX   PIE    RPATH  RUNPATH  FILE 
Partial RELRO No canary found NX enabled No PIE   No RPATH No RUNPATH output 

Est-ce que cela signifie que je ne peux pas exécuter mon shellcode? Je dois juste me concentrer sur l'évitement/contournement de NX? - Le RELRO partiel fait-il une différence?

+0

Le binaire est-il activé par DEP ou ASLR? – drum

+0

Etes-vous sûr d'avoir un shellcode fonctionnel? – drum

+0

Merci pour la réponse rapide @drum. Comment puis-je vérifier si elles sont activées? Aussi, comment puis-je tester mon shellcode, j'ai utilisé msfpayload pour en générer un et je suppose que cela fonctionne. 'code'msfpayload linux/x86/exec CMD =/bin/sh R | msfencode -b \ x00 \ xff -t c> shellcode – h4xorhead

Répondre

1

Edit: Je viens de remarquer votre sortie checksec, vous aurez donc besoin de compiler avec:

gcc -z execstack 

Il est difficile sans regarder la mémoire dans le débogueur, mais le problème peut être que votre shellcode a besoin de plus d'espace pour se décoder. Le shellcode encodé (je vois que vous le faites avec msfencode), devra être décodé avant que la charge utile prévue (dans votre cas linux/x86/exec) puisse être exécutée. Le processus de décodage remplacera typiquement une partie de l'espace mémoire avant celui-ci, donc s'il n'y a pas suffisamment d'espace inscriptible pour que cela se produise, des problèmes peuvent se produire (c'est-à-dire des fautes de segmentation). Donc, dans l'exemple ci-dessous, nous verrons la mémoire d'écrasement du décodeur au-dessus de 0x00000008 (des applications si cela ne ressemble en rien à votre tampon car je ne peux pas voir pastebin d'où je suis).

0x0400001C 41 41 41 41 
0x04000018 41 41 41 41 
0x04000014 41 41 41 41 
0x04000010 41 41 41 41 
0x0400000C 55 55 55 55 <-- Return address 
0x04000008 12 34 56 78 <-- Start of shellcode 
0x04000004 90 12 34 56 
0x04000000 78 90 12 34 

Essayez préfixer votre shellcode avec une interruption (« \ xCC »), puis l'étape à travers le shellcode gdb pour voir ce qu'il se passe.

Vous pouvez ensuite essayer d'ajouter des NOP ("\ x90") entre votre adresse de retour et le début de votre shellcode. Je recommande de commencer par 32.

Faites-moi savoir si cela ressemble à un problème.

1

Vous devez suivre ces étapes afin de créer un exploit fonctionnel: 1- déterminer le décalage en utilisant pattern_create/offset.rb 2- Écraser EIP avec quoi que ce soit comme « BBBB » 3- mis quelques NOP après la pointe 4- mettre le shellcode après les NOPs 5- rechercher une commande dans le programme tel que "jmp esp" ou "call esp" (vous pouvez lire cet article: https://www.corelan.be/index.php/2009/07/23/writing-buffer-overflow-exploits-a-quick-and-basic-tutorial-part-2/) 6- remplacer l'eip avec l'adresse du commande 7- boom! shellcode exécuté

Questions connexes