GCC-Trampoline-Hack: Verschachtelte Funktionen ohne ausführbaren Stack aufrufen
Indirect Calling of Nested Functions on GCC Without Executable Stack
Martin Uecker zeigt einen Hack, um verschachtelte Funktionen in älteren GCC-Versionen ohne ausführbaren Stack aufzurufen. Statt den Trampolin-Code auf dem Stack auszuführen, extrahiert er die Code-Adresse und die statische Kette aus dem Trampolin und ruft die Funktion direkt mit `__builtin_call_with_static_chain` auf. Dadurch kann der Stack mit `patchelf --clear-execstack` wieder als nicht ausführbar markiert werden. Zusätzlich schlägt er vor, Trampoline als Funktionsdeskriptoren zu interpretieren, um den Aufruf zu optimieren.
In gewissem Sinne könnte man sagen, dass wir statt das Trampolin aufzurufen, den Code des Trampolins an der Aufrufstelle mit einem super einfachen Interpreter interpretieren, der nur diese spezifische Codesequenz interpretieren kann und so einfach ist, dass er inline expandiert werden kann.
- inigyou
Selbstmodifizierender Code ist cool. Schade, dass wir ihn aus Sicherheitsgründen deaktivieren mussten.
- mananaysiempre
Verwandt: vorheriger Artikel der Serie, https://news.ycombinator.com/item?id=49308685 (103 Punkte, 47 Kommentare)
- gue5t
Zuerst war ich genervt, AT&T-Syntax lesen zu müssen. Dann war ich verwirrt, als ich merkte, dass das nächste Snippet in AT&T-Syntax ohne das '%'-Zeichen für Register war. Aber die Technik ist cool.
- Dwedit
Wofür brauchst du den ausführbaren Stack? Du rufst über einen Funktionszeiger auf, da ist kein ausführbarer Lese-/Schreibspeicher beim Verwenden eines Funktionszeigers beteiligt.