2013-01-03 22 views
5

Stavo cercando di eseguire un buffer overflow (sto usando Linux) su un semplice programma che richiede una password. Ecco il codice del programma:Buffer Overflow non funzionante

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

int check_authentication(char *password){ 

int auth_flag = 0; 
char password_buffer[16]; 

strcpy(password_buffer, password); 

if(strcmp(password_buffer, "pass1") == 0) 
    auth_flag = 1; 
if(strcmp(password_buffer, "pass2") == 0) 
    auth_flag = 1; 

return auth_flag; 

} 

int main(int argc, char **argv) 
{ 

if(argc < 2){ 

    printf("\t[!] Correct usage: %s <password>\n", argv[0]); 
    exit(0); 

} 

if(check_authentication(argv[1])){ 

    printf("\n-=-=-=-=-=-=-=-=\n"); 
    printf(" Access granted.\n"); 
    printf("-=-=-=-=-=-=-=-=\n"); 

} else { 

    printf("\nAccess Denied.\n"); 

} 


    return 0; 

} 

OK, ora ho compilato esso, nessun errore, e salvato come overflow.c.

Ora ho aperto il terminale, mi sono trasferito nella directory di file (desktop) e poi ha scritto:

./overflow.c AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 

The Terminal ha detto: "Stack smashing rilevato" (o qualcosa di simile) e quindi chiudere il programma esecuzione.

Ora, sto leggendo un libro, intitolato "Hacking - The Art Of Exploitation" di Jon Erickson. In un capitolo, spiega questo tipo di exploit (ho preso il codice dal libro) e fa lo stesso comando che ho fatto. La memoria trabocca e il programma stampa "Access given.". Ora, perché il mio sistema operativo sta rilevando sto cercando di sfruttare il programma? Ho fatto qualcosa di sbagliato?

Ho anche provato l'exploit su Mac OS X. La stessa cosa è successa. Per favore, qualcuno può aiutarmi? Grazie in anticipo.

risposta

9

Nelle moderne distribuzioni di linux viene rilevato un overflow del buffer e il processo viene interrotto. Per disabilitare questa modalità è sufficiente compilare l'applicazione con queste bandiere (GCC):

-fno-stack-protector -fno-stack-protector-all

+0

Ok, grazie per la risposta e per l'aiuto! – jndok

+0

Prego :) –

+0

Bel post, amico! Sai forse anche una soluzione per gli ambienti Cygwin? '-fno-stack-protector' sembra non fare alcuna differenza. – Powerslave

0

La maggior parte OS moderni hanno meccanismi di protezione costruito nel Quasi ogni buon sistema operativo non consente l'accesso di memoria a basso livello direttamente a qualsiasi programma. . Permette solo ai programmi di accedere allo spazio degli indirizzi a loro assegnato. Il sistema operativo basato su Linux uccide automaticamente i processi che tentano di accedere oltre lo spazio di memoria assegnato.

Oltre a questo, il sistema operativo dispone anche di meccanismi di protezione che impediscono a un programma di arrestare il sistema in modo anomalo allocando grandi quantità di memoria, nel tentativo di esaurire notevolmente le risorse disponibili per il sistema operativo.

3

Se si compila con gcc, aggiungere -fno-stack-protector flag. Il messaggio che hai ricevuto ha lo scopo di proteggerti dal tuo codice errato :)

1

Il motivo è che lo stack smashing è in realtà un meccanismo di protezione utilizzato da alcuni compilatori per rilevare gli attacchi di overflow del buffer. Stai provando a mettere i 29 A in un array di caratteri più corto (16 byte).

Problemi correlati