El contexto:
Tengo una pequeña pregunta con respecto a ESP y violación de acceso. Acabo de explotar un desbordamiento de búfer, con poco espacio después de ESP. Así que hice esto:
parte 1: NOP SLED
parte 2: mi shellcode: una carga útil shikata_ga_nai codificada reverse_tcp, por metasploit
parte 3: algunos NOP más para llenar el espacio
parte 4: 4 bytes que sobrescriben el EIP guardado en la pila. Esta es la dirección de una instrucción ESP de salto en un segmento no protegido por ASLS.
parte 5: [Aquí es donde ESP apunta en el momento del accidente] Tengo algo de NOP
parte 6: la primera etapa de mi exploit:
para la primera etapa, evitando \ x00 bytes, lo hice:
mov eax,esp
sub eax,944 (point to the part1 : the NOP sled)
jmp eax
Funcionó bien: la pila se sobrescribe, EIP va a la instrucción jmp ESP, llega a la parte 6 del exploit, salta a EAX, que apunta a la parte 1 del exploit, y luego ejecuta el NOP para llegar al shellcode.
problema: obtuve una infracción de acceso dentro del decodificador shikata_ga_nai.
Lo resolví, agregando un mov esp, eax en la primera etapa:
mov eax,esp
sub eax,944 (point to the part1 : the NOP sled)
mov esp,eax
jmp esp
Y funcionó a la perfección. Eso significa que uno no puede jugar con la memoria en direcciones más bajas que ESP.
La pregunta:
¿ESP tiene realmente algo que ver con el permiso de lectura / escritura dentro (fuera de la pila)? La memoria allí fue asignada, así que la usé. ¿Tiene EBP u otro registro algo que ver con la violación de acceso?