Abbiamo un programma vulnerabile a una sovrascrittura del puntatore a un frame di un byte. Lo stack è contrassegnato come eseguibile, la macchina Linux ha disabilitato aslr, i cookie di stack sono disabilitati ed è un po 'endian standard x86.
Potremmo eseguire:
buf[256];
for(int i=0; i <=256; i++)
buf[i] = argv[1][i];
Tuttavia, voglio mettere il mio shellcode in buf
e poi saltare ad esso. Se usassi un normale overflow dello stack, potrei ottenere l'affidabilità di exploit andando in una libreria caricata che ha l'istruzione jmp $esp
da qualche parte codificata, e poi metto il mio shellcode dove sono gli argomenti della funzione e così via. Ma questo non è possibile qui.
Quindi cosa fai se si tratta di un processo remoto (non puoi hardcode i valori dell'indirizzo) e hai bisogno di sfruttare l'affidabilità? L'unica cosa che mi è venuta in mente è l'allineamento dello stack in cui potremmo essere in grado di prevedere i bit bassi (forse 2 o 3 bit?).
Ho solo bisogno di conoscere il basso byte del puntatore del frame in modo da poterlo sovrascrivere con un piccolo valore di controllo eip per puntare a jmp esp e all'istruzione di esp sarebbe come un salto breve -0x80 o qualcosa del genere che.
Ho diminuito il frame pointer = > ret viene eseguito = > control eip = > point eip to jmp esp instruction = > la prossima istruzione è il salto breve -0xsomevalue execution = > il carico utile viene eseguito.
Ho pensato ad altre euristiche come scrivere il puntatore a jmp esp più e più volte nel buffer in modo che sia più probabile ottenere il controllo di eip, ma in questo modo il mio metodo di jmp -0xsomevalue non funzionerebbe più.