¿Por qué la Asamblea parece tan importante en la seguridad de TI? [duplicar]

0

Al ver muchos tutoriales, leer respuestas y, en general, interactuar con la comunidad de seguridad de TI, encuentro que un alto porcentaje de ellos conocen el ensamblaje. Me pregunto por qué este porcentaje es mucho más alto que en cualquier otro lugar y por qué es tan importante saberlo.

* Nota al margen: me imagino que es muy difícil entender lo que sucede al leer esto. Mover la variable y eso parece no dar mucha idea de lo que está pasando.

    
pregunta Griffin Nowak 25.06.2013 - 09:30
fuente

3 respuestas

2

Le permite a uno entender lo que está sucediendo en el nivel más bajo posible del sistema operativo. En segundo lugar, le permite cambiar el código a nivel de byte, lo que significa que tiene mucho control sobre el código. Esto es, por ejemplo, nescessary al explotar desbordamientos de búfer o pila. Cuando realice cualquiera de los dos ataques, esencialmente inyectará el código de byte directamente en la memoria y lo ejecutará. Si bien técnicamente puede generar esto con otro idioma, a menudo no es óptimo y mucho más voluminoso que cuando lo escribiría en otro idioma. A menudo, lo que sucede es que primero escribe el exploit en c y luego genera el ensamblaje desde su programa c. Esto se llama prototipado. Desde aquí puede optimizar el código y eliminar los caracteres no deseados, como 0x00 bytes (a menudo, estos se utilizan como un delimitador).

También si tiene un programa que necesita analizar pero no tiene el código fuente, a menudo tendrá que descompilarlo. El resultado de la compilación es el montaje.

Creo que la mayoría de los profesionales de seguridad tienen una mentalidad de por qué mientras que otros profesionales de TI a veces no les importa mientras funcione. El ensamblaje le permite explorar el por qué en el nivel más bajo posible. Esta es también una razón por la cual a muchos profesionales de la seguridad les gusta conocer el montaje.

También tenga en cuenta que existen programas para ayudarlo a comprender el ensamblaje descompilado mediante la identificación y visualización de las llamadas al sistema (mire mi blog para ver el análisis del código de shell).

    
respondido por el Lucas Kauffman 25.06.2013 - 10:04
fuente
0

Es el siguiente nivel por encima de 1 y 0, y cuanto más bajo puedes ir, más software puedes subvertir. La mayoría de las hazañas están escritas en conjunto.

Por favor, corríjame si me equivoco en esto, pero por lo que entiendo. Tiene lenguajes de script (javascript, python) en el nivel más alto que son fáciles de escribir y ejecutar, pero no tiene acceso directo al sistema operativo, entonces hay lenguajes intermedios (Java, .NET) que compilan el código en un lenguaje intermedio cuando ese código se ejecuta, justo a tiempo se compila para la máquina, luego tiene idiomas que compilan para la máquina en la que se ejecutan, como C / C ++. Con C / C ++ puede hacer muchas más operaciones "Bare Metal", luego bajo C / C ++ es un ensamblaje que es tan simple como el que se obtiene, aparte de escribir los números 1 y 0. HTH

    
respondido por el Four_0h_Three 25.06.2013 - 09:54
fuente
0

Todos los lenguajes de computadora son esencialmente instrucciones para una (o más de una) CPU, en la forma de "haga esto. Ahora haga eso". De modo que siempre "llegue al montaje" tarde o temprano. Los lenguajes de alto nivel son marcos (¿andamios?) Para evitar repeticiones extensas de código de ensamblaje, y permiten la programación de una manera más intuitiva; Este aumento en la comprensión, la flexibilidad y la capacidad de mantenimiento tienen un precio: en tamaño, rendimiento y requisitos.

Cuando tenga éxito en obtener el control del proceso de la aplicación, independientemente de los medios (desbordamiento del búfer, etc.), básicamente tiene solo un área de memoria donde puede colocar lo que quiera, y esto es en su mayoría independiente en cómo tienes en este punto.

Ahora, por un lado, el ensamblaje tiene la mayor "densidad" de instrucciones sobre el tamaño del código, al menos para los tamaños de código pequeños, por lo que, naturalmente, es su primera opción si desea abarrotar al máximo en el área que acaba de "conquistar". .

En segundo lugar, y probablemente más importante, cuando golpeas en un área de memoria, sabes poco o nada sobre el "contexto" , no tienes una configuración de contexto . Por ejemplo, en el lenguaje C, su función main() es de hecho una función - recibe el nombre de ejecución de C , que ya ha preparado un entorno para que se ejecute el programa en, una especie de sistema de soporte de vida para su código. Con un Shellcode, no tiene tal soporte, y necesita poder prescindir (es decir, ensamblar) o construir el suyo propio (nuevamente en ensamblaje, ya que el código de construcción de soporte vital no puede necesitar un soporte vital en sí mismo) .

Entonces, en teoría, podría preparar un "código auxiliar de tiempo de ejecución de shellcode" inicializando un entorno y "vinculando" su código C al sistema. Una vez que tuvo esto, simplemente podría adjuntar un código de shell C al tiempo de ejecución y poder referir las funciones del sistema operativo por nombre. Varios shellcodes tienen un código auxiliar para hacer esto, pero generalmente está escrito en Assembly porque la razón número uno todavía se mantiene: el espacio es un bien escaso.

Esas explotaciones que permiten la ejecución de un binario independiente (en la forma más básica y trivial, un archivo adjunto ejecutable a un correo electrónico en el que la víctima hará clic) tienen restricciones de tamaño pequeñas y (generalmente) no tienen requisitos de tiempo de ejecución, por lo que necesitan no, y para fines de mantenimiento casi nunca están escritos en lenguajes de bajo nivel.

    
respondido por el LSerni 25.06.2013 - 10:00
fuente

Lea otras preguntas en las etiquetas