2010-01-24 1 views
0

Pour une bibliothèque de threads à levier utilisateur, j'ai besoin de sauter à une fonction en modifiant la valeur du PC stockée dans jmp_buf.Modification d'un PC dans jmp_buf pour passer à une autre fonction

Voici ce que je l'ai écrit:

jmp_buf env; 

void print (void) { 
printf("\nHello World!"); 
} 

static int ptr_mangle(int p) { 
     unsigned int ret; 
     asm(" movl %1, %%eax;\n" 
      " xorl %%gs:0x18, %%eax;" 
      " roll $0x9, %%eax;" 
      " movl %%eax, %0;" 
     : "=r"(ret) 
     : "r"(p) 
     : "%eax" 
     ); 
     return ret; 
    } 


int main() { 
int i = setjmp(env); 
    env[0].__jmpbuf[5] = ptr_mangle(print); 
longjmp(env, 2); 
    return 0; 
} 

Je suis en train de modifier PC jmp_buf en mettant à l'adresse de la fonction que je suis en train de sauter. Je reçois une erreur de segmentation. Je n'arrive pas à comprendre ce qu'il faut exactement faire. Dois-je également modifier le SP?

Toute aide serait grandement appréciée.

Répondre

0

Qu'est-ce que vous essayez de faire? Vous ne vérifiez pas la valeur de retour de setjmp? Je ne pense pas que vous le faites correctement. Jetez un oeil à l'exemple de code ci-dessous pour voir ce que serait la sortie soit:

 
#include <stdio.h> 
#include <setjmp.h> 
#include <stdlib.h> 

void subroutine(jmp_buf); 

int main(void) 
{ 
    int value; 
    jmp_buf jumper; 

    value = setjmp(jumper); 
    if (value != 0) 
    { 
     printf("Longjmp with value %d\n", value); 
     exit(value); 
    } 
    printf("About to call subroutine ... \n"); 
    subroutine(jumper); 

    return 0; 
} 

void subroutine(jmp_buf jumper) 
{ 
    longjmp(jumper,1); 
} 

La sortie serait: A propos d'appeler sous-programme ... longjmp avec une valeur de 1.

Qui soulève la question - pourquoi essayez-vous de modifier l'adresse IP? On dirait que vous avez écrasé quelque chose ou que le code a sauté dans les bois et a piétiné quelque chose et est revenu avec un atterrissage dur, c'est-à-dire une erreur de segmentation.

La variable env est spécifiquement une structure, n'utilisez pas un indice de tableau comme vous l'avez fait. Je soupçonne que c'est pourquoi vous avez une erreur de segmentation ...

Espérons que cela aide, Cordialement, Tom.

Questions connexes