Cálculo de la dirección de la memoria de desbordamiento de búfer en 64 bits

3

Tengo una asignación donde debo explotar una vulnerabilidad de desbordamiento de búfer en una máquina remota. Solo tengo permiso de ejecución en el programa, así que no puedo usar gdb. Me las arreglé para tomar el control de la copia y puedo desbordar y escribir con éxito mi propia dirección. Mi shellcode está listo (tiene la pila ejecutable y ASLR deshabilitado) pero no puedo encontrar la dirección correcta para regresar. Es una máquina de 64 bits, por lo que el relleno nop no es una opción. El objetivo principal es acceder a un archivo de registro que el ejecutable actualiza cada vez que se ejecuta. (Es una misión universitaria, no te preocupes por acciones ilegales)

¿Qué puedo hacer? ¿Hay una manera de calcular la dirección de memoria del búfer, o de otra manera? Cualquier ayuda sería apreciada

    
pregunta George Sp 29.05.2017 - 10:35
fuente

1 respuesta

3

Si se relaciona con gdb y puede controlar rip, entonces está a un paso de la solución.

Hagamos un pequeño ejemplo

void main() {
  char* buff = "asdf";
}

compilalo

$ gcc test.c

y luego usar el depurador

$ gdb a.out
 (gdb) set disassembly-flavor intel
(gdb) disassemble main
Dump of assembler code for function main:
 0x00000000004004d6 <+0>:   push   rbp
 0x00000000004004d7 <+1>:   mov    rbp,rsp
 0x00000000004004da <+4>:   mov    QWORD PTR [rbp-0x8],0x400574
 0x00000000004004e2 <+12>:  nop
 0x00000000004004e3 <+13>:  pop    rbp
 0x00000000004004e4 <+14>:  ret    
End of assembler dump.

Así que nuestra variable buff está en rbp-0x8 en la pila. Si ASLR está deshabilitado, la dirección es siempre la misma. Lo puedes conseguir con:

(gdb) break *0x00000000004004e2
Breakpoint 1 at 0x4004e2
(gdb) r
Starting program: ./a.out 
Breakpoint 1, 0x00000000004004e2 in main ()
(gdb) p $rbp-0x8
$1 = (void *) 0x7fffffffdbd8
    
respondido por el ATetereb 29.05.2017 - 12:01
fuente

Lea otras preguntas en las etiquetas