2016-04-15 3 views
1

Ich versuche Prozess von Core-Dump nach SIGQUIT zu beleben. Ich möchte wirklich diesen Teil des virtuellen Speichers, aber ich bekomme SIGSEGV, wenn ich versuche, es zuzuordnen.SIGSEGV, nach Mmapping-Bereich

EDIT: Dieser Bereich ist nicht frei: 0xf75d2000 - 0xf7774000, aber immer noch will ich es haben. enter image description here

#define _GNU_SOURCE 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/mman.h> 
#include <string.h> 
#include <stdbool.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <ucontext.h> 
#include <elf.h> 
#include <sys/procfs.h> 
#include <sys/user.h> 
#include <linux/unistd.h> 
#include <linux/unistd.h> 
#include <asm/ldt.h> 
#include <signal.h> 
bool flag = false; 
int argc2; 
char ** argv2; 
int main2(){ 
    FILE * file = fopen("/proc/self/maps", "r"); 
    if (file) { 
     char c; 
     while ((c = getc(file)) != EOF) 
     putchar(c); 
     fclose(file); 
    } 
    fflush(stdout); 
    void* res = mmap((void*)(0xf75d2000), 0x001a5000, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0); 
    return 0; 
} 
int main(int argc, char ** argv){ 
    argc2 = argc; 
    argv2 = argv; 
    ucontext_t cont; 
    getcontext (&cont); 
    if(!flag){ 
     void* a = mmap((void*)0x34B000, 81920, PROT_EXEC | PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); 
     if(a == MAP_FAILED){ 
     printf("mmapfail"); 
     return 1; 
     } 
     cont.uc_mcontext.gregs[REG_ESP] = 0x355000; 
     flag = true; 
     setcontext(&cont); 
    } else{ 
     exit(main2()); 
    } 
} 

Ich Kompilieren mit:

gcc -static -Wl,-Ttext=0x4A9480,--build-idone,-Tdata=0x639480,--section-start=.plt=0x3B9480,--section-start=.rel.plt=0x3AF480,--section-start=.note.ABI-tag=0x39B480 main.c -o main -m32 

Antwort

0

Natürlich können Sie eine SEGV bekommen. Sie ordnen Dinge mit MAP_FIXED in eine Adresse zu, die Ihnen nicht gehört, dann ziehen Sie den Stapel unter Ihren Füßen weg. Du kannst das nicht machen.

Der Adressraum ist nicht deins, um herumzualbern. MAP_FIXED ist nur sicher für das Überschreiben früherer Zuordnungen. Sie können möglicherweise darin in einem einzelnen Experiment herumspielen, in dem Sie das Programm nachher wegwerfen, aber jede andere Verwendung wird einfach nicht funktionieren.

Im Augenblick wird Ihr Anruf an setcontext abstürzen, weil es nicht weiß, wohin es zurückgeht. Weißt du überhaupt, wie Funktionsaufrufe und der Stack interagieren? Ihr Aufruf von setcontext speichert die Rückkehradresse auf dem Stapel, dann setzt setcontext den Stapelzeiger, versucht dann zurückzukehren und stirbt, weil er 0 als Rücksprungadresse liest (oder setcontext speichert möglicherweise den alten Stapelzeiger in einem anderen Register und stellt ihn wieder her) aus diesem Register, bevor es zurückkehrt und was abstürzt, ist deine andere mmap, die den echten Stapel überschreibt). Bitte tu das nicht. Ihre einzige Chance, Stacks zuverlässig zu wechseln, ohne das Betriebssystem zu sein, besteht darin, einen Signal-Handler mit sigaltstack einzurichten, dieses Signal zu fangen und niemals vom Signal-Handler zurückzukommen.

Aber da Sie den Speicher für Ihren neuen Stapel mit MAP_FIXED in eine zufällige Adresse zuordnen, werden Sie wahrscheinlich eine andere wichtige Datenstruktur überschreiben und es wird immer noch nicht funktionieren.

+0

Das ist einfach falsch. Das Programm stürzt nicht ab, Sie können z. Ersetzen Sie mmap durch printf und es wird funktionieren. Sie können das esp in der Funktion drucken und Sie werden sehen, dass es den Stapelzeiger tatsächlich ändert. – JKS

1

Die Adresse, die Sie zuordnen möchten (0xf75d2000), liegt über dem im virtuellen Speicher aufgeteilten Benutzerbereich/Kernel. Wenn Ihr Kernel mit CONFIG_VMSPLIT_3G konfiguriert ist, können Sie keine beliebigen Adressen über 0xc0000000 abbilden.

Die vorhandenen Zuordnungen wurden im Kernel eingerichtet, um den vDSO-Raum freizulegen (zur Unterstützung von Systemaufrufen).

+0

das wäre wahr, wenn ich pure x86 hätte, aber ich bin es auf x64, nice try obwohl – JKS

+0

Wenn Sie mit -m32 kompilieren, wird das nicht eine 32bit ausführbare Datei mit einem 32bit virtuellen Adressraum erstellen? –

+0

es ist nur x86 emuliert in x64 Ich kann es alle – JKS