Ergebnis 1 bis 8 von 8

Thema: [Linux] Get Memory-Permission From x to y

  1. #1
    Registered User
    Registriert seit
    Sep 2008
    Beiträge
    402
    Renommee
    270

    [Linux] Get Memory-Permission From x to y

    Hey Leute,

    gibt es vielleicht eine Funktion, welche die "Minimum"-Permissions einer Range zurückliefert (zum Aufrufen im selben Prozess)?

    Also zum Beispiel:

    Code:
    if (get_minimum_memory_permissions(0x00401111, 0x00402222) & MEM_READABLE)
        // yey, alles auslesen ohne segfault...
    Oder muss man bei jedem Auslesen zuerst /proc/$pid/mem auswerten (oder halt cachen, aber dann ist es nicht immer aktuell)?

    Bzw. gibt es eine Funktion, die mir eine Range in einen Buffer liest, und bei unpassenden Rechten eine Fehlermeldung liefert?

    Wäre schön zu erfahren. :D

    Viele Grüße,
    gruena

  2. #2
    Moderator
    Nothing is unbreakable!

    Registriert seit
    Jul 2003
    Beiträge
    622
    Renommee
    819

    Re: [Linux] Get Memory-Permission From x to y

    Du kannst ja einfach das Segfault Signal abfangen. Das feuert ja bei unpassenden Rechten ;)

  3. #3
    Registered User
    Registriert seit
    Sep 2008
    Beiträge
    402
    Renommee
    270

    Re: [Linux] Get Memory-Permission From x to y

    Und dann mit http://en.wikipedia.org/wiki/Setjmp.h zurück? :D

    Denke, so werde ich es dann machen. Danke. ^^

  4. #4
    Moderator
    Nothing is unbreakable!

    Registriert seit
    Jul 2003
    Beiträge
    622
    Renommee
    819

    Re: [Linux] Get Memory-Permission From x to y

    Danke, kannte ich auch noch nicht :) Nudelcode wir kommen.

  5. #5
    Registered User
    Registriert seit
    Sep 2008
    Beiträge
    402
    Renommee
    270

    Re: [Linux] Get Memory-Permission From x to y

    Funzt tatsächlich. :D

    Ist nichtmal so nudelig, wenn man nur readMemoryInt() als Anwender betrachtet. ^^

    PHP-Code:
    #include <stdio.h>

    #include <signal.h>
    #include <setjmp.h>

    jmp_buf jumpbuffer;

    void onSegFault(int sig)
    {
        
    printf("segfault!\n");
        
    longjmp(jumpbuffer1);
    }

    int readMemoryInt(int *fromint *outError)
    {
        
    int ret;

        
    // set signal handler (must be set after every time it got called)
        
    signal(SIGSEGVonSegFault);

        
    // save current state
        
    ret setjmp(jumpbuffer);

        
    printf("setjmp(jumpbuffer)=%d\n"ret);

        
    // 0 = we arent got called by longjmp()
        // something else = longjmp(jumpbuffer, $somethingElse);
        
    if (ret == 0) {
            *
    outError 0;
            return *
    from;
        }

        *
    outError 1;
        
    printf("error reading 0x%.8x!\n"from);
        return -
    1// something....
    }


    int main()
    {
        
    int i 123;
        
    int reterror;

        
    int *readFrom;

        
    printf("] lets test. :)\n");

        
    // should work, heh ^^
        
    readFrom = &i;
        
    ret readMemoryInt(readFrom, &error);
        if (!
    error)
            
    printf("readMemoryInt(0x%.8x)=%d\n\n"readFromret);
        else
            
    printf("readMemoryInt(0x%.8x)=FAILED!\n\n"readFrom);

        
    // fail!
        
    readFrom NULL;
        
    ret readMemoryInt(readFrom, &error);
        if (!
    error)
            
    printf("readMemoryInt(0x%.8x)=%d\n\n"readFromret);
        else
            
    printf("readMemoryInt(0x%.8x)=FAILED!\n\n"readFrom);

        
    // fail!
        
    readFrom = (int *)0xdeadbeaf;
        
    ret readMemoryInt(readFrom, &error);
        if (!
    error)
            
    printf("readMemoryInt(0x%.8x)=%d\n\n"readFromret);
        else
            
    printf("readMemoryInt(0x%.8x)=FAILED!\n\n"readFrom);

        
    // should work, heh ^^
        
    readFrom = &i;
        
    ret readMemoryInt(readFrom, &error);
        if (!
    error)
            
    printf("readMemoryInt(0x%.8x)=%d\n\n"readFromret);
        else
            
    printf("readMemoryInt(0x%.8x)=FAILED!\n\n"readFrom);

        
    printf("] we are at the end. :(\n");

        
    getchar();
        return 
    1;

    Ausgabe:
    PHP-Code:
    lets test. :)
    setjmp(jumpbuffer)=0
    readMemoryInt
    (0x0012ff60)=123

    setjmp
    (jumpbuffer)=0
    segfault
    !
    setjmp(jumpbuffer)=1
    error reading 0x00000000
    !
    readMemoryInt(0x00000000)=FAILED!

    setjmp(jumpbuffer)=0
    segfault
    !
    setjmp(jumpbuffer)=1
    error reading 0xdeadbeaf
    !
    readMemoryInt(0xdeadbeaf)=FAILED!

    setjmp(jumpbuffer)=0
    readMemoryInt
    (0x0012ff60)=123

    we are at the end. :( 
    Lern-Hilfen:
    signal(): http://openbook.galileocomputing.de/...eeb875d5195d9a (hier ist auch ein setjmp()-Beispiel mit drin)
    setjmp()/longjmp(): http://openbook.galileocomputing.de/...9018276d98df74

    Im einem echten Programm sollte man natürlich die printf()'s aus readMemoryInt() und onSegFault() rausnehmen, und nur *outError von int readMemoryInt(int *from, int *outError) auswerten, wenn man Fehlermeldungen haben möchte. ^^
    Über das neue Zeitalter der Gehirne eines Menschen!
    echo 'main() { char z[] = "ping "; for(;printf(z);z[1]^=6); }' > a.c; gcc a.c -o a; ./a # 16.11.2011 02:51

  6. #6
    Moderator
    Nothing is unbreakable!

    Registriert seit
    Jul 2003
    Beiträge
    622
    Renommee
    819

    Re: [Linux] Get Memory-Permission From x to y

    Wunderbar :) Danke fürs Beispiel. Wollte ich schon lange mal selbst machen.

    Gruß

  7. #7
    Registered User
    Registriert seit
    Sep 2008
    Beiträge
    402
    Renommee
    270

    Re: [Linux] Get Memory-Permission From x to y

    Hmm, ich werde langsam verrückt...

    Habe jetzt alles mögliche unter Linux probiert (signal() mehrmals setzen, sigaction() verwenden, beide Funktionen verwenden, gemixt verwenden...), aber es wird immer nur ein einziges Mal die Handler-Funktion aufgerufen. Dann kommt immer "Segmentation fault" und Programm ist Ende.

    Ich weiß nicht, ob es vielleicht daran liegt, dass ich das auf einem openVZ-Linux teste. Vielleicht könntest du das auf einer "echten" Maschine testen?

    Habe ansonsten keine Ahnung warum das unter Linux nicht funktioniert. :S
    Über das neue Zeitalter der Gehirne eines Menschen!
    echo 'main() { char z[] = "ping "; for(;printf(z);z[1]^=6); }' > a.c; gcc a.c -o a; ./a # 16.11.2011 02:51

  8. #8
    Moderator
    Nothing is unbreakable!

    Registriert seit
    Jul 2003
    Beiträge
    622
    Renommee
    819

    Re: [Linux] Get Memory-Permission From x to y

    Habs gerade getestet. Stimmt, es geht nicht. Vllt. muss man den Fehler noch reseten oder so. Muss ich später mal schaun.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. ffmpeg - Not enough memory
    Von bidgo im Forum PHP, Perl und ASP
    Antworten: 0
    Letzter Beitrag: 22.05.2007, 19:09
  2. mkdir() - permission denied
    Von xYx2k im Forum PHP, Perl und ASP
    Antworten: 3
    Letzter Beitrag: 12.09.2003, 19:49
  3. Antworten: 3
    Letzter Beitrag: 13.07.2003, 01:04
  4. Out of Memory bei 768 MB Ram ?
    Von ByteBreaker im Forum Datenbanken
    Antworten: 2
    Letzter Beitrag: 11.01.2003, 13:54
  5. FTP Permission DENIED
    Von Cesual im Forum (In)Security allgemein
    Antworten: 3
    Letzter Beitrag: 15.12.2000, 16:53

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •