2015-11-20 2 views
0

J'essaye d'effectuer un débordement de tampon pour changer l'appel de la fonction A à la fonction B. Est-ce que c'est possible? Je sais que je vais devoir déterminer combien d'octets je dois entrer jusqu'à ce que j'ai le contrôle sur le pointeur de retour, et comprendre l'adresse de la fonction B. Est-il possible de le modifier de sorte qu'après "x == 10" nous injectons l'adresse de la fonction B au lieu de la fonction A? Editer: Est-il possible qu'après l'appel de fillbuff, au lieu de retourner à main, nous l'envoyions à la fonction B? Tous les indices sont appréciés.buffer overflow exploit changement fonction appel

int fillBuff(int x){ 
    char buff[15]; 
    puts("Enter your name"); 
    gets(buff); 
    return(x + 5); 
} 

void functionA(){ 
    puts("I dont want to be here"); 
    exit(0); 
} 
void functionB(){ 
    printf("I made it!"); 
    exit(0); 
} 


int main(){ 
    int x; 
    x = fillbuff(5); 
    if (x == 10){ 
     functionA(); 
    } 
} 
+0

vous devriez mettre void dans les paramètres accolades de fonctions si elles sont déclarées sans paramètres, soit dit en passant. Les laisser vides ne signifie pas de paramètres. –

+0

Voir cette réponse: http://stackoverflow.com/a/27214515/3846218 – AlexPogue

Répondre

2

Voici un article qui montre comment le faire: http://insecure.org/stf/smashstack.html.

compilez votre programme comme celui-ci: gcc -g -c program.c (avec le -g) et exécuter gdb ./a.out. Ensuite, exécutez la commande disas main. Vous devriez voir le démontage de votre code et comment il est organisé dans votre mémoire. Vous pouvez remplacer la fonction main par n'importe quelle autre fonction et voir son code. Pour plus d'informations sur voir désassembler: https://sourceware.org/gdb/onlinedocs/gdb/Machine-Code.html

enter image description here

Exécution GDB et désassembler les fonctions sur mon ordinateur, l'adresse de functionA() est 0x400679 et l'adresse de functionB() est 40068a. Si vous voyez le code de démontage de la fonction principale, il y a un appel à l'adresse 0x400679, et ce que vous voulez est de le changer en 40068a. Fondamentalement, vous devez déborder le tampon dans la fonction fillBuff et après avoir atteint l'espace du pointeur, vous devez remplir avec l'adresse. L'article montre comment le faire.

+0

Si vous allez utiliser un débogueur, ollydbg/EDB (en fonction de votre système d'exploitation) sont un peu mieux adapté à ce genre de chose, depuis ils ont un GUI qui affiche les valeurs de registre et de mémoire et met en évidence lorsque ces valeurs sont modifiées. Si vous envisagiez simplement d'utiliser GDB pour vider l'assemblage et ne pas le franchir, cela n'a pas vraiment d'importance. –

+1

Oui, le DDD (https://www.gnu.org/software/ddd/) est un frontal pour le débogueur GDB en ligne de commande. – ViniciusArruda

+0

Merci. C'était extrêmement utile – Nych

0

Dépassements de tampon sont un comportement non défini en C. Rien est garanti pour se produire lorsque vous dépassement de mémoire tampon, et pour autant que je sache la langue ne nécessite pas une mise en page de mémoire spécifique pour les variables locales et/ou stockées retourner les adresses. En plus de cela, certains compilateurs insèrent des protecteurs de pile pour rendre les attaques de dépassement de tampon plus difficiles.

Si vous souhaitez avoir un comportement défini, vous devrez examiner l'assemblage produit et déterminer ce qu'un dépassement de tampon va faire. En fonction de l'assemblage produit, vous pouvez déterminer la disposition de la pile et la disposition de l'adresse et essayer d'écraser l'adresse de retour avec une adresse de fonction différente.

Si vous utilisez GCC, l'option de ligne de commande pour imprimer l'ensemble est -Wa,-al. Si vous voulez la syntaxe Intel, ajoutez -masm=intel.