Ahora que ya tenemos unos vastos conocimientos sobre ASM y C podemos proceder a arrancar nuestro kernel, los pasos a seguir serán:
C nos permite utilizar punteros, mediante estas variables podremos almacenar direcciones de memoria en vez de datos directamente, posteriormente se puede hacer referencia a estas direcciones de memoria para escribir o leer en ellas.
La programación en ensamblador nos permite un control absoluto sobre el hardware, pero avanzar en este lenguaje es un proceso muy lento además nuestro código es tan específico para la CPU que estemos utilizando que lo hace poco portable a otras arquitecturas. Por ese motivo utilizaremos C para la mayoría de código de nuestro SO, en este artículo veremos como C gestiona la pila y la definición de variables.
Gef es un set de comandos y ayudas visuales que hacen que GDB sea mucho mas atractivo, es muy similar a peda pero gef soporta mas arquitecturas: X86, ARM, MIPS, PowerPC y SPARC de este modo si hacemos reversing de firmwares también nos servirá ya que la mayoría de sistemas empotrados llevan un microprocesador MIPS o ARM. Está muy enfocado al reversing pero para debugear también nos será de gran ayuda.
Para aprovechar la totalidad de la CPU debemos pasar a modo protegido de 32 bits, las funcionalidades extra que nos ofrece este modo son:
Para poder cargar el SO desde nuestro bootloader tendremos que ser capaces de leer desde el disco, almacenar esta información en la memoria RAM y finalmente ejecutar las instrucciones que hemos cargado, en este artículo aprenderemos como leer y cargar estos datos.
En este artículo aprenderemos como funciona un microprocesador en su fase de arranque mas temprana(modo real 16bits), también comprenderemos porque con un microprocesador que tiene registros de 16 bits no es capaz de direccionar mas de 64KB de RAM y como aumentar este límite a 1MB gracias a la segmentación de memoria.
Desde el punto de vista de la CPU una función no es mas que un salto a una dirección de memoria donde se encuentran las intrucciones de una rutina y un salto de retorno a la instrucción inmediatamente posterior al primer salto. En este artículo explicaré como se deben de llamar a las funciones para que sean reutilizables y que sea seguro su uso.
Una de las estructuras mas básicas cuando se empieza a programar son las sentencias if, en este artículo explicaré un ejemplo muy sencillo en pseudocódigo y como traducirlo a ensamblador.
Todos conocemos las ventajas de utilizar binarios compilados a medida:
El único inconveniente es el tiempo requerido para la compilación, pero y si dispusiésemos de un equipo con mayor potencia para realizar la compilación y utilizar estos binarios en nuestro servidor? Precisamente Poudriere se ocupa de esta tarea, compila binarios a medida desde los ports para que sean utilizados por otros equipos.