Revisamos de forma cada tutorial en nuestra web con el objetivo de enseñarte en todo momento información más veraz y actualizada.
Solución:
La función incorporada de cpython id () devuelve una identificación única para cualquier objeto, que no es exactamente su dirección de memoria, pero es lo más cerca que puede llegar a tal.
Por ejemplo, tenemos la variable x. id(x) no devuelve la dirección de memoria de la variable x, sino la dirección de memoria del objeto al que apunta x.
Hay una separación estricta entre ‘variables’ y ‘objetos de memoria’. En la implementación estándar, python asigna un conjunto de locales y una pila para que opere la máquina virtual. Todas las ranuras locales están separadas, por lo que si carga un objeto de la ranura x local en la pila y modifica ese objeto, la “ubicación” de la ranura x no cambia.
http://docs.python.org/library/functions.html#id
Esto parece una tarea imposible al menos en python. Hay algunas cosas a tener en cuenta de esta pregunta:
- ASLR haría esto completamente imposible
- Cada binario puede tener su propia sobrecarga, diferente argv, por lo tanto, la única opción confiable es ejecutar el binario y rastrear su memoria hasta que encontremos la variable de entorno que estamos buscando. Básicamente, incluso si podemos encontrar la dirección del entorno en el proceso de python, estaría en una posición diferente en el binario que está tratando de explotar.
La mejor opción para responder a esta pregunta es usar http://python3-pwntools.readthedocs.io/en/latest/elf.html, que toma un archivo de volcado del núcleo donde es fácil encontrar la dirección.
Supongo que podrías hacerlo usando el ctypes
modulo para llamar al nativo getenv
directamente:
import ctypes
libc = ctypes.CDLL("libc.so.6")
getenv = libc.getenv
getenv.restype = ctypes.c_voidp
print('%08x' % getenv('PATH'))