Ich kann sagen, warum es fehlschlägt, obwohl ich nicht weiß, welcher Teil des Systems dafür verantwortlich ist. Während .dtors
es in der Binärdatei als beschreibbar markiert ist, sieht es so aus, als würde es (zusammen mit .ctors
dem GOT und einigen anderen Dingen) einer separaten, nicht beschreibbaren Seite im Speicher zugeordnet. Auf meinem System .dtors
wird gesetzt bei 0x8049f14
:
$ readelf -S test
[17] .ctors PROGBITS 08049f0c 000f0c 000008 00 WA 0 0 4
[18] .dtors PROGBITS 08049f14 000f14 000008 00 WA 0 0 4
[19] .jcr PROGBITS 08049f1c 000f1c 000004 00 WA 0 0 4
[20] .dynamic DYNAMIC 08049f20 000f20 0000d0 08 WA 6 0 4
[21] .got PROGBITS 08049ff0 000ff0 000004 04 WA 0 0 4
[22] .got.plt PROGBITS 08049ff4 000ff4 00001c 04 WA 0 0 4
[23] .data PROGBITS 0804a010 001010 000008 00 WA 0 0 4
[24] .bss NOBITS 0804a018 001018 000008 00 WA 0 0 4
Wenn ich die ausführbare Datei ausführe und überprüfe /proc/PID/maps
, sehe ich:
08048000-08049000 r-xp 00000000 08:02 163678 /tmp/test
08049000-0804a000 r--p 00000000 08:02 163678 /tmp/test
0804a000-0804b000 rw-p 00001000 08:02 163678 /tmp/test
.data
/ .bss
Sind noch beschreibbar in ihrer eigenen Seite, aber die andere in 0x8049000-0x804a000
nicht sind. Ich gehe davon aus, dass dies ein Sicherheitsmerkmal im Kernel ist (wie Sie sagten, "es hat in letzter Zeit eine Bewegung in Richtung schreibgeschützter .dtors, plt, got" gegeben), aber ich weiß nicht genau, wie es heißt (OpenBSD hat etwas sehr Ähnliches namens W ^ X ; Linux hat PaX , ist aber in den meisten Kerneln nicht eingebaut)
Sie können es umgehen mprotect
, indem Sie die speicherinternen Attribute einer Seite ändern:
mprotect((void*)0x8049000, 4096, PROT_WRITE);
Damit stürzt mein Testprogramm nicht ab, aber wenn ich versuche, den End-Sentinel von .dtors
( 0x8049f18
) mit der Adresse einer anderen Funktion zu überschreiben , wird diese Funktion immer noch nicht ausgeführt. diesen Teil kann ich nicht herausfinden.
Hoffentlich weiß jemand anderes, was dafür verantwortlich ist, dass die Seite schreibgeschützt ist, und warum das Ändern .dtors
auf meinem System nichts zu bewirken scheint