2015-02-17 11 views
6

Sto sperimentando attacchi di dirottamento del flusso di controllo su programmi scritti in C su Linux. Sto cercando di eseguire un semplice attacco ret-2-libc su un programma con la contromisura stack-No eXecutable attivata. Per questo scopo sto tornando alla funzione system() con argomento /bin/sh.Perché la shell return-to-libc che utilizza system() si chiude immediatamente?

Ma ho un problema: sebbene il mio attacco funzioni e una shell sia generata correttamente, la shell esce immediatamente dopo aver inserito il primo carattere! Cioè, la shell si chiude dopo aver premuto un tasto qualsiasi!

Questo comportamento è anche osservabile in questo semplice codice C:

int main() { system("/bin/sh"); return 0; } 

compilo usando: gcc code.c -o system

perché è questo? E come posso ripararlo?

sto sperimentando sulla Ubuntu-9.04 con kernel 2.6.28 e glibc-2.9-1


Update: La shell diventa interattivo se e solo se la prima chiave che preme è Enter. Cioè, se il primo carattere che inserisco è un new-line (\n), la shell rimane aperta e diventa interattiva.

Così qualcuno può spiegare cosa sta succedendo qui?

+1

Dato che è possibile riprodurre il problema con codice C standard e legittimo, questo non è correlato ai tentativi di exploit, quindi questa domanda è più adatta per Stack Overflow. –

+0

@ AndréDaniel Vero; tuttavia questo non è molto simile a un problema di programmazione generale e gli esperti nel campo dello sviluppo di shellcode possono essere di aiuto. Così l'ho chiesto qui. –

+2

Non riesco a riprodurlo con il tuo codice. È davvero l'unica cosa che fai lì? Come lo esegui? – StenSoft

risposta

0

Ok, credo che il sistema stia chiamando con successo /bin/sh ma lo sta chiamando con il flag -c.

Prova:

/bin/bash -c junk 

Questo dovrebbe comportarsi in modo simile a ciò che si sta vedendo. È necessario giocare con i registri per impostare la chiamata di sistema in modo che/bin/sh venga chiamato senza il flag -c.

Problemi correlati