Thursday 26 October 2017

0x09 Binary Options


Formatted Data Format Valores de punto flotante de doble precisión (codificados de acuerdo con la norma IEEE 754). Cuando Elementos o Grupo se establecen en Predeterminado, sus valores se toman de la ventana actual del editor. Combo Columnas le permite especificar el número de valores en una fila. Si se selecciona Predeterminado, se toma de la ventana actual del editor. El conmutador de direcciones se puede utilizar para incluir direcciones de fila en la salida. Interruptor de panel de texto incluye el panel de texto en la salida también. El panel de texto sólo se incluye si el tamaño del tipo de elemento es uno o dos bytes. En este último caso, el texto de Unicode aparece en el panel de texto. El texto se separa de la lista de valores por el carácter de tabulación (0x09). Ambas opciones están disponibles sólo para texto separado por espacio y formatos de salida de texto separados por comas. Utilice el combo Tipo para seleccionar un formato de salida: Sin separadores Los datos seleccionados se codifican en una secuencia de texto: Texto separado por espacio Los datos seleccionados se codifican en una lista de valores separados por espacios. A continuación se muestra un texto de ejemplo (las direcciones y las opciones del panel de texto se desactivan): A continuación se muestra un texto de ejemplo (las opciones de direcciones y de panel de texto están activadas): Texto separado por comas Los datos seleccionados se codifican en una lista de valores separados por comas. A continuación se muestra un ejemplo de texto (las direcciones y las opciones de panel de texto se desactivan): A continuación se muestra un texto de ejemplo (las direcciones y las opciones del panel de texto están activadas): Matriz C / C Los datos seleccionados se convierten en inicialización de matriz C / Los datos seleccionados se convierten en inicialización de matriz de Java: o matriz de Javascript Los datos seleccionados se convierten en inicialización de matriz de Javascript: o Delphi Los datos seleccionados se convierten en inicialización de matriz de Delphi: Matriz. NET Los datos seleccionados se convierten en la inicialización de la matriz de Visual Basic: o matriz de PHP Los datos seleccionados se convierten en la inicialización del arsenal del PHP: Arsenal del ensamblador Los datos seleccionados se convierten en la inicialización de la matriz del lenguaje de ensamblador: Copyright 2014 HHD Software. Todos los derechos reservados. December 09, 2014 Este fin de semana pasado participé en Ludum Dare 31. Antes de que el tema fue anunciado, debido a la fascinación reciente, quería hacer un juego de DOS de la vieja escuela. DOSBox sería la plataforma de destino ya que es la forma más práctica de ejecutar las aplicaciones DOS, a pesar de las modernas CPUs x86 sigue siendo totalmente compatible con todo el camino de vuelta a la de 16 bits 8086. Creé con éxito y presentó un juego DOS llamado DOS Defender. Es un programa COM COM DOS de 32 bits. Todos los activos están incrustados en el ejecutable y no hay dependencias externas, por lo que todo el juego está empaquetado en ese binario de 10 KB. Youll necesidad de un joystick / gamepad para jugar. He incluido soporte de ratón en el lanzamiento de Ludum Dare con el fin de que sea más fácil de revisar, pero esto se eliminó porque no funciona bien. La parte más interesante técnicamente es que no necesitaba herramientas de desarrollo de DOS para crear esto. Solo usé mi compilador de Linux C (gcc) cada día. Realmente no es posible construir DOS Defender en DOS. En cambio, Im tratamiento de DOS como una plataforma integrada, que es la única forma en la que DOS todavía existe en la actualidad. Junto con DOSBox y DOSEMU. Esta es una cadena de herramientas bastante cómoda. Si lo único que le importa es cómo hacerlo usted mismo, vaya a la sección Trucking GCC, donde escribirá bien un programa Hello, World DOS COM con Linux GCC. Encontrar las herramientas adecuadas No tuve GCC en mente cuando empecé este proyecto. Lo que realmente desencadenó todo esto fue que me había dado cuenta de Debians bcc paquete, Bruces C Compiler, que construye 16 bits binarios 8086. Se mantiene alrededor de la compilación de cargadores de arranque x86 y tal, pero también se puede utilizar para compilar DOS archivos COM, que fue la parte que me interesó. Para algunos antecedentes: el Intel 8086 era un microprocesador de 16 bits lanzado en 1978. No tenía ninguna de las características de lujo de la CPU de hoy: no hay protección de memoria, no hay instrucciones de punto flotante, y sólo hasta 1 MB de RAM direccionable. Todos los ordenadores de sobremesa x86 y portátiles modernos todavía pueden pretender ser un microprocesador de 16 bits 8086 de 40 años de antigüedad, con el mismo direccionamiento limitado y todo. Esa es cierta compatibilidad hacia atrás serio. Esta función se denomina modo real. Es el modo en el que todas las computadoras x86 arrancan. Los sistemas operativos modernos cambian al modo protegido lo antes posible, lo que proporciona un direccionamiento virtual y una multitarea segura. DOS no es uno de estos sistemas operativos. Desafortunadamente, bcc no es un compilador ANSI C. Soporta un subconjunto de KampR C, junto con el montaje en línea x86. A diferencia de otros compiladores de 8086 C, no tiene idea de punteros largos o largos, por lo que el montaje en línea es necesario para acceder a otros segmentos de memoria (VGA, reloj, etc.). Nota: los restos de estos 8086 punteros largos todavía existen hoy en la API de Win32: LPSTR. LPWORD. LPDWORD. Etc El montaje en línea isnt en cualquier lugar tan agradable como GCCs en línea de montaje. El código de ensamblaje tiene que cargar manualmente las variables de la pila de modo que, dado que bcc soporta dos convenciones de llamada diferentes, el ensamblaje termina siendo codificado en una convención de llamada o en la otra. Dadas todas sus limitaciones, fui buscando alternativas. DJGPP DJGPP es el puerto DOS de GCC. Es un proyecto muy impresionante, que lleva casi todo POSIX a DOS. Los puertos DOS de muchos programas se construyen con DJGPP. Para lograr esto, sólo produce programas en modo protegido de 32 bits. Si un programa en modo protegido necesita manipular hardware (es decir, VGA), debe realizar las solicitudes a un servicio de interfaz en modo protegido de DOS (DPMI). Si he utilizado DJGPP, no podría hacer un solo, independiente binario como yo quería, ya que la necesidad de incluir un servidor DPMI. También hay una penalización de rendimiento para hacer solicitudes DPMI. Conseguir una cadena de herramientas de DJGPP puede ser difícil, para decirlo amablemente. Afortunadamente encontré un proyecto útil, build-djgpp. Que lo hace fácil, al menos en Linux. O bien hay un error grave o los binarios oficiales de DJGPP se han infectado de nuevo. Porque en mis pruebas seguí recibiendo el mensaje de error No COFF: comprobar los virus al ejecutar mis programas en DOSBox. Para comprobar que no es una infección en mi propia máquina, he creado una cadena de herramientas DJGPP en mi frambuesa Pi, para actuar como una sala limpia. Es imposible que este dispositivo basado en ARM se infecte con un virus x86. Todavía tenía el mismo problema, y ​​todos los hashes binarios coincidían entre las máquinas, así que no es mi culpa. Así que dada la cuestión de DPMI y lo anterior, seguí adelante. Trucking de GCC Lo que finalmente decidí es un truco ordenado que implica engañar a GCC para que produzca archivos COM DOS de modo real, siempre y cuando pueda apuntar a 80386 (como suele ser el caso). El 80386 fue lanzado en 1985 y fue el primer microprocesador x86 de 32 bits. GCC todavía se dirige a este conjunto de instrucciones hoy, incluso en la cadena de herramientas x86-64. Lamentablemente, GCC no puede producir código de 16 bits, por lo que mi objetivo principal de la orientación 8086 no sería alcanzable. Esto no importa, sin embargo, ya que DOSBox, mi plataforma deseada, es un emulador 80386. En teoría, esto debería funcionar sin cambios con MinGW, pero hay un error MinGW de larga data que le impide trabajar correctamente (no puede realizar operaciones de PE en archivos de salida no PE). Todavía es factible, y lo hice yo mismo, pero necesitarás soltar la directiva OUTPUTFORMAT y añadir un paso objcopy extra (objcopy - O binario). Hola mundo en DOS Para demostrar cómo hacer todo esto, vamos a hacer un DOS Hello, World COM programa utilizando GCC en Linux. Hay una carga significativa con esta técnica: no habrá una biblioteca estándar. Es básicamente como escribir un sistema operativo desde cero, excepto por los pocos servicios que ofrece DOS. Esto significa que no hay printf () ni nada parecido. En su lugar, pida al DOS que imprima una cadena al terminal. Hacer una petición a DOS significa disparar una interrupción, lo que significa que el montaje en línea DOS tiene nueve interrupciones: 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x2F. El grande y el que estaba interesado en, es 0x21, función 0x09 (cadena de impresión). Entre DOS y BIOS, hay miles de funciones llamadas de esta manera. Im que no va a intentar explicar el montaje de x86, pero en cortocircuito el número de la función se rellena en el registro ah y la interrupción 0x21 se enciende. La función 0x09 también toma un argumento, el puntero a la cadena que se va a imprimir, que se pasa en los registros dx y ds. Aquí está la función de impresión () del ensamblado en línea de GCC. Las cadenas pasadas a esta función deben terminarse con a. Por qué Por DOS. El conjunto se declara volátil porque tiene un efecto secundario (impresión de la cadena). Para GCC, el conjunto es un trozo opaco, y el optimizador se basa en las restricciones de salida / entrada / clobber (las tres últimas líneas). Para programas DOS como este, todo el montaje en línea tendrá efectos secundarios. Esto se debe a que no se está escribiendo para la optimización, sino para acceder al hardware y al DOS, cosas que no son accesibles a la llanura C. La atención también debe ser tomada por la persona que llama, porque GCC no sabe que la memoria apuntada por cadena es leída. Es probable que la matriz que respalda la cadena necesita ser declarada también volátil. Todo esto es presagiar lo que está por venir: hacer algo en este entorno es una lucha interminable contra el optimizador. No todas estas batallas pueden ser ganadas. Ahora para la función principal. El nombre de esta función no debería importar, pero estoy evitando llamar a main () ya que MinGW tiene ideas divertidas acerca de cambiar este símbolo en particular, incluso cuando se le pide que no lo haga. Los archivos COM están limitados a 65.279 bytes de tamaño. Esto se debe a que un segmento de memoria x86 es 64kB y los archivos COM simplemente se cargan por DOS a 0x0100 en el segmento y se ejecutan. No hay encabezados, es sólo un binario en bruto. Dado que un programa COM nunca puede ser de cualquier tamaño significativo, y no se necesita un enlace real (autónomo), todo se compilará como una unidad de traducción. Será una llamada a GCC con un montón de opciones. Opciones del compilador Aquí están las opciones esenciales del compilador. Dado que no hay bibliotecas estándar en uso, la única diferencia entre gnu99 y c99 es que los trigraphs están desactivados (como debería ser) y en línea de montaje se puede escribir como asm en lugar de asm. Es un obvio. Este proyecto estará tan estrechamente vinculado a GCC que no me importa usar las extensiones de GCC de todos modos. Estoy usando - Os para mantener la salida compilada tan pequeña como sea posible. También hará que el programa funcione más rápido. Esto es importante al orientar DOSBox porque, de forma predeterminada, se ejecutará deliberadamente tan lento como una máquina de los años ochenta. Quiero ser capaz de encajar en esa restricción. Si el optimizador está causando problemas, puede que necesite temporalmente hacer esto - O0 para determinar si el problema es su culpa o el fallo de los optimizadores. Usted ve, el optimizador no entiende que el programa se ejecutará en modo real, y bajo sus restricciones de direccionamiento. Realizará todo tipo de optimizaciones no válidas que rompen sus programas perfectamente válidos. No es un error GCC ya que estaban haciendo cosas locas aquí. Tuve que volver a trabajar mi código un número de veces para detener el optimizador de romper mi programa. Por ejemplo, tuve que evitar devolver estructuras complejas de funciones porque a veces se llenaban de basura. El verdadero peligro aquí es que una versión futura de GCC será más inteligente y romperá más cosas. En esta batalla, volátil es tu amigo. La siguiente opción es - nostdlib. Ya que no hay bibliotecas válidas para que podamos vincular, incluso de forma estática. Las opciones - m32 - marchi386 establecen el compilador para producir código 80386. Si estuviera escribiendo un cargador de arranque para un equipo moderno, la orientación 80686 también estaría bien, pero DOSBox es 80386. El argumento - ffreestanding requiere que GCC no emita código que llame a las funciones auxiliares de biblioteca estándar incorporadas. A veces, en lugar de emitir código para hacer algo, emite código que llama a una función incorporada para hacerlo, especialmente con operadores de matemáticas. Este fue uno de los principales problemas que tuve con bcc, donde este comportamiento no podría ser deshabilitado. Esto es más comúnmente usado en escribir bootloaders y kernels. Y ahora DOS archivos COM. Opciones de vinculador La opción - Wl se utiliza para pasar argumentos al vinculador (ld). Lo necesitamos ya que estaban haciendo todo esto en una llamada a GCC. El --nmagic desactiva la alineación de la página de las secciones. Uno, no necesitamos esto. Dos, eso desperdiciaría un espacio precioso. En mis pruebas no parece ser necesario, pero lo estoy incluyendo por si acaso. La opción --script indica al vinculador que queremos usar un script de vinculador personalizado. Esto nos permite establecer con precisión las secciones (texto, datos, bss, rodata) de nuestro programa. Aquí está el script com. ld. El OUTPUTFORMAT (binario) dice no poner esto en un archivo ELF (o PE, etc.). El enlazador sólo debe volcar el código en bruto. Un archivo COM es sólo código en bruto, por lo que esto significa que el vinculador producirá un archivo COM que había dicho que los archivos COM se cargan a 0x0100. La cuarta línea compensa el binario en esta ubicación. El primer byte del archivo COM seguirá siendo el primer byte de código, pero se diseñará para ejecutarse desde ese desplazamiento en memoria. Lo que sigue son todas las secciones, texto (programa), datos (datos estáticos), bss (datos inicializados por cero), rodata (cadenas). Finalmente marca el final del binario con el montón de símbolos. Esto será útil más tarde para escribir sbrk (). Después se hicieron con Hello, World. He pedido que la posición del montón esté alineada de 4 bytes. Casi estámos allí. Inicio del programa El enlazador suele tener conocimiento de nuestro punto de entrada (principal) y lo configura para nosotros. Pero ya que pedimos salida binaria, estábamos por nuestra cuenta. Si primero se emite la función print (), la ejecución de nuestros programas comenzará con la ejecución de esa función, que no es válida. Nuestro programa necesita una pequeña estrofa de encabezado para empezar. El script de enlazador tiene una opción STARTUP para manejar esto, pero para mantenerlo bien y ponerlo bien en el programa. Esto se llama generalmente crt0.o o Boot. o. En el caso de que esos nombres cada venir en su propia lectura. Esta asamblea en línea debe ser la primera cosa en nuestro código, antes de cualquier incluye y tal. DOS hará la mayor parte de la configuración para nosotros, realmente sólo tenemos que saltar al punto de entrada. El. code16gcc le dice al ensamblador que iba a estar funcionando en modo real, para que haga el ajuste correcto. A pesar del nombre, esto no lo hará producir código de 16 bits Primero llama dosmain. La función que escribimos anteriormente. Luego informa a DOS, usando la función 0x4C (terminación con código de retorno), que se realizó, pasando el código de salida en el registro de 1 byte al (ya establecido por dosmain). Este montaje en línea es automáticamente volátil porque no tiene entradas ni salidas. Todo a la vez Heres todo el programa C. No voy a repetir com. ld. Aquí está la llamada a GCC. Y probarlo en DOSBox: desde aquí si quieres gráficos de fantasía, es sólo cuestión de hacer una interrupción y escribir en la memoria VGA. Si desea sonido, puede realizar una interrupción para el altavoz del PC. Todavía no he solucionado cómo llamar a Sound Blaster. Fue a partir de este punto que crecí DOS Defender. Memoria de asignación Para cubrir una cosa más, recuerde que el símbolo de montón Podemos utilizarlo para implementar sbrk () para la asignación de memoria dinámica dentro del segmento del programa principal. Este es el modo real, y no hay memoria virtual, por lo que fueron libres de escribir en cualquier memoria que podamos abordar en cualquier momento. Parte de esto está reservado (es decir, memoria baja y alta) para hardware. Así que usar sbrk () específicamente no es realmente necesario, pero es interesante implementar nosotros mismos. Como es normal en x86, el texto y los segmentos están en una dirección baja (0x0100 en este caso) y la pila está en una dirección alta (alrededor de 0xffff en este caso). En sistemas tipo Unix, la memoria devuelta por malloc () viene de dos lugares: sbrk () y mmap (). Lo que sbrk () hace es asignar memoria justo encima de los segmentos de texto / datos, creciendo hacia la pila. Cada llamada a sbrk () crecerá este espacio (o lo dejará exactamente igual). Esa memoria sería administrada por malloc () y amigos. Heres cómo podemos obtener sbrk () en un programa COM. Tenga en cuenta que tengo que definir mi propio sizet. Ya que no tenemos una biblioteca estándar. Simplemente establece un puntero para apilar y crece según sea necesario. Un sbrk ligeramente más inteligente () también tendría cuidado con la alineación. En la creación de DOS Defender sucedió una cosa interesante. Yo estaba (incorrectamente) contando con el retorno de memoria por mi sbrk () siendo cero. Este fue el caso de la primera vez que el juego corrió. Sin embargo, DOS no pone esta memoria entre programas. Cuando volvería a ejecutar mi juego de nuevo, se recogería justo donde lo dejó. Porque las mismas estructuras de datos con el mismo contenido fueron cargadas nuevamente en su lugar. Un accidente muy agradable Su parte de lo que lo convierte en una divertida plataforma incorporada. Comprender las Listas de Control de Acceso del Punto de Acceso del Servicio Este documento explica cómo leer y crear las Listas de Control de Acceso (ACL) del Service Access Point en los routers de Cisco. Aunque existen varios tipos de ACL, este documento se centra en los que se filtran en función de los valores de SAP. El rango numérico para este tipo de ACL es de 200 a 299. Estas ACL pueden aplicarse a las interfaces Token Ring para filtrar el tráfico del puente de ruta de origen (SRB). A las interfaces Ethernet para filtrar el tráfico de puente transparente (TB). O a los enrutadores peer de conmutación de enlace de datos (DLSw). El desafío principal con las ACL de SAP es saber exactamente qué SAP son permitidos o denegados por una entrada de ACL particular. Bueno, analice cuatro escenarios diferentes donde se está filtrando un protocolo en particular. Para obtener más información sobre las convenciones de documentos, consulte las Convenciones de consejos técnicos de Cisco. No existen requisitos previos específicos para este documento. Este documento no está restringido a versiones específicas de software y hardware. El tráfico de arquitectura de red de sistemas de IBM (SNA) utiliza SAPs que van de 0x00 a 0xFF. Virtual VTAM V3R4 y posteriores soportan un rango de valores SAP de 4 a 252 (o 0x04 a 0xFC en representación hexadecimal), donde 0xF0 está reservado para el tráfico NetBIOS. Los SAP deben ser múltiplos de 0x04, empezando por 0x04. La siguiente ACL permite los SAP SNA más comunes y niega el resto (considerando que hay un denegación implícita al final de cada ACL): Como se puede ver en la tabla anterior, no todos los SAP SNA posibles están incluidos en esta ACL. Estos PAE, sin embargo, cubren los casos más comunes. Otro punto a considerar al diseñar la ACL es que los valores de SAP cambian dependiendo de si son comandos o respuestas. El punto de acceso de servicio de origen (SSAP) incluye el bit de comando / respuesta (C / R) para diferenciar entre ellos. El C / R se establece en 0 para comandos y en 1 para respuestas. Por lo tanto, la ACL debe permitir o bloquear comandos, así como respuestas. Por ejemplo, SAP 0x05 (utilizado para respuestas) es SAP 0x04 con el C / R establecido en 1. Lo mismo se aplica a SAP 0x09 (SAP 0x08 con C / R establecido en 1), 0x0D y 0x01. El tráfico NetBIOS utiliza valores SAP 0xF0 (para comandos) y 0xF1 (para respuestas). Normalmente, los administradores de red utilizan estos valores de SAP para filtrar este protocolo. La entrada de la lista de acceso que se muestra a continuación permite el tráfico NetBIOS y niega todo lo demás (recuerde el denegatorio implícito todo al final de cada ACL): Utilizando el mismo procedimiento mostrado en la sección anterior, puede determinar que la ACL anterior permite SAPs 0xF0 y 0xF1. Por el contrario, si el requisito es bloquear NetBIOS y permitir el resto del tráfico, utilice la ACL siguiente: De forma predeterminada, los enrutadores Cisco puentean el tráfico IPX. Para cambiar este comportamiento, debe emitir el comando ipx routing en el enrutador. IPX, utilizando el encapsulado 802.2, utiliza SAP 0xE0 como el punto de acceso de servicio de destino (DSAP) y SSAP. Por lo tanto, si un enrutador de Cisco está puenteando IPX y el requisito es permitir sólo este tipo de tráfico, utilice la ACL siguiente: Por el contrario, la siguiente ACL bloquea IPX y permite el resto del tráfico: Cada ACL incluye un denegación implícita de todos . Debe tener en cuenta esta entrada al analizar el comportamiento de una ACL configurada. La última entrada ACL mostrada abajo niega todo el tráfico. Recuerde que cuando se lee la máscara comodín (en binario), 1 se considera una posición de bit quotdo no cuidado. Una máscara de comodín 1s en representación binaria se traduce en 0xFFFF en representación hexadecimal.

No comments:

Post a Comment