GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So vermeiden Sie Stack-Smashing-Angriffe mit GCC

Stack Smashing ist ein ausgefallener Begriff, der für Stapelpufferüberläufe verwendet wird. Es bezieht sich auf Angriffe, die Fehler im Code ausnutzen, die Pufferüberläufe ermöglichen. Früher lag es ausschließlich in der Verantwortung von Programmierern/Entwicklern sicherzustellen, dass kein Pufferüberlauf in ihrem Code möglich ist, aber mit der Zeit haben Compiler wie gcc Flags bekommen, um sicherzustellen, dass Pufferüberlaufprobleme nicht von Crackern ausgenutzt werden, um ein System zu beschädigen oder ein Programm.

Ich habe von diesen Flags erfahren, als ich versuchte, einen Pufferüberlauf auf meinem Ubuntu 12.04 mit gcc 4.6.3-Version zu reproduzieren. Hier ist, was ich versucht habe:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int len = 0;
    char str[10] = {0};

    printf("\n Enter the name \n");

    gets(str); // Used gets() to cause buffer overflow

    printf("\n len = [%d] \n", len);

    len  = strlen(str);
    printf("\n len of string entered is : [%d]\n", len);

    return 0;
}

Im obigen Code habe ich gets() verwendet, um eine Zeichenfolge vom Benutzer zu akzeptieren. und dann die Länge dieser Zeichenfolge berechnet und auf stdout ausgegeben. Die Idee hier ist, einen String einzugeben, dessen Länge mehr als 10 Bytes beträgt. Da gets() keine Array-Grenzen prüft, wird es versuchen, die Eingabe in den str-Puffer zu kopieren, und auf diese Weise wird ein Pufferüberlauf stattfinden.

Folgendes ist passiert, als ich das Programm ausgeführt habe:

$ ./stacksmash 

 Enter the name
TheGeekStuff

 len = [0] 

 len of string entered is : [12]
*** stack smashing detected ***: ./stacksmash terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0xb76e4045]
/lib/i386-linux-gnu/libc.so.6(+0x103ffa)[0xb76e3ffa]
./stacksmash[0x8048548]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75f94d3]
./stacksmash[0x8048401]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:06 528260     /home/himanshu/practice/stacksmash
08049000-0804a000 r--p 00000000 08:06 528260     /home/himanshu/practice/stacksmash
0804a000-0804b000 rw-p 00001000 08:06 528260     /home/himanshu/practice/stacksmash
0973a000-0975b000 rw-p 00000000 00:00 0          [heap]
b75af000-b75cb000 r-xp 00000000 08:06 787381     /lib/i386-linux-gnu/libgcc_s.so.1
b75cb000-b75cc000 r--p 0001b000 08:06 787381     /lib/i386-linux-gnu/libgcc_s.so.1
b75cc000-b75cd000 rw-p 0001c000 08:06 787381     /lib/i386-linux-gnu/libgcc_s.so.1
b75df000-b75e0000 rw-p 00000000 00:00 0
b75e0000-b7783000 r-xp 00000000 08:06 787152     /lib/i386-linux-gnu/libc-2.15.so
b7783000-b7784000 ---p 001a3000 08:06 787152     /lib/i386-linux-gnu/libc-2.15.so
b7784000-b7786000 r--p 001a3000 08:06 787152     /lib/i386-linux-gnu/libc-2.15.so
b7786000-b7787000 rw-p 001a5000 08:06 787152     /lib/i386-linux-gnu/libc-2.15.so
b7787000-b778a000 rw-p 00000000 00:00 0
b7799000-b779e000 rw-p 00000000 00:00 0
b779e000-b779f000 r-xp 00000000 00:00 0          [vdso]
b779f000-b77bf000 r-xp 00000000 08:06 794147     /lib/i386-linux-gnu/ld-2.15.so
b77bf000-b77c0000 r--p 0001f000 08:06 794147     /lib/i386-linux-gnu/ld-2.15.so
b77c0000-b77c1000 rw-p 00020000 08:06 794147     /lib/i386-linux-gnu/ld-2.15.so
bfaec000-bfb0d000 rw-p 00000000 00:00 0          [stack]
Aborted (core dumped)

