Discussione [Guida + Script] Come compilare un programma per esercitarsi con lo stack/buffer overflow

driverfury

Utente Electrum
26 Agosto 2015
326
14
147
150
Ultima modifica:
Salve utenti di inforge.

Voglio postare questa guida perché in passato ebbi problemi a compilare semplici programmi C (sia scritti da me che non) da usare per potermi esercitare col buffer overflow.

Lo script che rilasciai tempo fa è il seguente: https://www.inforge.net/forum/threads/compilare-con-permessi-di-execstack-stack-eseguibile.449197/

Tuttavia manca qualche dettaglio.

Inoltre voglio spiegare brevemente perché lo stack overflow potrebbe non funzionare su sistemi moderni.

Per far sì che funzioni abbiamo bisogno di 2 cose fondamentali:


1. Disabilitare l'opzione stack protector in fase di compilazione

Direttamente dal manuale gcc (compilatore per linguaggio C):
-fstack-protector

Emit extra code to check for buffer overflows, such as stack smashing attacks. This is done by adding a guard variable to functions with vulnerable objects. This includes functions that call alloca, and functions with buffers larger than 8 bytes. The guards are initialized when a function is entered and then checked when the function exits. If a guard check fails, an error message is printed and the program exits.

-fstack-protector-all

Like -fstack-protector except that all functions are protected.

Quindi, questa opzione di compilazione ci permette di prevenire gli stack overflow.

In alcune versioni di gcc è disabilitata di default, in altre è abilitata.

Per essere sicuri di disabilitarla occorre compilare con l'opzione:
Bash:
gcc -fno-stack-protector -o output.o input.c


2. Markare lo stack come eseguibile

Solitamente, quando si compila un programma C lo stack è solo readable e writable ma non executable. In questo modo, si evita che l'attaccante inietti codice malevolo nello stack e lo esegui. Per far sì che lo stack sia pure eseguibile occorre l'opzione "-z execstack" (leggi il manuale di gcc per scoprire di più sull'opzione -z):
Bash:
gcc -z execstack -o output.o input.c

Mettendo i pezzi insieme:
Bash:
gcc -fno-stack-protector -z execstack -o output.o input.c


3. Disabilitare l'ASLR

Da Wikipedia:
La ASLR (Address Space Layout Randomization, casualizzazione dello spazio degli indirizzi) è una misura di protezione contro buffer overrun e exploit che consiste nel rendere (parzialmente) casuale l'indirizzo delle funzioni di libreria e delle più importanti aree di memoria.
[...]
Questa tecnica è tanto più efficace quanto più l'indirizzo delle librerie, dello stack, dello heap e delle varie strutture dati di sistema è variabile;

La ASLR, quindi, rende casuale gli indirizzi dello stack rendendo più difficile l'esecuzione di shellcode nello stack in quanto dovranno essere position-indipendent.

Per disattivare la ASLR (che, ricordo, è una funzionalità del sistema operativo) abbiamo 2 modi.

Il primo modo consiste nel disattivare la ASLR permanentemente. Basta avviare questo comando:
Bash:
echo 0 > /proc/sys/kernel/randomize_va_space

Per riattivarla occorre scrivere 1 nel file modificato:
Bash:
echo 1 > /proc/sys/kernel/randomize_va_space

Il secondo modo consiste nel disattivare la ASLR momentaneamente (fino al riavvio del PC):
Bash:
sysctl -w kernel.randomize_va_space=0

Per riattivarla:
Bash:
sysctl -w kernel.randomize_va_space=1

Lo script finale sarà:

Nome File: stkvflow_compile.sh
Bash:
#!/bin/bash

# usage: ./stkvflow_compile.sh input.c output.o [-no-aslr]

# disable ASLR (temporary disable ASLR, default value will be restored after reboot)
if $3 = "-no-aslr"; then sysctl -w kernel.randomize_va_space=0; fi

# compile with no stack protector and marking stack as executable
gcc -fno-stack-protector -z execstack -o $2 $1

Se si vuole solo compilare un file occorrerà avviare il comando:
Bash:
./stkvflow_compile.sh input.c output.o

Se si vuole compilare il file ed, inoltre, disattivare momentaneamente la ASLR:
Bash:
./stkvflow_compile.sh input.c output.o -no-aslr

Una volta aver seguito tutti questi passaggi potrai esercitarti tranquillamente sullo stack overflow.

Quando hai preso dimistichezza con lo stack overflow puoi man mano togliere le protezioni (ad esempio abilitando la ASLR, rendendo lo stack non-executable...) in modo da creare exploit più avanzati.
 
  • Mi piace
Reazioni: 0xbro e D3x3