Monday 26 December 2016

0xb8 Binary Options

November 17, 2016 Ahora theyve ido un hecho él. Una agencia no identificada ha difundido un poderoso virus informático en todas las computadoras del mundo y ha eliminado los binarios de cada copia de cada herramienta de desarrollo de software. Incluso las copias sin conexión son tan potentes. La mayor parte del código fuente sigue existiendo, incluso para los compiladores, y la mayoría de los sistemas informáticos seguirán funcionando sin interrupción, pero no se podrá desarrollar ningún nuevo software a menos que sea escrito byte por byte en código de máquina en bruto. Sólo los programadores reales pueden hacer cualquier cosa. Los desarrolladores de software más importantes del mundo se han puesto a trabajar arrancando un compilador C (y otros) completamente desde cero para que podamos volver a la normalidad. Sin un ensamblador, es un proceso lento y tedioso. Mientras tanto, en lugar de esperar a que el trabajo de arranque para completar, el resto de nosotros se han asignado programas individuales afectados por el virus. Por ejemplo, muchas utilidades básicas de unix han sido borradas, y el bootstrap se beneficiaría de tenerlas. Tener grupos diferentes abordar cada programa perdido permitirá el esfuerzo de arranque para avanzar un poco en paralelo. Al menos eso es lo que nos dicen los nerds del compilador. La verdadera razón es que theyre cansado de ser preguntado si theyre hecho todavía, y estas tareas nos mantendrá el resto de nosotros tranquilamente ocupado. Afortunadamente a ti ya mí se nos ha asignado la tarea más fácil de todos: Escribir el verdadero comando desde cero. Bueno, tienes que averiguarlo byte by byte. El objetivo es x86-64 Linux, lo que significa que necesitamos la siguiente documentación: Especificación de formato ejecutable y de enlace (ELF). Este es el formato binario utilizado por los modernos sistemas Unix, como Linux. Una forma más conveniente de acceder a este documento es man 5 elf. Manual de desarrolladores de software Intel 64 y IA-32 Architectures (volumen 2). Esto documenta completamente el conjunto de instrucciones y su codificación. Es toda la información necesaria para escribir código de máquina x86 a mano. Los manuales de AMD funcionarían también. Interfaz binaria de aplicación System V: Complemento de procesador de arquitectura AMD64. Sólo se necesitan algunas piezas de información de este documento, pero se necesitarían más para un programa más sustancial. Algunos números mágicos de los archivos de cabecera. Asamblea manual El programa que escribió es verdadero. Cuyo comportamiento se documenta como no hacer nada, con éxito. Todos los argumentos de la línea de comandos se ignoran y no se lee ninguna entrada. El programa sólo necesita realizar la llamada al sistema de salida, finalizando inmediatamente el proceso. Según el documento ABI (3) Apéndice A, los registros para argumentos de llamada de sistema son: rdi. Rsi Rdx. R10. R8. R9. El número de llamada del sistema entra en rax. La llamada al sistema de salida toma sólo un argumento, y ese argumento será 0 (éxito), por lo que rdi se debe establecer en cero. Su probable que su ya cero cuando el programa se inicia, pero el documento ABI dice que su contenido es indefinido (3.4), por lo que bien establecido explícitamente. Para Linux en x86-64, el número de llamada al sistema para salir es 60, (/usr/include/asm/unistd64.h), por lo que rax se establecerá en 60, seguido por syscall. No hay ensamblador disponible para convertir esto en código de máquina, por lo que tiene que ser montado a mano. Para eso necesitamos el manual Intel (2). La primera instrucción es xor. Así que busca ese mnemónico en el manual. Al igual que la mayoría de los mnemónicos x86, hay muchos opcodes diferentes y muchas maneras de codificar la misma operación. En este caso, hay 22 opciones. Los operandos son dos registros de 32 bits, por lo que hay dos opciones disponibles (opcodes 0x31 y 0x33): El r / m32 significa que el operando puede ser un registro o la dirección de una región de memoria de 32 bits. Con dos operandos de registro, ambas codificaciones son igualmente válidas, ambas tienen la misma longitud (2 bytes) y ninguna es canónica, por lo que la decisión es totalmente arbitraria. Vamos a elegir el primero, opcode 0x31, ya que aparece en primer lugar. El / r después del código de operación significa que el operando de registro único (r32 en ambos casos) se especificará en el byte ModR / M. Este es el byte que sigue inmediatamente al opcode y especifica uno de dos de los operandos. El byte ModR / M se divide en tres partes: mod (2 bits), reg (3 bits), r / m (3 bits). Esto se pone un poco complicado, pero si se mira a la Tabla 2-1 en el manual de Intel durante un tiempo suficiente, finalmente tiene sentido. En resumen, dos bits de alta (11) para mod indica estaban trabajando con un registro en lugar de una carga. Heres donde estaban en para ModR / M: El orden de los registros x86 no es intuitivo: ax. Cx Dx Bx Sp. Pb si. Di Con 0-indexing, que da di un valor de 7 (111 en binario). Con edi como ambos operandos, esto hace ModR / M: Or, en hexadecimal, FF. Y eso es todo por esta instrucción. Con el opcode (0x31) y el byte ModR / M (0xFF): La codificación para mov es un poco diferente. Busque y haga coincidir los operandos. Al igual que antes, hay dos opciones posibles: En la notación B8rd significa que el operando de registro de 32 bits (rd para palabra doble de registro) se agrega al opcode en lugar de tener un byte ModR / M. Su seguida por un valor inmediato de 32 bits (id para la doble palabra entera). Eso es un total de 5 bytes. El segundo medio 0 entra en el campo reg de ModR / M, y la instrucción completa es seguida por el 32-bit inmediato (id). Eso es un total de 6 bytes. Puesto que esto es más largo, utilice bien la primera codificación. Por lo tanto, es opcode 0xB8 0. ya que eax es el número de registro 0, seguido por 60 (0x3C) como un pequeño endian, valor de 4 bytes. Heres la codificación para la segunda instrucción: La instrucción final es un cakewalk. No hay operandos, viene en una sola forma de dos operandos. Así que la codificación de esta instrucción es: Poner todo junto el programa es de 9 bytes: Arent te alegra que normalmente no tienen que montar programas enteros a mano Construir el ELF En los viejos tiempos es posible que haya sido capaz de simplemente dejar caer estos bytes en Un archivo y ejecutarlo. Eso es cómo DOS COM programas funcionaron. Pero esto definitivamente no funcionará si lo probaste en Linux. Los binarios deben estar en el formato ejecutable y de enlace (ELF). Este formato le indica al cargador cómo inicializar el programa en la memoria y cómo iniciarlo. Afortunadamente para este programa bien sólo es necesario rellenar dos estructuras: la cabecera ELF y una cabecera del programa. El binario será el encabezado ELF, seguido inmediatamente por el encabezado del programa, seguido inmediatamente por el programa. Para llenar este binario, utilice cualquier método que el virus deje atrás para escribir bytes sin formato en un archivo. Por ahora, supongo que el comando echo sigue estando disponible, y usa hexadecimal xNN escapes para escribir bytes crudos. Si esto no está disponible, es posible que tenga que utilizar la aguja magnética y el método de mano constante, o las mariposas. La primera estructura en un archivo ELF debe ser el encabezado ELF de la especificación ELF (1): Ningún otro dato está en una ubicación fija porque este encabezado especifica dónde se puede encontrar. Si está escribiendo un programa C en el futuro, una vez que los compiladores hayan sido reiniciados, podrá acceder a esta estructura en elf. h. El encabezado ELF La macro EINIDENT es 16, por lo que eident es de 16 bytes. Los primeros 4 bytes son fijos: 0x7F, E, L, F. El quinto byte se denomina EICLASS. Un programa de 32 bits (ELFCLASS32 1) o un programa de 64 bits (ELFCLASS64 2). Este será un programa de 64 bits (2). El 6º byte indica el formato de número entero (EIDATA). El que queremos para x86-64 es ELFDATA2LSB (1), dos complementos, little-endian. El 7mo byte es la versión ELF (EIVERSION), siempre 1 a partir de esta escritura. El octavo byte es el ABI (ELFOSABI), que en este caso es ELFOSABISYSV (0). El 9no byte es la versión (EIABIVERSION), que es apenas 0 otra vez. El resto es relleno cero. Así que escribir el encabezado ELF: El siguiente campo es el etype. Este es un programa ejecutable, por lo que su ETEXEC (2). Otras opciones son archivos de objeto (ETREL 1), bibliotecas compartidas (ETDYN 3) y archivos de núcleo (ETCORE 4). El valor para emachine es EMX8664 (0x3E). Este valor no está en la especificación ELF, sino en el documento ABI (4.1.1). En BSD esto se llama EMAMD64. Para eversión su siempre 1, como en el encabezado. El campo de eentry será de 8 bytes porque se trata de un ELF de 64 bits. Esta es la dirección virtual del punto de entrada de los programas. Es donde el cargador pasará el control y por lo tanto su donde bien cargar el programa. La dirección de entrada típica está alrededor de 0x400000. Por una razón que mal explicaré en breve, nuestro punto de entrada será de 120 bytes (0x78) después de ese bonito número redondo, en 0x40000078. El campo ephoff contiene el desplazamiento de la tabla de cabecera del programa. El encabezado ELF es 64 bytes (0x40) y esta estructura seguirá inmediatamente. También tiene 8 bytes. El encabezado eshoff contiene el desplazamiento de la tabla de sección. En un programa ejecutable no necesitamos secciones, así que esto es cero. El campo eflags tiene banderas específicas del procesador, que en nuestro caso es sólo 0. El eehsize contiene el tamaño de la cabecera ELF, que, como he dicho, es de 64 bytes (0x40). El ephentsize es el tamaño de una cabecera de programa, que es 56 bytes (0x38). El campo ephnum indica cuántos encabezados de programa hay. Sólo necesitamos el: el segmento con los 9 bytes del programa, para ser cargado en la memoria. El eshentsize es el tamaño de un encabezado de sección. No estaban usando esto, pero bien hacer nuestra diligencia debida. Estos son 64 bytes (0x40). El campo eshnum es el número de secciones (0). El eshstrndx es el índice de la sección con la tabla de cadenas. No existe, por lo que es 0. El encabezado del programa Siguiente es nuestro encabezado del programa. El campo ptype indica el tipo de segmento. Este segmento mantendrá el programa y se cargará en la memoria, por lo que queremos PTLOAD (1). Otros tipos de segmentos establecen carga dinámica y tal. El campo pflags proporciona las protecciones de memoria. Queremos ejecutable (PFX 1) y legible (PFR 4). Estos son ORed juntos para hacer 5. El poffset es el archivo de desplazamiento para el contenido de este segmento. Este será el programa que reunimos. Seguirá inmediatamente este encabezado. El encabezado ELF era de 64 bytes, más un encabezado de programa de 56 bytes, que es 120 (0x78). El pvaddr es la dirección virtual donde se cargará este segmento. Este es el punto de entrada de antes. Una restricción es que este valor debe ser congruente con poffset modulo el tamaño de la página. Es por eso que el punto de entrada fue compensado por 120 bytes. El ppaddr no se utiliza para esta plataforma. El pfilesz es el tamaño del segmento en el archivo: 9 bytes. El pmemsz es el tamaño del segmento en la memoria, también 9 bytes. Puede sonar redundante, pero se les permite diferir, en cuyo caso su bien truncado o rellenado con ceros. El palint indica la alineación de los segmentos. No nos importa la alineación. Agregue el programa Finalmente, agregue el programa que montamos al principio. El Capitan (OS X 10.11.1) sólo podría instalarse en un hackintosh basado en Skylake con ciertas versiones del BIOS, y para esto debía deshabilitar un ajuste con la descripción críptica : 8220 IOAPIC 24-119 Entradas 8220. Bueno críptico quizás para la mayoría de la gente leyendo esto, pero para mí fue un verdadero abridor de ojos. Inmediatamente supe lo que era. ¿Por qué lo preguntas bien? Leí la hoja de datos Intel 100 Series Chipset Family Platform Controller Hub (PCH) cuando salió. Y ambos volúmenes. Que sin embargo era sólo la parte fácil, ya que no sabía cómo AMI implementado, y lo que hacen cuando se voltea ese ajuste. Tenía una corazonada, claro, pero seguí codificando y pidió a otros que confirmaran mis descubrimientos, pero dejen de lado la parte aburrida y salten directamente a ella. Here8217s lo que usted puede encontrar en la hoja de datos de Intel sobre la versión APIC Registro en el desplazamiento 1: El valor predeterminado es 0x770020, pero que era 0x170020 en Haswell y antes. E incluso Intel está un poco confundido porque escribieron: 8220 En PCH este campo es predeterminado a 17h para indicar 24 interrupciones. 8221 Y eso también puede haber contribuido al cambio de valor, porque lo que se debe utilizar 0x170020 o de hecho 0x77020 Hecho es que Apple sigue utilizando / esperando 0x170020 y por lo tanto eso es lo que hace mi parche. Le damos al binario AppleAPIC lo que espera8230 0x170020 Bueno. Actualmente. Espera 0x17 y eso es exactamente lo que le damos. 1.) Abrir /System/Library/Extensions/AppleAPIC. kext/Contents/AppleAPIC 2.) Buscar: C1 E8 10 0F B6 F0 3.) Sustituirlo por: BE 17 00 00 00 90 El cual cambia en: Y Ahora AppleAPIC piensa haber leído 0x170020 desde el registro de versión, insteads de nuestro (roto) valor de 0x770020, pero usar un HexEditor es tan antigua escuela. Hoy en día se puede hacer algo como esto en Clover: por supuesto, primero fijado RevoBoot. Otros cargadores de arranque como Chameleon (sucursal de Enoch) pronto se arreglarán. De todas formas. Ahora ya sabes quién (yo) hizo lo que (ver más arriba) para obtener su Skylake va sin tener que estropear su BIOS original de fábrica o volver a una versión de BIOS con la configuración. Gracias a iStigPL y Tonymacx86 por su ayuda con los datos y los resultados de la prueba Algunos consejos para la gente que todavía está recibiendo lo terrible: 8220 Aún esperando el dispositivo raíz 8220. Primero. Asegúrese de que tiene XHCI hand-off activado en el BIOS y dejar caer las tablas ACPI como SaSsdt. aml puede causar problemas de arranque con los dispositivos SATA Usted dice em Piker Alpha. Gracias por el trabajo duro. Me teme pensar que el mundo hackintosh sería Sin ti. Gracias de nuevo por su trabajo duro Exactamente, Dee, nos dice 8230 De todos modos, el punto no es si o no el trabajo es duro, el punto es que esto se envuelve Información. Seguro que podría decir que el copyright está en los 6 bytes aka 12 caracteres, pero teniendo en cuenta que este es un pequeño fragmento, hay pocas maneras de resolverlo en el kext pero Su forma de pensar (I don8217t Creo que wouldn8217t recordar al autor de un parche similar de sus derechos de autor. Para mí, teniendo en cuenta un producto mínimo, derieved de una pieza de información que tiene pocas o ninguna alternativa, las mismas reglas se aplican como para la propia información. Por lo tanto, si el copyright de un pequeño parche que es el resultado directo de una pieza de información, a mí, usted derechos de autor de la información en sí Sí. Este copyright 8220claim8221 es el resultado de mi trabajo creativo. Y don8217t incluso tienen 8220claim it8221 porque Se convirtió en el mío, automáticamente, el minuto que publiqué acerca de él. Y no es acerca de la información en sí, pero lo que hice con él. Por lo contrario, podría culpar a Apple y todos por utilizar la hoja de datos de Intel y convertir sus datos en un controlador, o lo que sea. ¿O usted piensa que Intel posee el trabajo de Apple8217s también. El hecho de que no hay ninguna otra solución, no sin ser estampado como trabajo derivado, no es mi problema. Y si usted, o cualquier otra persona tiene problemas con esto, entonces al menos tratar de ser su para las personas que están buscando su ayuda. Sea mi invitado8230 pero sé de experiencias pasadas que puede tomar forever8230 Apenas un recordatorio a la solución de HDMI que trabajó solamente después que pisé adentro. O ese problema estúpido de la pantalla negra. O que el logotipo de Apple que faltaba. O la gestión de energía que didn8217t trabajo. Bien. Me arrepiento, pero la lista sigue y sigue y sigue. No es mi problema. Pero en lugar de estar agradecido. Algunas personas vienen aquí a quejarse del hecho de que les recuerdo mi trabajo. Sí, eso debe doler. De lo contrario todo esto habría sido un punto discutible de todos modos. BTip / b: Google 8220gratitude8221 y aceptar el paseo gratis. Gracias por tu trabajo. Mi DiffServ es un protocolo QoS (Calidad de Servicio) para administrar la asignación de ancho de banda para conexiones de medios de Internet (por ejemplo, una conexión de voz VOIP). Agradable visión general aquí IETF Diffserv página Con líneas de bajo ancho de banda, como ADSL, los usuarios pueden sentir jittering. Trate de permitir el ancho de banda de carga completa a eMule y hacer una llamada telefónica en G.711 en el mismo tiempo, y seguramente entenderá lo que quiero decir. En lo que respecta a los documentos Cisco y otros, el valor DiffServ correcto es EF (Expedited Forwarding) . El EF DiffServ también contiene el bit ToS Low Delay. Que es tratada por muchos enrutadores sin ninguna configuración. Esto se denomina PFIFO (Priority Fist In First Out, o FIFO con prioridad). Los valores que debe conocer: EF DiffServ decimal: 184 EF DiffServ hexadecimal: 0xb8 EF DiffServ binario: 101110 00 (en rojo: campo DSCP) EF DSCP decimal: 46 EF DSCP hexadecimal: 0x2e EF DSCP binario: 101110 Nota: El campo DSCP es Contenida dentro de los 6 primeros bits del byte de DiffServ. Aquí está la parte donde nos volvemos locos. Cada constructor requiere un valor DiffServ o DSCP diferente. Alcatel OmniPCX Office - EF DiffServ binario. 10111000 DIFFSERVPHBEF Asterisk 1.0.9 (es decir, sip. conf) - EF DiffServ hexadecimal. Tos 0xb8 Grandstream (requiere FW 1.0.6.3 y versiones anteriores) - EF DSCP decimal. 46 ZyXEL - EF DiffServ decimal. 184 TELES - EF DiffServ decimal. 184 snom viene con un TOS por defecto de 160 y recomienda utilizar 184 (para RTP). Más información en sus FAQ. Para SIP un valor de CS3 TOS 96 sería aconsejable. En caso de duda, utilice un sniffer como Wireshark (anteriormente Ethereal). Si la configuración es correcta, mostrará el campo de servicios diferenciados en cualquiera de los paquetes RTP, con un valor de 0xb8 (DSCP 0x2e: Expedited Expedition: ECN: 0x00). DiffServ (servicios diferenciados) DiffServ es un QoS (Quality of Service) Protocolo para gestionar la asignación de ancho de banda para conexiones de medios de Internet (por ejemplo, una conexión de voz VOIP). Agradable visión general aquí IETF Diffserv página Con líneas de bajo ancho de banda, como ADSL, los usuarios pueden sentir jittering. Trate de permitir el ancho de banda de carga completa a eMule y hacer una llamada telefónica en G.711 en el mismo tiempo, y seguramente entenderá lo que quiero decir. En lo que respecta a los documentos Cisco y otros, el valor DiffServ correcto es EF (Expedited Forwarding) . El EF DiffServ contiene también el bit ToS Low Delay. Que es tratada por muchos enrutadores sin ninguna configuración. Esto se denomina PFIFO (Priority Fist In First Out, o FIFO con prioridad). Los valores que debe conocer: EF DiffServ decimal: 184 EF DiffServ hexadecimal: 0xb8 EF DiffServ binario: 101110 00 (en rojo: campo DSCP) EF DSCP decimal: 46 EF DSCP hexadecimal: 0x2e EF DSCP binario: 101110 Nota: El campo DSCP es Contenida dentro de los 6 primeros bits del byte de DiffServ. Aquí está la parte donde nos volvemos locos. Cada constructor requiere un valor DiffServ o DSCP diferente. Alcatel OmniPCX Office - EF DiffServ binario. 10111000 DIFFSERVPHBEF Asterisk 1.0.9 (es decir, sip. conf) - EF DiffServ hexadecimal. Tos 0xb8 Grandstream (requiere FW 1.0.6.3 y versiones anteriores) - EF DSCP decimal. 46 ZyXEL - EF DiffServ decimal. 184 TELES - EF DiffServ decimal. 184 snom viene con un TOS por defecto de 160 y recomienda utilizar 184 (para RTP). Más información en su FAQ. Para SIP un valor de CS3 TOS 96 sería aconsejable. En caso de duda, utilice un sniffer como Wireshark (anteriormente Ethereal). Si la configuración es correcta, mostrará el campo de servicios diferenciados en cualquiera de los paquetes RTP, con un valor de 0xb8 (DSCP 0x2e: Expedited Expedition: ECN: 0x00).Creado por: jht2. Última modificación: Jue 23 de Dic, 2013 (01:15 UTC) por JustRumours


No comments:

Post a Comment