Nun, das war eine angenehme Überraschung, dass die Ausführungsumgebung irgendwie erkennen konnte, dass es in diesem Fall zu einem Pufferüberlauf kommen könnte. In der Ausgabe sehen Sie, dass Stack Smashing erkannt wurde. Dies veranlasste mich zu untersuchen, wie ein Pufferüberlauf erkannt wurde.

Bei der Suche nach dem Grund bin ich auf ein gcc-Flag „-fstack-protector“ gestoßen. Hier ist die Beschreibung dieses Flags (aus der Manpage):

-fstack-protector

Geben Sie zusätzlichen Code aus, um nach Pufferüberläufen zu suchen, wie z. B. Stack-Smashing-Angriffen. Dies geschieht durch Hinzufügen einer Guard-Variable zu Funktionen mit anfälligen Objekten. Dazu gehören Funktionen, die alloca aufrufen, und Funktionen mit Puffern, die größer als 8 Bytes sind. Die Wächter werden initialisiert, wenn eine Funktion eingegeben wird, und dann überprüft, wenn die Funktion beendet wird. Wenn eine Wächterprüfung fehlschlägt, wird eine Fehlermeldung ausgegeben und das Programm beendet.

HINWEIS:In Ubuntu 6.10 und späteren Versionen ist diese Option standardmäßig für C, C++, ObjC, ObjC++ aktiviert, wenn weder -fno-stack-protector, -nostdlib noch -ffreestanding gefunden werden.

Sie sehen also, dass gcc dieses Flag hat, das zusätzlichen Code ausgibt, um Pufferüberläufe zu überprüfen. Die nächste Frage, die mir in den Sinn kam, war, dass ich dieses Flag nie während der Kompilierung eingefügt habe, und wie diese Funktionalität aktiviert wurde. Dann habe ich die letzten beiden Zeilen gelesen, die besagten, dass diese Funktionalität für Ubuntu 6.10 standardmäßig aktiviert ist.

Als nächsten Schritt habe ich mich dann entschieden, diese Funktionalität zu deaktivieren, indem ich das Flag „-fno-stack-protector“ während der Kompilierung verwende und dann versuche, denselben Anwendungsfall auszuführen, den ich zuvor gemacht habe.

So habe ich es gemacht:

$ gcc -Wall -fno-stack-protector stacksmash.c -o stacksmash
$ ./stacksmash 

 Enter the name
TheGeekStuff

 len = [26214] 

 len of string entered is : [12]

Wir sehen also, dass, sobald der Code mit diesem Flag und dann mit derselben Eingabe kompiliert wurde, die Ausführungsumgebung nicht in der Lage war, einen Pufferüberlauf zu erkennen, der tatsächlich aufgetreten ist und den Wert der Variablen „len“ beschädigt hat.

Wenn Sie neu bei gcc sind, sollten Sie auch die am häufigsten verwendeten gcc-Compileroptionen verstehen, die wir zuvor besprochen haben.


Linux
  1. Erfahren Sie, wie Sie XML-RPC-Angriffe mit .htaccess stoppen

  2. So installieren Sie MERN Stack mit Nginx unter Debian 11

  3. So kompilieren Sie eine 32-Bit-Binärdatei auf einem 64-Bit-Linux-Rechner mit gcc/cmake

  4. Wie erhalte ich einen Stack-Trace für C++ mit gcc mit Zeilennummerinformationen?

  5. wie man gcc 4.9.2 auf RHEL 7.4 installiert

So integrieren Sie ONLYOFFICE 9.6 mit WordPress

So installieren Sie phpMyAdmin mit LAMP-Stack auf Ubuntu

So sichern Sie Linux-Server mit SE Linux

So installieren Sie WordPress mit LAMP Stack auf Ubuntu 20.04

So installieren Sie LAMP Stack mit PhpMyAdmin in Ubuntu 20.04

So erstellen Sie einen E-Commerce mit Magento