Si può evitare l'overflow dello stack memorizzando le stringhe nella memoria all'indietro?

2

Uso normale:

  ------(buffer)------  --(ret)---
  DDDDDDDDEEEEEEEEEEEE  EEEE  FFFF
  89ABCDEF0123456789AB  CDEF  0123
  this is a string
  ------(buffer)------  --(ret)---
  DDDDDDDDEEEEEEEEEEEE  EEEE  FFFF 
  89ABCDEF0123456789AB  CDEF  0123
  oh no you got hacked  cadf  aff0 
  ------(buffer)------  --(ret)---
  DDDDDDDDEEEEEEEEEEEE  EEEE  FFFF 
  89ABCDEF0123456789AB  CDEF  0123
  dekcah tog uoy on ho  bff5  a400 (no harm to ret pointer)
bff5 a400

Stack overflow:

  ------(buffer)------  --(ret)---
  DDDDDDDDEEEEEEEEEEEE  EEEE  FFFF
  89ABCDEF0123456789AB  CDEF  0123
  this is a string
  ------(buffer)------  --(ret)---
  DDDDDDDDEEEEEEEEEEEE  EEEE  FFFF 
  89ABCDEF0123456789AB  CDEF  0123
  oh no you got hacked  cadf  aff0 
  ------(buffer)------  --(ret)---
  DDDDDDDDEEEEEEEEEEEE  EEEE  FFFF 
  89ABCDEF0123456789AB  CDEF  0123
  dekcah tog uoy on ho  bff5  a400 (no harm to ret pointer)
bff5 a400

Puoi evitarlo mettendo il valore iniziale della stringa nell'ultimo (o, se ci sono altre variabili, più vicino all'ultimo) slot di memoria (EB) e facendo ogni lettera successiva ogni slot precedente? Per esempio.

%pre%

Capisco che ci sono preempts di overflow dello stack migliori e più largamente accettati (canarini, noexec, ASLR). Mi sto solo chiedendo. Questo risolverebbe il problema? Sarebbe tecnicamente fattibile?

    
posta Tony 09.09.2016 - 04:05
fonte

2 risposte

2

Se il tuo codice non protegge dalla scrittura in spazi di memoria adiacenti, allora no non puoi invertire l'ordine ed essere protetto da un buffer overflow. L'inversione del modo in cui la stringa viene archiviata modifica semplicemente l'accordo del payload dello shellcode (ad esempio, il payload potrebbe venire prima e il NOPS [ x%code% ] potrebbe andare in ultimo). In questo modo:

x\DEx\ADx\BEx\EF\x00x

x%bl0ck_qu0te%x%bl0ck_qu0te%x%bl0ck_qu0te%x\DEx\ADx\BEx\EF

x%bl0ck_qu0te%

vs

%bl0ck_qu0te%

Come hai detto, esistono pratiche di codifica molto più efficaci che proteggono dagli overflow del buffer.

    
risposta data 09.09.2016 - 05:32
fonte
0

Probabilmente si fermerebbero alcuni attacchi che si basano sullo sfruttamento di strcpy e simili (quando si copia qualcosa nello stack) perché se si scrive nella direzione opposta dell'indirizzo di ritorno nello stack, almeno non si può sovrascrivere direttamente. Ti permetterebbe comunque di sovrascrivere altre cose nello stack - forse i puntatori - tra molte altre cose. Inoltre non protegge da memcpy e molte altre cose. Le code di stack funzionano praticamente contro ogni overflow del buffer. Tuttavia, gli stack stack non impediscono a un utente malintenzionato di sovrascrivere altri puntatori nello stack. Il che significa che puoi ancora controllare i puntatori sullo stack e utilizzare questi puntatori e altre cose nel codice per scrivere in posizioni di memoria arbitrarie incluso l'indirizzo di ritorno nello stack.

    
risposta data 09.09.2016 - 13:33
fonte

Leggi altre domande sui tag