Instrumentacion – S3lab http://s3lab.deusto.es S3lab Security Blog Wed, 06 May 2020 12:51:35 +0000 es hourly 1 https://wordpress.org/?v=5.1.5 Instrumentación dinámica de binarios http://s3lab.deusto.es/instrumentacion-dinamica-binarios/ Fri, 06 Jul 2018 12:53:11 +0000 http://s3lab.deusto.es/?p=9952 En el post anterior hablamos sobre las posibilidades para instrumentar programas y llevar a cabo todo tipo de tareas como profiling o detección de vulnerabilidades. También introdujimos Intel Pin, una herramienta de instrumentación dinámica de binarios (principalmente para IA32 y

The post Instrumentación dinámica de binarios appeared first on S3lab.

]]>
En el post anterior hablamos sobre las posibilidades para instrumentar programas y llevar a cabo todo tipo de tareas como profiling o detección de vulnerabilidades. También introdujimos Intel Pin, una herramienta de instrumentación dinámica de binarios (principalmente para IA32 y x86_64), sobre la que vamos a hablar en esta entrega. Al igual que un debugger, Pin puede lanzar una aplicación o se puede fijar a un proceso en ejecución, intrumentarlo como sea necesario, recoger la información de interés y separarse en cualquier momento para que pueda seguir con su ejecución normal. Para tener control sobre el proceso instrumentado utiliza llamadas a ptrace() (en Linux) que ya vimos en un post anterior. La arquitectura general de Intel Pin es la que se muestra en la figura pero para más detalle recomiendo leer el artículo original.

La instrumentación se realiza a través de un compilador JIT. Pin compila el código de la aplicación desde una ISA directamente a la misma sin pasar por una representación intermedia. Las unidades de traducción son trazas, por lo que se compila una traza cada vez, que consisten en una secuencia lineal de instrucciones que termina en: (1) una transferencia de control incondicional, (2) un número predefinido de transferencias de control condicionales, o (3) un número predefinido de instrucciones en una misma traza. El único código que se ejecuta es el generado por Pin, utilizando el original solamente como referencia, por lo que cada vez que el compilador JIT obtiene código, la Pintool (que es como se llaman las herramientas que utilizan Pin) tiene la oportunidad de instrumentarlo antes de ser traducido para su ejecución, guardando el código generado y el de instrumentación en una caché de código.

Todo el software necesario se puede descargar desde la web oficial. Una vez descomprimido, un buen punto de partida es echar un vistazo a los ejemplos disponibles en source/tools/ManualExamples entre los que se encuentra por ejemplo un contador de instrucciones: inscount0.cpp. Si nos fijamos en la función main, además de otras llamadas a funciones, la que más nos interesa en este caso es INS_AddInstrumentFunction, que recibe como parámetros un callback de instrumentación a llamar por cada instrucción y sus respectivos parámetros.

En la implementación de la función Instruction, a través de INS_InsertCall se añade una llamada a la función docount() que simplemente incrementa en 1 una variable global que almacena el número total de instrucciones.

El segundo parámetro de la llamada (IPOINT_BEFORE) resulta interesante puesto que nos permite especificar cuando insertar la llamada a docount(), siendo las alternativas IPOINT_AFTER y IPOINT_TAKEN_BRANCH, aunque en este caso IPOINT_BEFORE es la mejor opción porque solo estamos contando instrucciones. Este es el ejemplo más simple dentro de todos los que nos proporciona Intel, por lo que antes de empezar a desarrollar nuestra Pintool es recomendable examinar el resto de ejemplos.

The post Instrumentación dinámica de binarios appeared first on S3lab.

]]>
Opciones de instrumentación de programas http://s3lab.deusto.es/instrumentacion-de-programas/ Mon, 14 May 2018 13:00:34 +0000 http://s3lab.deusto.es/?p=9869 Muchos de los métodos de software testing y análisis dinámico de programas (no necesariamente relacionados con seguridad) requieren insertar algunas instrucciones adicionales en el texto del programa para obtener información añadida, es decir, instrumentar el programa. Por ejemplo, una de

The post Opciones de instrumentación de programas appeared first on S3lab.

]]>
Muchos de los métodos de software testing y análisis dinámico de programas (no necesariamente relacionados con seguridad) requieren insertar algunas instrucciones adicionales en el texto del programa para obtener información añadida, es decir, instrumentar el programa. Por ejemplo, una de las opciones a la hora de medir el rendimiento de una aplicación es añadir sentencias para leer el reloj al principio y al final de cada función de forma que se pueda calcular el tiempo que tarda en ejecutarse cada una y después optimizar las que tarden más de lo debido. Por poner otro ejemplo, dentro del proceso de software testing es un hábito muy común tener métricas de cobertura de código, dicho de otra forma, medir cuanto código está siendo realmente testeado. Para ello, si quisieramos comprobar si nuestros tests ejecutan todos los puntos de ramificación posibles (branch coverage), se podrían añadir al código sentencias que contasen el número de veces que se ha tomado cada rama (cuando la condición es true y cuando es false).

Por lo tanto, instrumentación se refiere a la técnica que consiste en añadir código extra a un programa, normalmente con el objetivo de recoger información sobre su comportamiento durante la ejecución y enviarla a rutinas de análisis que se encargan de manipular dicha información para llevar a cabo tareas que van desde profiling, detección de errores o debugging, hasta análisis de malware.

La instrumentación se puede llevar a cabo desde distintos niveles: directamente en el código fuente, en una representación intermedia como bytecode o LLVM IR, o a nivel de binario. Como curiosidad, en los últimos años se han desarrollado varias herramientas de detección de errores como MemorySanitizer que implementan una fase de instrumentación sobre la representación intermedia en tiempo de compilación.

Por otra parte, también es importante mencionar que la instrumentación puede ser estática o dinámica. En una situación en la que solo se dispone de un binario, se puede instrumentar de forma estática mediante binary rewriting como lo hacen herramientas como PEBIL, se puede hacer de forma dinámica sobrescribiendo instrucciones en memoria por trampolines que saltan al código de instrumentación, o siguiendo el concepto de Dynamic Binary Translation (de una ISA a la misma) como lo hace Intel Pin, por ejemplo. Cada uno de los métodos tiene sus ventajas e inconvenientes dependiendo de la tarea que se quiera llevar a cabo (analizar malware tiene requisitos de transparencia que algunas soluciones no pueden cumplir) y de lo recursos disponibles (no vamos a instrumentar el código fuente si no está disponible).

The post Opciones de instrumentación de programas appeared first on S3lab.

]]>