Saturday 21 October 2017

0x62 Binary Options


BasE91 introducción de codificación basE91 es un método avanzado para codificar datos binarios como caracteres ASCII. Es similar a UUencode o base64, pero es más eficiente. La sobrecarga producida por basE91 depende de los datos de entrada. Se asciende como máximo a 23 (frente a 33 para base64) y puede variar hasta 14, lo que ocurre típicamente en bloques de 0 bytes. Esto hace que basE91 sea muy útil para transferir archivos más grandes a través de conexiones binarias no seguras como correo electrónico o líneas terminales. Alfabeto Como su nombre indica, basE91 necesita 91 caracteres para representar los datos binarios codificados en ASCII. A partir de los 94 caracteres ASCII imprimibles (0x21-0x7E), se han omitido los tres siguientes para construir el alfabeto basE91: La tabla de traducción se compone de los caracteres restantes como se muestra a continuación. Tiempo iban a ver lo que parece una declaración de switch en (des) ensamblaje. Squeeee Así que vamos a actualizar nuestro radare desde git, instalarlo y empezar. Fase 3 Heres lo que iba a analizar. Bastante el doozy de una función con algunas ramas graves. Un poco preocupado por cómo bonkers esto parece Tomar un buen vistazo, porque thats la declaración switch que mencioné anteriormente. En realidad es mucho menos desalentador de lo que parece, así que tome un sorbo de su bebida favorita y deja entrar. Parsing the input Después del prologo de la función, la dirección de nuestra cadena de entrada se mueve en edx (línea 5). Entonces, tres variables locales se empujan sobre la pila (líneas 7-12). Después de esto la cadena d c d se empuja a la pila, y luego nuestra cadena de entrada, (como su dirección almacenada en edx) se empuja a la pila. Estas líneas configuran los argumentos de función para la llamada sscanf. Nuestra cadena es la fuente, la cadena de formato (d c d) y las tres variables que contendrán los valores escaneados. Su aparente ahora que la entrada requerida está en la forma de un número, un carácter, y otro número. Podemos extraer esa información de la cadena de formato pasada a sscanf. Es bueno saber lo que necesitamos para entrar, porque si no lo conseguimos bien explotaremos la bomba. Una vez que volvemos de sscanf. Eax se compara con el valor inmediato 2. Después de devuelve sscanf, eax contiene su valor de retorno, que es, de acuerdo con su página de manual, el número de conversiones que se completaron con éxito se devuelve. Si el valor en eax es mayor que 2. Entonces saltamos sobre sym. explodebomb. Por lo tanto, esta prueba debe asegurar que se han escaneado correctamente tres valores. Cambiar cosas Ahora empieza la instrucción switch (línea 20). Debido a que ebp - localch fue la última variable que se empujó en la pila antes de la llamada a sscanf. Contendrá el primer número. A medida que los argumentos son empujados a la pila en orden de izquierda a derecha. El valor almacenado allí se compara con el valor inmediato de 7. En la línea siguiente (línea 21) es un salto condicional que no hemos visto antes. A los documentos JA. Saltar si está arriba (si leftOp gt rightOp) Para expandir esto, ja es parte de los saltos basados ​​en comparaciones sin firmar. Ok, así que tomamos el salto si nuestro primer valor es mayor (o igual) 7. Qué con el salto que es un cheque para enteros unsigned, también sabemos que no puede ser menos que 0. Echemos un vistazo a 0x8048c88. Que es donde el salto nos llevaría. Use: s 0x8048c88 para buscar allí. No, eso no quiere en alguna parte que queramos terminar. Tome nota: el primer número tiene que ser menor o igual a siete. Parecería que esta es la declaración de mayúsculas y minúsculas. Vamos a regresar y ver qué pasa si no tomamos el salto. El valor se mueve en eax y luego tenemos un salto basado en ese valor. Este es el comienzo de la instrucción switch. En la línea 23 el código jmp dword eax4 0x80497e8 saltará a la declaración de caso relevante, en base a la dirección almacenada en eax4 0x80497e8. Vamos a echar un vistazo a lo que se almacena en 0x80497e8 Sabemos que theres un cheque para asegurarse de que nuestra entrada no más de siete, así que pensé que podría comprobar sólo 35 bytes (4 7 más 4 extra para ver qué hay). Lo que tenemos aquí es una tabla de búsqueda (o más correctamente nombrado, una tabla de salto) que contiene las direcciones de las declaraciones de caso, en formato pequeño endian por supuesto. Sólo verá este tipo de tabla de salto si las sentencias de caso se basan en valores secuenciales. Eso es porque los valores de salto necesarios para entrar en la tabla de salto sólo funcionará en tal situación. Otras sentencias switch que encouter funcionarán de manera diferente. Aquí es que el compilador puede optimizar los valores secuenciales para producir lo que tenemos aquí. Así que la primera entrada es 0x08048be0. Que es la dirección de la primera declaración de caso En el momento en que llegamos al final de la tabla de búsqueda se dará cuenta de que no hay dirección válida, de ahí la condición de que nuestro valor es menor o igual a 7. Ahora sabemos que nuestro primer Input nos dirigirá a una instrucción de caso específico, pero ¿cómo afecta esto a nuestras otras entradas? Basta con mirar el ejemplo anterior, donde el primer número que ingresamos es 0. En la línea 1 el carácter q se mueve en bl. Este es un registro de 8 bits, que forma el byte bajo del registro bpx. Después de que nuestro segundo dígito se compara con 0x309 que es 777 en decimal. Si los números son iguales, el salto condicional nos lleva a 0x8049c8f. Y porque no llamamos sym. explodebomb. Estaban haciendo bien. Echemos un vistazo a lo que sucede en la dirección del salto Otro cmp. Esta vez comparando nuestro carácter de entrada a lo que está en bl. Si son iguales, saltamos sobre sym. explodebomb una vez más y empezamos a salir de la función para volver a sym. main. ¿Qué sabemos? Así que sabemos que necesitamos ingresar un número, seguido de un carácter, seguido de otro número. El primer número debe ser menor o igual a siete. La elección del número determinará qué letra y número sigue. Mirando la declaración del interruptor, podemos calcular las opciones siguientes Escoja una y probarla. Si funciona (y debería), añádelo al archivo de desactivación y prepárese para la fase 4. Debido a que hemos descubierto la fase completa del análisis estático, no creo que haya una necesidad de cubrirlo con análisis dinámico aquí. Si detecta algún error, tiene alguna información o preguntas sobre cualquiera de las fases, háganmelo saber, ya sea a través de los comentarios de Disqus a continuación, oa través de Twitter. Commentsbin2hex Una buena opción para crear cadenas con datos binarios para guardar (por ejemplo, guardar una sentencia de sql en un archivo) en archivos de texto o código php es hacer lo siguiente: ltphp field bin2hex (campo) field chunksplit (field. Campo x Substr (campo 0, - 2) gt esto convertirá su campo (binario o no) en hexadecimal y luego convertir el hex en una cadena que se puede colocar en un archivo php: FFFFFFFF - gt xFFxFFxFFxFF En respuesta a Patrik: Manera de imprimir un número en binario es usar baseconvert (). Lt echo baseconvert (bin, 10, 2) gt Si lo necesitas para imprimir todos los 32 bits (como lo hace tu función) puedes simplemente apagarlo: echo strpad (baseconvert (bin, 10, 2), 32, STRPADLEFT) gt La conversión es desde la base 10 porque cuando bin pasa a baseconvert (), se convierte en una cadena y la representación predeterminada es decimal. Espero que esto ayude. Algunos dieron una función para convertir un código hexadecimal de nuevo en un texto simple (legible por el usuario ASCII: P) Algunos más dio una función que hace uso de bin2hex para convertir URLs en algo como 123456 Aquí es una función para ir desde el formulario 123456 de nuevo en ASCII Observe que esta función se puede cambiar fácilmente para transformar cualquier código hexadecimal en ASCII lt función hex2text (str) str explode (, str) arrayshift (str) nmlstr foreach (str como hexstr) nmlstr. Chr (baseconvert (hexstr, 16, 10)) return nmlstr gt espero que esto ayude :) Regards - Tsuna Esperemos que esto ayude a alguien. Simplemente muestra una representación html de datos hexadecimales, como un visor hexadecimal. (Columnas columnCount) (columnas columnCount column) column column column column column column column column column column column column column column column column column column column column column column column column column column column column column column column ) LineCount columnCount 0 foreach (líneas como línea) return lttrgtlttd alignrightgt. BytePosition. : Lt / tdgt para (n 0 n lt columnas n) return lttdgt. Strtoupper (bin2hex (línea n)). Lt / tdgt return lttdgt ampnbspampnbspampnbspampnbspampnbspampnbspampnbspampnbsp lt / tdgt para (n 0 n lt columnas n) return lttdgt. (Htmlentities (línea n).htmlentities (línea n).mpnbsp). Lt / tdgt return lt / trgt bytePuesta bytePosition columnas return lt / tablegt return implode (return) gt Esta función lo deshace (convierte nuevamente en ASCII). Ltphp función hex2asc (myin) para (i 0 i lt strlen (myin) / 2 i) myout. Chr (basconvert (substr (myin. I 2. 2), 16. 10)) return myout gt Estaba viendo lo anterior y con una pequeña modificación, surgió lo siguiente que creo que es más flexible: Función ltphp bin2hex (Datos) corregido eregreplace (0-9a-fA-F. Datos) paquete de devolución (H. strlen (corregido), corregido) gt Esto asegurará que todo lo que pase, incluso si está acolchado en las extremos o entre pares , Debe devolver los datos deseados.

No comments:

Post a Comment