¿Por qué tenemos que colocar el shellcode antes de la dirección de retorno en el desbordamiento del búfer?

2

Me gustaría saber por qué tenemos que colocar el código de shell antes de la dirección de retorno en un desbordamiento de búfer. Lógicamente, la dirección de retorno apuntará al código de shell y se ejecutará, por lo que la dirección de retorno se debe colocar antes del código de shell. ¿Alguien me puede explicar?

    
pregunta Scoobydoo 26.09.2015 - 20:58
fuente

2 respuestas

2

El desbordamiento del búfer, por definición, debe desbordar el búfer. Esto es para sobrescribir la dirección de retorno al final.

Esto proporciona una ubicación conveniente en la que se puede eliminar el código de shell. Si intentara agregarlo luego, podría sobrescribir otra dirección de memoria y luego el programa se bloquearía de una manera diferente.

Por lo tanto, agregar el código de shell antes de la dirección de retorno permite escribir la dirección de retorno para activar un salto al código de shell previamente escrito. En resumen, el búfer que está desbordando es a menudo la ubicación perfecta para escribir su código de shell sin sobrescribir otro bit importante de memoria.

    
respondido por el SilverlightFox 26.09.2015 - 23:42
fuente
2

La razón por la que coloca el código de shell antes de la dirección de retorno en su vulnerabilidad de desbordamiento de búfer depende de algunos factores:

  • El tamaño del búfer
  • El flujo de la aplicación
  • Cualquier truco más allá de un simple búfer + dirección de retorno como tener que hacer saltos relativos requerirá un poco de delicadeza

Un ejemplo común de un desbordamiento de búfer puede verse así:

"\x41"*1000 + "\xe7\x51\x78\xa2" + "\x90"*16 + "[shellcode]"

Aquí, he desbordado el búfer con 1000 A, he aterrizado en un lugar donde puedo controlar el EIP para que apunte a una ubicación de mi elección, seguido de algunos NOP para darle espacio a mi Shellcode para desempaquetar, y luego, finalmente, el código ejecutable . Esta es una hazaña relativamente sencilla. La dirección de retorno normalmente sería una instrucción JMP ESP, que se encuentra al comienzo de su trineo NOP. El trineo funciona hasta que llega al código de shell, y como la pila crece, sobrescribe el trineo NOP mientras se desempaqueta y se obtiene la ejecución.

Sin embargo, puede ser que a veces no tengas ese tipo de ruta de explotación y tengas que hacer algo diferente:

"\x90"*16 + [shellcode] + "\x90"*400 + [return address] + "\x90"*5

Aquí tenemos que poner nuestro código de shell al principio porque no es posible un simple JMP ESP. En su lugar, tenemos que encontrar otra instrucción que nos permita saltar al principio para obtener la ejecución. Luego tenemos algo de relleno en ambos extremos de la dirección de retorno.

Así que la respuesta, sin más detalles, es "depende". Depende de la situación específica, con qué trabaje en su exploit, la sala que tenga y el comportamiento de la aplicación en cuestión.

    
respondido por el user79537 27.09.2015 - 00:07
fuente

Lea otras preguntas en las etiquetas