sendero de pingüinos Diseñado para ayudar a comprender cómo se ejecutan los programas a nivel de hardware. Proporciona una manera de ver en qué instrucciones se compilan, luego recorrer esas instrucciones y ver cómo afectan el estado de la máquina y cómo se asigna a las variables en el programa original.más antecedentes Disponible en el sitio web.
penguinTrace inicia un servidor web que proporciona una interfaz web para editar y ejecutar código. El código se puede desarrollar en C, C++ o ensamblador. A continuación, se muestra el ensamblaje resultante, que luego se puede realizar en un solo paso, y muestra los valores de los registros de hardware y las variables en el ámbito actual.
penguinTrace se ejecuta en Linux y es compatible con las arquitecturas AMD64/X86-64 y AArch64. penguinTrace se puede ejecutar en otros sistemas operativos utilizando Docker, una máquina virtual o a través de Windows Subsystem for Linux (WSL).
El objetivo principal de penguinTrace es permitir la exploración de cómo se ejecuta un programa en un procesador, pero el desarrollo brinda la oportunidad de explorar algunos detalles de nivel inferior sobre cómo funciona un depurador e interactúa con el kernel.
notas: penguinTrace permite ejecutar código arbitrario dentro de su diseño. De manera predeterminada, solo escuchará las conexiones de la máquina local. Solo debe configurarse para escuchar conexiones remotas en redes confiables y no debe estar expuesto a interfaces.Esto se puede mitigar ejecutando penguinTrace en el contenedor y puede proporcionar un grado limitado de aislamiento del código paso a paso en los siguientes casos libcap
disponible.
Tabla de Contenidos
empezando
requisitos previos
penguinTrace requiere Linux de 64 bits ejecutándose en un procesador X86-64 o AArch64. También se ejecuta en una Raspberry Pi con una distribución de Linux de 64 bits (AArch64). Para otros sistemas operativos, puede ejecutarse en Windows 10 utilizando Windows Subsystem for Linux (WSL) o contenedores Docker. WSL no admite el aislamiento de procesos de seguimiento.
python clang llvm llvm-dev libclang-dev libcap-dev # For containment
Hospedarse
Para compilar penguinTrace fuera del contenedor, clone el repositorio y ejecute make
Los binarios se colocarán en build/bin
defecto.
Para compilar penguinTrace en Docker, ejecuta docker build -t penguintrace github.com/penguintrace/penguintrace
.
Correr
Una vez que penguinTrace esté construido, ejecute penguintrace
binary iniciará el servidor.
Si está integrado en el contenedor, puede usar docker run -it -p 127.0.0.1:8080:8080 --tmpfs /tmp:exec --cap-add=SYS_PTRACE --cap-add=SYS_ADMIN --rm --security-opt apparmor=unconfined penguintrace penguintrace
. Mirar envase Detalles sobre un mejor aislamiento de los contenedores.
luego navegue a 127.0.0.1:8080 o servidor local: 8080 Acceda a la interfaz web.
notas: Para ejecutar en el puerto 80, puede modificar docker run
Un comando para mapear del puerto 8080 al puerto 80, p. -p 127.0.0.1:80:8080
.
Si construye localmente, puede modificar el binario para permitir que se enlace al puerto 80 sudo setcap CAP_NET_BIND_SERVICE=+ep penguintrace
puede entonces ejecutar penguintrace -c SERVER_PORT 80
penguinTrace usa el puerto 8080 de forma predeterminada porque está diseñado para ejecutarse como un usuario sin privilegios.
Archivos temporales
El servidor penguinTrace utiliza el directorio temporal del sistema como la ubicación de los archivos binarios compilados y el entorno en el que se ejecuta el proceso de seguimiento.si PENGUINTRACE_TMPDIR
Las variables de entorno están definidas, se utilizará este directorio.volverá a caer TMPDIR
variables de entorno y, finalmente, el directorio especificado en la biblioteca C.
Esto debe corresponder a un directorio, no noexec
Configuración, si se ejecuta en un contenedor, el sistema de archivos puede establecer esto de forma predeterminada.
redes
Por defecto, penguinTrace solo escucha en dispositivos loopback e IPv4. Si el servidor está configurado para escuchar en todas las direcciones, también establecer el servidor en IPv6 permitirá conexiones tanto en IPv4 como en IPv6, que es el modo predeterminado cuando se ejecuta en un contenedor Docker.
Esto se debe a que penguinTrace solo crea un hilo para escuchar las conexiones, por lo que actualmente solo puede vincularse a una sola dirección o a todas las direcciones.
manejo de sesiones
Por defecto, penguinTrace se ejecuta en modo multisesión, creando una nueva sesión cada vez que se compila el código. El fragmento de URL de la interfaz de usuario (después de «#») se actualiza con el ID de sesión, y esta URL se puede usar para volver a conectarse a la misma sesión.
Si se ejecuta en modo de sesión única, cada instancia de penguinTrace solo admite una única instancia de depuración. La interfaz de usuario web se volverá a conectar automáticamente a la sesión anterior. Para admitir varias sesiones, debe iniciar varias instancias escuchando en diferentes puertos.
envase
Este docker_build.sh
y docker_run.sh
El script proporciona un ejemplo de cómo ejecutar penguinTrace en un contenedor Docker. Dockerfile_noisolate
Proporciona un modo alternativo de operación que no requiere SYS_ADMIN
capacidades, pero proporciona menos aislamiento entre el servidor y el proceso rastreado.Este SYS_PTRACE
Los servidores siempre necesitan la capacidad de realizar un seguimiento de los procesos. misc/apparmor-profile
Se proporciona un archivo de configuración de AppArmor de muestra, que es adecuado para ejecutar penguinTrace, pero puede requerir cierta personalización del directorio temporal y la ubicación del compilador.
AArch64 / Frambuesa Pi
penguinTrace solo se ejecuta en sistemas operativos de 64 bits.El sistema operativo oficial provisto para Raspberry Pi es de 32 bits, ejecuta penguinTrace y similares pi64 o Brazo Arch Linux es requerido.
Instrucciones completas para configurar un sistema operativo de 64 bits en una Raspberry Pi TBD.