Desbordamiento de búfer, falla SIGV en dirección incorrecta

0

Estoy tratando de entender por qué el desbordamiento de búfer no funciona. He estado luchando con esto por unos días, así que pensé que ya era hora de preguntar a los profesionales. Hace poco empecé a comprender el concepto de ataques de desbordamiento de búfer con un trineo NOP.

Esto es para un desafío. No se permiten spoilers, pero los punteros útiles serán muy apreciados.

Mi problema es este:

Puedo ejecutar un comando de Perl como este NOP ... Shellcode ... *mempntr , esto funciona como se esperaba cuando le doy un puntero arbritario.

  • Donde las cosas azules son mis NOP's
  • El rojo es mi código de shell
  • El amarillo resaltado es mi mempntr
Program received signal SIGSEGV, Segmentation fault.
0xaaaaaaaa in ?? ()

Eso también es lo esperado.

Prueba con mempntr

Ahora, cuando intento cambiar el mempntr a algo a lo que quiero señalarlo, como a mitad del trineo NOP, por ejemplo, la ubicación 0xffffd580 de las cosas se comportan de manera extraña.

En el punto de interrupción en leave , verifico el eip guardado

(gdb) i f
Stack level 0, frame at 0xffffd5c0:
eip = 0x80484b1 in main; saved eip = 0xffffd580
Arglist at 0xffffd5b8, args:
Locals at 0xffffd5b8, Previous frame's sp is 0xffffd5c0
Saved registers:
ebp at 0xffffd5b8, eip at 0xffffd5bc

Sin embargo, cuando c o continue tengo un SEGFUALT en una ubicación rara.

Program received signal SIGSEGV, Segmentation fault.
0xffffd5a7 in ?? ()

Estoy buscando una respuesta que pueda arrojar algo de luz sobre esto o señalarme un recurso donde pueda aprender lo que está sucediendo.

    
pregunta Ludisposed 22.11.2017 - 16:46
fuente

1 respuesta

2

Esa ubicación no es rara, está justo en el medio de tu código de shell. Primero verifica que tu shellcode no esté roto. El desmontaje de ese código revela esto:

0x00000000: push 0xb
0x00000002: pop eax
0x00000003: cdq 
0x00000004: push edx
0x00000005: push 0x702d
0x00000009: mov ecx, esp
0x0000000b: push edx
0x0000000c: push 0x68
0x0000000e: das 
0x0000000f: bound esp, qword ptr [ecx + 0x73]
0x00000012: push 0x6e69622f
0x00000017: mov dword ptr [ebp + 0x33], esp
0x0000001a: push edx
0x0000001b: push ecx
0x0000001c: push ebx
0x0000001d: mov ecx, esp
0x0000001f: int 0x80

¿Estás seguro de que esto es lo que realmente quieres lograr con tu código de shell?

En segundo lugar, asegúrese de que cualquier instrucción de su código de shell no esté sobrescribiendo partes de sí mismo. Si el puntero de la pila está justo después de su código de shell, las instrucciones de inserción podrían eliminarlo de su cola, dejando instrucciones no válidas para ejecutar.

    
respondido por el rhodeo 23.11.2017 - 05:20
fuente

Lea otras preguntas en las etiquetas