Pourquoi je ne reçois “Ne peut pas trouver de limite actuelle de la fonction” quand j'ai remplacer le ret adresse vulnérables programme?
Je veux exploiter une pile en fonction de dépassement de mémoire tampon pour les fins de l'enseignement.
Il est typiquement une fonction appelée avec un paramètre de la principale, qui est donnée en entrée à partir du programme d'un tampon local où le paramètre est enregistré. Compte tenu de l'entrée de telle sorte que nops+shellcode+address_shellcode
, je vais l'exploiter.
Après le débogage à l'aide de gdb, j'ai trouvé l'adresse de la coquille de code que ça va passer comme paramètre, et juste après la strcpy
j'examine la pile et de la $ebp+8
qui est l'adresse de retour a réussi remplacé par l'adresse de la coquille de code. Donc, j'ai ce que je veux. Mais quand j'ai pris avant l'exécution j'ai eu:
->shellcode_address in ?? ()
et puis
Cannot find bound of current function
L'adresse de retour a la valeur que je veux. Toutes les idées de ce qui se passe?
Aussi, quand j'execute, j'ai eu une erreur de segmentation et j'ai compiler avec -g -fno-stack-protector
. Pourquoi?
Comment pourrais-je ajouter les informations de débogage pour l'instruction nop, qui est suivie par d'autres opr, et à la fin avec le shellcode?
Je ne sais pas exactement comment gdb fonctionne, mais je pense que vous ne pouvez pas. gdb recherche l'adresse du pointeur d'instruction dans sa bonne vieille table de debug info, qu'il a chargé de la exécutables, il sait à ce sujet. Mais le pointeur d'instruction est sur la pile, il n'est pas couvert par aucune des informations de débogage. Peut-être en théorie, vous pourriez synthétiser un NAIN de données autour de la pile actuel de l'adresse et de la charge que dans le gdb, mais je n'ai aucune idée de comment.
Je ne le pense pas. Il d'une simple pile de dépassement de les exploiter. Il me manque qqch d'autre
OriginalL'auteur curious | 2012-01-05
Vous devez vous connecter pour publier un commentaire.
Le débogueur a des connaissances sur l'endroit où le code pour les fonctions dans votre programme de début et de fin, soit parce que cette information est fournie dans les données de débogage ou parce qu'il utilise des signes extérieurs visibles dans le fichier exécutable afin de fournir rudimentaire de l'information.
Lorsque la pile est en bon état, il contient une adresse de retour à la fonction appelante et, quelque part au-dessus, une adresse de retour à un niveau supérieur d'appel de la fonction, et ainsi de suite. Pendant que vous êtes l'exécution de différentes commandes du débogueur, il utilise ces adresses de retour (et d'autres renseignements sur la pile et dans l'état de la procédure) pour vous montrer les noms de ces fonctions. Cela nécessite de recherche de l'adresse de retour dans le débogueur de la connaissance où les fonctions.
Une fois que vous débordement de tampon et la corruption de la pile l'adresse de retour est détruit. Au lieu de cela vous avez une adresse différente (l'un pointant vers votre shellcode si votre exploit a travaillé). Lorsque le débogueur, essaie de comprendre la fonction de cette adresse est en, il ne parvient pas, parce que l'adresse n'est pas dans toutes les fonctions de votre programme.
Lorsque cette erreur se produit, le débogueur affiche le message d'erreur que vous voyez.
Généralement, le débogueur peut toujours effectuer des fonctions de base: Il peut vous montrer des registres et de la mémoire dans votre programme, il peut encore en une seule étape et de définir des points d'arrêt, et ainsi de suite. Il aura de la difficulté à faire des choses qui nécessitent plus d'une interprétation compliquée: Il ne peut pas comprendre où stack frames sont, il ne peut pas trouver les variables locales par leur nom, et ainsi de suite.
OriginalL'auteur Eric Postpischil
En supposant que votre distribution Linux est récente, et que vous travaillez sur un x86ish architecture, vous ne pouvez plus exécuter shell code de l'utilisateur à partir de l'espace mémoire (cela s'applique également à d'autres architectures, je ne suis pas aussi familier avec eux). Il y a un certain nombre de raisons, dans votre cas, le plus probable que le réglage du bit nx. Aller à votre Linux sécurité des pages de man, et vous verrez un grand nombre de mesures de sécurité par défaut activé; et google "l'écrasement de la pile pour le plaisir en 2011" pour les moyens possibles autour d'elle. Compilation avec '-fno-stack-protector' seul moyen de ne pas fixer des canaries valeur; mais ce n'est pas suffisant. Si vous voulez faire cela pour les fins de l'enseignement, je vous suggérons d'installer une machine virtuelle comme virtualbox, et une vieille distrib.
OriginalL'auteur gnometorule
Vous êtes l'exécution de code sur la pile, et de demander GDB fonction de ce que vous êtes.
Évidemment, GDB est confus, parce que vous n'êtes pas dans n'importe quelle fonction. Donc, il indique l'adresse et les "??"
Vous devez compiler avec -pas-stack-protector, car stack-protector protège-vous exactement ce que vous essayez de faire.
Je ne dis pas qu'il n'y a aucun moyen de le contourner, mais il faut plus d'effort et une bonne compréhension de son mécanisme de protection.
Une fois que vous avez changé l'adresse de retour pour le shellcode, et le retour de l'opération ont sauté là, vous êtes dans le shellcode, et non pas en fonction. Je pensais que vous étiez demander pourquoi vous avez besoin de compiler sans-stack-protector, et répondit.
Il n'y a pas d'autre moyen que de ce que je sais de lancer le shell est autre que remplacer le ret adresse avec l'adresse du shellcode précédent opr instructions.Suis-je tort?
Il existe de nombreuses façons. Vous pouvez varier l'emplacement du shellcode - la pile, le tas, ou même utiliser l'existant, de la libc code ("saut de la libc"). Vous pouvez également utiliser différentes méthodes pour y accéder de dépassement de capacité d'un pointeur de fonction, la VFT (en C++), malloc structures de contrôle. Et le code que vous sauter à peut varier beaucoup. Et un sérieux hacker pourrait ajouter beaucoup beaucoup plus.
Je voulais le passer comme un argument d'entrée de la prog qui serait le paramètre à la fonction vulnérable
OriginalL'auteur ugoren
Vous avez probablement un dépassement de la mémoire tampon problème quelque part, dans la fonction
(ou quelque chose comme ça). Il remplace la pile en cours du cadre de votre fonction
avec les données non pertinentes, et détruit l'adresse de retour dans le processus, ce qui est
normalement stockées, parmi d'autres choses. Le résultat est que le code "renvoie"
pour certains imprévisible emplacement et ne peut pas comprendre d'où il est revenu à.
C'est ce qui provoque le message d'erreur.
OriginalL'auteur Viswesn