2016-08-06 62 views
-2

Ich schrieb einen Code, um Daten von Adresse zu lesen. Diese Adresse gehört zum Code-Segment (Ich zerlege meine Binärdatei und suche nach der Hauptadresse, also ist die Adresse von dort). Das Hauptziel ist es, den Inhalt zu ändern. Wenn ich es drucke, verursacht es einen segfault. Ist es eine Art Schutz?segfault beim Drucken von Speicher

void at(){ 


    char *p = 0x0000000100000f47; 
    printf("%c", p[0]); 

} 

int main(){ 

    at(); 

    return 0; 
} 
+0

Möglicherweise führen Sie Ihren Code auf einem Betriebssystem aus, und dieses Betriebssystem gibt Ihrem Programm keinen Zugriff auf physischen Speicher, noch ist es passiert, die virtuelle Adresse 0x0000000100000f47 Ihrem Programm/Prozess zuzuweisen. – nos

+1

Siehe: http://StackOverflow.com/Q/38686502/4068338 – Matsmath

+0

Warum nicht 'char * p = (char *) main;'. So müssen Sie sich keine Gedanken über absolute Adressen und Umzüge machen. – dxiv

Antwort

2

Ist es eine Art von Schutz?

Ja. Segmentierung! Deshalb erhalten Sie einen Segmentierungsfehler.

ich zerlegen meine binäre und Lookup, wo Haupt befindet, so Adresse von dort

ist

, die nicht viel sagen; Wenn eine ausführbare Datei geladen wird, werden Teile davon verlagert, so dass sie an verschiedenen Positionen enden.

Das ist ein ziemlich komplexer Prozess (und fehleranfällig), und es beinhaltet libc/rtloader/Ihr Betriebssystem/schwarze Magie; Es könnte sogar eine Randomisierung des Speicherlayouts geben (wahrscheinlich nicht für Ihren Code), so dass die Runtime absichtlich dafür sorgt, dass Sie Speicherorte bestimmter Dinge nicht "erraten" können.

+0

ok, ich verstehe. es war in der Tat eine Scheinfrage. wahrscheinlich ist es für einen Computer unmöglich, meine Binärdatei immer im selben Speicherplatz zu finden. danke –

+0

es ist möglich, aber es ist nicht was ausführbare Loader tun –