¿Se puede evitar el desbordamiento de pila almacenando cadenas en la memoria hacia atrás?

2

Uso normal:

  ------(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

Pila desbordada:

  ------(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

¿Podría evitar esto colocando el valor inicial de la cadena en la última (o, si hay otras variables, la más cercana a la última) ranura de memoria (EB) y haciendo cada letra subsiguiente cada ranura anterior? P.ej.

%pre%

Entiendo que hay preferencias de desbordamiento de pila mejores y más aceptadas (canaries, noexec, ASLR). Sólo me pregunto. ¿Esto solucionaría el problema? ¿Sería técnicamente viable?

    
pregunta Tony 09.09.2016 - 04:05
fuente

2 respuestas

2

Si su código no protege de la escritura en espacios de memoria adyacentes, entonces no puede revertir el orden y estar protegido de un desbordamiento de búfer. Revertir la forma en que se almacena la cadena simplemente cambia la disposición de la carga útil del código de shell (es decir, la carga útil puede aparecer primero y el NOPS [ x%code% ] puede ir en último lugar). Así:

  

x \ DEx \ ADx \ BEx \ EF \ x00x \ 00x \ 00

vs

  

x \ 00x \ 00x \ 00x \ DEx \ ADx \ BEx \ EF

Como mencionó, existen prácticas de codificación mucho mejores que protegen contra los desbordamientos de búfer.

    
respondido por el HashHazard 09.09.2016 - 05:32
fuente
0

Probablemente detendría algunos ataques que se basan en explotar strcpy y similares (al copiar cosas en la pila) porque si escribes en la dirección opuesta a la dirección de retorno en la pila, al menos no puedes sobrescribir que directamente Todavía le permitiría sobrescribir otras cosas en la pila, posiblemente punteros, entre muchas otras. También no protege contra memcpy y muchas otras cosas. Los cannaries de pila funcionan bastante contra cada desbordamiento de búfer. Sin embargo, los canarios de la pila no impiden que un atacante sobrescriba otros punteros en la pila. Lo que significa que aún puede controlar los punteros en la pila y usar estos punteros y otras cosas en el código para escribir en ubicaciones de memoria arbitrarias, incluida la dirección de retorno en la pila.

    
respondido por el mroman 09.09.2016 - 13:33
fuente

Lea otras preguntas en las etiquetas