In der Art, Binärdateien zu verstehen (virtuelles Speicherlayout, Ausführung ... etc), habe ich einen C
Code geschrieben, der eine globale Zeichenfolge deklariert, die Bytes eines ausführbaren Codes enthält, dann überschrieb ich die Rücksprungadresse von der main()
Funktion zu diesem ausführbaren Code mit einem einfachen Trick durch die Deklaration eines Zeigers (PTR
) in main()
, die eine lokale Speicherbereich auf dem Stapel 2 WORDS weit entfernt von der Rücksendeadresse von der main()
reserviert ist, so dass ich nur die Adresse der Geben Sie die Adresse an diesen Zeiger (PTR=(int*)&PTR+2)
zurück und überschreiben Sie dann den Inhalt dieser Adresse mit der Adresse des ausführbaren Codes (der statischen Zeichenfolge).
Jetzt ist das Dilemma, dass, wenn ich kompiliere und ich ausführen, erhalte ich einen Segmentierungsfehler. Der ausführbare Code hat keinen Speicher input/output
(es ist nur eine Reihe von NOPs
).
Mit GDB habe ich sichergestellt, dass der Prozess perfekt funktioniert: die Absenderadresse wird geändert, um die Adresse der Zeichenfolge zu sein, aber die Rückkehr passiert nie.
Alles was ich weiß ist, dass die ausführbaren Code auf Seiten im virtuellen Speicher Thar sind RW
markiert abgebildet wird (.data
& .bss
Segmente) so vielleicht gibt es keine Möglichkeit, eine solche Ausführung von Code zu tun, wenn Code in einer executable
Speicherbereich injiziert wird (Seiten das sind markiert RE
). Das ist meine Theorie über das Thema, ich lade Sie ein, mehr Details zu geben.Kann ich Code ausführen, der sich im Datensegment (ELF-Binärdatei) befindet?
char code[]="\x90\x90\x90\x90\x90\x90\x90\x90"; //a static string contains executable code
int main()
{
int *return_address; //Pointer to the return address - uninitialized
return_address = (int *)&return_address + 2; //Initializing the return address - according to stack layout
(*return_address) = (int)code; //Overwriting the return address with the code's address
}
Sie möchten mprotect sycall mit PROT_EXEC Flagge nennen hinzugefügt ... Es gibt keine x-Berechtigung für Datenseite auf vielen Architekturen (x86 auch), überprüfen Sie die Speicherkarten in linux durch Lesen von/proc/$ PID/maps Datei, während die Anwendung läuft (gestoppt in gdb), wobei $ PID die PID des Zielprozesses ist. Sie sehen, dass das Daten/BSS-Segment mit rw-permission geladen ist. – osgx
@osgx Es ist genau dasselbe, was ich vermutete, erlauben ältere Linux-Kernel (wie vor 2007) diese Art der Ausführung? –
hast du? Sie können die Kartendatei auf einem älteren Kernel überprüfen. Es gibt eine Wiki-Seite zur Technologie: https://en.wikipedia.org/wiki/Executable_space_protection und "NX bit"/"XD bit" -Technologie kann in CPU und Kernel benötigt werden, um ... 'Executable' -Bit zu page- hinzuzufügen. Level-Übersetzungen von Hardware (OS kann 3-Bit-rwx-Berechtigungen haben, aber Hardware hatte kein x-Bit). PAE sollte auch im 32-Bit-x86-Modus aktiviert sein. (detaillierte Informationen gibt es hier https://en.wikipedia.org/wiki/NX_bit) – osgx