So deaktivieren Sie die Optimierung des gcc-Compilers, um den Pufferüberlauf zu aktivieren

75

Ich arbeite an einem Hausaufgabenproblem , bei dem der Compiler-Optimierungsschutz deaktiviert werden muss, damit es funktioniert. Ich verwende gcc 4.4.1 unter Ubuntu Linux, kann aber nicht herausfinden, welche Flags die richtigen sind. Mir ist klar, dass es von der Architektur abhängt - auf meinem Computer läuft ein 32-Bit-Intel-Prozessor.

Vielen Dank.

sa125
quelle

Antworten:

102

Das ist ein gutes Problem. Um dieses Problem zu lösen, müssen Sie auch ASLR deaktivieren, da sonst die Adresse von g () nicht vorhersehbar ist.

ASLR deaktivieren:

sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

Kanarienvögel deaktivieren:

gcc overflow.c -o overflow -fno-stack-protector

Nachdem Kanarienvögel und ASLR deaktiviert wurden, sollte es sich um einen direkten Angriff handeln, wie er in Smashing the Stack for Fun and Profit beschrieben ist

Hier ist eine Liste der in Ubuntu verwendeten Sicherheitsfunktionen: https://wiki.ubuntu.com/Security/Features Sie müssen sich keine Gedanken über NX-Bits machen, die Adresse von g () befindet sich immer in einem ausführbaren Speicherbereich weil es innerhalb des TEXT-Speichersegments liegt. NX-Bits kommen nur ins Spiel, wenn Sie versuchen, Shellcode auf dem Stapel oder Heap auszuführen, der für diese Zuweisung nicht erforderlich ist.

Jetzt geh und mach das EIP kaputt !

Turm
quelle
5
danke, ich werde genau das tun :) Oh - wie kann ich den Schutz wieder aktivieren, um meinen Computer zu
entsorgen
@ sa125 yep, so wird es wieder aktiviert. Auf diese Weise schalten Sie andere Kernelmodule ein und aus, während das System ausgeführt wird;)
Turm
14
Es scheint erwähnenswert zu sein, dass randomize_va_space auf meinem System standardmäßig 2 und nicht 1 ist. Es lohnt sich daher, vorher zu prüfen, ob Sie beabsichtigen, es wieder zu aktivieren.
Rushyo
4
Tatsächlich wird die Adresse von g () sehr wahrscheinlich nicht von ASLR randomisiert, da sie Teil der Hauptbinärdatei ist. Nur wenn Sie die Binärdatei mit -PIE kompilieren, wird sie randomisiert.
Robert Larsen
32

Urm, alle Antworten waren bisher falsch, da Rooks Antwort richtig war.

Eingabe:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

Gefolgt von:

gcc -fno-stack-protector -z execstack -o bug bug.c

Das Deaktivieren von ASLR, SSP / Propolice und Ubuntus NoneXec (das in 9.10 platziert wurde und relativ einfach zu umgehen ist, siehe die mprotect (2) -Technik zum Zuordnen von Seiten als ausführbar und jmp) sollte ein wenig helfen, jedoch sind diese "Sicherheitsfunktionen" von nein unfehlbar. Ohne das Flag "-z execstack" haben Seiten nicht ausführbare Stapelmarkierungen.

poizan42
quelle
4
Du hast den Link der Jungs nicht gelesen. Wenn Sie dies getan hätten, würden Sie wissen, dass er versucht, g () auszuführen, eine Funktion, die in die Binärdatei kompiliert wird. Dies ist eine Adresse einer Funktion. NX-Bits kommen ins Spiel, wenn Sie versuchen, Shellcode auf dem Heap oder Stack auszuführen. Sein Angriff ist weitaus einfacher.
Turm
Ich stimme zu, dass alle anderen völlig falsch liegen. Es ist offensichtlich, dass wir die einzigen sind, die einen Pufferüberlauf ausgenutzt haben. Ich denke jedoch immer noch, dass meine Antwort korrekter ist.
Turm
Hmm, bin gerade auf den Link gestoßen - ich dachte, es wäre nur ein weiteres Generikum, du hast Recht. Ich entschuldige mich.
Ich weiß, dass dies ein alter Beitrag ist, aber Sie können sudo nicht mit> <verwenden, da dies nicht zulässig ist. Der Befehl sollte lauten: echo 0 | sudo tee / proc / sys / kernel / randomize_va_space
Boogy
19

In neueren Distributionen (Stand 2016) scheint PIE standardmäßig aktiviert zu sein, sodass Sie es beim Kompilieren explizit deaktivieren müssen.

Hier ist eine kleine Zusammenfassung der Befehle, die beim lokalen Spielen mit Pufferüberlaufübungen im Allgemeinen hilfreich sein können:

Kanarienvogel deaktivieren:

gcc vuln.c -o vuln_disable_canary -fno-stack-protector

DEP deaktivieren:

gcc vuln.c -o vuln_disable_dep -z execstack

PIE deaktivieren:

gcc vuln.c -o vuln_disable_pie -no-pie

Deaktivieren Sie alle oben aufgeführten Schutzmechanismen (Warnung: nur für lokale Tests):

gcc vuln.c -o vuln_disable_all -fno-stack-protector -z execstack -no-pie

Bei 32-Bit-Computern müssen Sie den -m32Parameter ebenfalls hinzufügen .

Aydin K.
quelle
7

Sie müssen ASLR nicht deaktivieren, um einen Pufferüberlauf durchzuführen! Obwohl ASLR aktiviert ist ( kernel_randomize_va_space = 2), wird es nur wirksam, wenn die kompilierte ausführbare Datei PIE ist. Wenn Sie Ihre Datei nicht mit -fPIC -pieflag kompiliert haben , wird ASLR nicht wirksam.

Ich denke nur die Kanarienvögel mit zu deaktivieren -fno-stack-protectorist genug. Wenn Sie überprüfen möchten, ob ASLR funktioniert oder nicht (Positionsunabhängiger Code muss festgelegt sein), verwenden Sie:

hardening-check executable_name
AhlyM
quelle
6

Versuchen Sie die -fno-stack-protectorFlagge.

Kyle Lutz
quelle
2

Ich werde nicht die gesamte Seite zitieren, aber das gesamte Handbuch zur Optimierung finden Sie hier: http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#Optimize-Options

Von den Klängen wollen Sie zumindest -O0die Standardeinstellung und:

-fmudflap -fmudflapth -fmudflapir

Instrumentieren Sie für Front-Ends, die dies unterstützen (C und C ++), alle riskanten Zeiger- / Array-Dereferenzierungsoperationen, einige Standardfunktionen für Bibliothekszeichenfolgen / -heap und einige andere zugehörige Konstrukte mit Bereichs- / Gültigkeitstests. Auf diese Weise instrumentierte Module sollten immun gegen Pufferüberläufe, ungültige Heap-Verwendung und einige andere Klassen von C / C ++ - Programmierfehlern sein. Die Instrumentierung basiert auf einer separaten Laufzeitbibliothek (libmudflap), die mit einem Programm verknüpft wird, wenn -fmudflap zur Verknüpfungszeit angegeben wird. Das Laufzeitverhalten des instrumentierten Programms wird durch die Umgebungsvariable MUDFLAP_OPTIONS gesteuert. Die Optionen finden Sie unter env MUDFLAP_OPTIONS = -help a.out.


quelle