machine-code - language - machine learning
¿Cómo escribir y ejecutar código de máquina PURE manualmente sin contenedores como EXE o ELF? (8)
Solo necesito una demostración de Hello World para ver cómo funciona realmente el código de máquina.
Aunque ELF de Windows EXE y Linux está cerca del código máquina, pero no es PURE
¿Cómo puedo escribir / ejecutar código de máquina PURE ?
Al apuntar a un sistema integrado, puede crear una imagen binaria de la rom o ram que sea estrictamente las instrucciones y los datos asociados del programa. Y a menudo puede escribir ese binario en un flash / rom y ejecutarlo.
Los sistemas operativos quieren saber más que eso, y los desarrolladores a menudo quieren dejar más que eso en su archivo para que puedan depurarlo o hacer otras cosas con él más tarde (desmontarlo con algunos nombres de símbolos reconocibles). Además, incrustado o en un sistema operativo, es posible que necesite separar .text de .data de .bss de .rodata, etc. y los formatos de archivo como .elf proporcionan un mecanismo para eso, y el caso de uso preferido es cargar ese duende con algunos tipo de cargador, ya sea el sistema operativo o algo así como la programación de la ROM y el RAM de un microcontrolador.
.exe también tiene información de encabezado. Como se mencionó .com no se cargó en la dirección 0x100h y se ramificó allí.
para crear un binario en bruto a partir de un ejecutable, con un archivo elfo creado por gcc, por ejemplo, puedes hacer algo como
objcopy file.elf -O archivo binario.bin
Si el programa está segmentado (.text, .data, etc.) y esos segmentos no son consecutivos, el binario puede llegar a ser bastante grande. Utilizando de nuevo como ejemplo si la rom está en 0x00000000 y los datos o bss están en 0x20000000 incluso si su programa solo tiene 4 bytes de datos objcopy creará un archivo de 0x20000004 bytes rellenando el espacio entre .text y .data (como debería) porque eso es lo que le pediste que hiciera).
¿Qué es lo que estás tratando de hacer? Leer un duende o un archivo intel hex o srec es bastante trivial y de eso puedes ver todos los bits y bytes del binario. O desmontar al elfo o lo que sea, también te mostrará eso en una forma humana legible. (objdump -D archivo.elf> file.list)
Con el código de máquina puro, puede usar cualquier idioma que tenga la capacidad de escribir archivos. incluso visual basic.net puede escribir 8,16,32,64 bit mientras intercambia entre los tipos int mientras escribe.
Incluso puede configurar para que vb escriba el código de la máquina en un bucle según sea necesario para algo como setpixel, donde x, y cambia y usted tiene los colores argb.
o bien, cree su programa vb.net regularmente en Windows y use NGEN.exe
para crear un archivo de código nativo de su programa. Crea un código de máquina puro específico para ia-32, todo en una sola toma lanzando el depurador JIT a un lado.
El sistema operativo no ejecuta las instrucciones, la CPU lo hace (excepto si estamos hablando de un sistema operativo de máquina virtual, que sí existe, estoy pensando en Forth o cosas por el estilo). El sistema operativo, sin embargo, requiere cierta metainformación para saber que un archivo contiene, de hecho, código ejecutable y cómo espera que se vea su entorno. ELF no es solo un código de máquina cercano . Es un código de máquina, junto con cierta información para el sistema operativo, saber que se supone que debe poner a la CPU para ejecutar esa cosa.
Si desea algo más simple que ELF pero * nix, eche un vistazo al formato a.out, que es mucho más simple. Tradicionalmente, los compiladores de * nix C escriben (todavía) su ejecutable en un archivo llamado a.out, si no se especifica ningún nombre de salida.
En Windows, al menos en 32 bits en Windows, puede ejecutar INSTRUCCIONES SIN PROCESAR usando un archivo .com.
Por ejemplo, si toma esta cadena y la guarda en el bloc de notas con una extensión .com:
X5O!P%@AP[4/PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
Imprimirá una cadena y activará su software antivirus.
Estas son buenas respuestas, pero por qué alguien querría hacer esto podría guiar la respuesta mejor. Creo que la razón más importante es tener el control total de su máquina, especialmente sobre la escritura de la memoria caché, para un rendimiento máximo y evitar que cualquier sistema operativo comparta el procesador o virtualice su código (disminuyendo así su velocidad) o especialmente en estos días husmeando tu código también Por lo que puedo decir, el ensamblador no maneja estos problemas y M $ / Intel y otras compañías lo tratan como una infracción o "para los hackers". Esto está muy mal dirigido sin embargo. Si su código ensamblador se transfiere a un sistema operativo o hardware propietario, la optimización verdadera (potencialmente a frecuencias GHz) estará fuera de alcance. Este es un tema muy importante en lo que respecta a la ciencia y la tecnología, ya que nuestras computadoras no se pueden utilizar en todo su potencial sin la optimización del hardware, y a menudo están computando varios órdenes de magnitud debajo de ella. Probablemente hay alguna solución alternativa o algún hardware de código abierto que lo habilite, pero todavía no lo he encontrado. Penny para todos los pensamientos.
Parece que estás buscando el viejo formato de archivo DOS .COM
16 bits . Los bytes de un archivo .COM
se cargan con una desviación de 100 h en el segmento de programa (lo que los limita a un tamaño máximo de 64 k - 256 bytes), y la CPU simplemente comenzó a ejecutarse en el desplazamiento 100 h. No hay encabezados ni ninguna información requerida de ningún tipo, solo instrucciones en bruto de la CPU.
Puede escribir en código de máquina PURE manualmente SIN MONTAJE
Linux / ELF: https://github.com/XlogicX/m2elf . Esto sigue siendo un trabajo en progreso. Empecé a trabajar en esto ayer.
El archivo fuente para "Hello World" se vería así:
b8 21 0a 00 00 #moving "!/n" into eax
a3 0c 10 00 06 #moving eax into first memory location
b8 6f 72 6c 64 #moving "orld" into eax
a3 08 10 00 06 #moving eax into next memory location
b8 6f 2c 20 57 #moving "o, W" into eax
a3 04 10 00 06 #moving eax into next memory location
b8 48 65 6c 6c #moving "Hell" into eax
a3 00 10 00 06 #moving eax into next memory location
b9 00 10 00 06 #moving pointer to start of memory location into ecx
ba 10 00 00 00 #moving string size into edx
bb 01 00 00 00 #moving "stdout" number to ebx
b8 04 00 00 00 #moving "print out" syscall number to eax
cd 80 #calling the linux kernel to execute our print to stdout
b8 01 00 00 00 #moving "sys_exit" call number to eax
cd 80 #executing it via linux sys_call
WIN / MZ / PE:
shellcode2exe.py (toma asciihex shellcode y crea un archivo ejecutable MZ PE exe) ubicación del script:
http://zeltser.com/reverse-malware/shellcode2exe.py.txt
dependencia:
corelabs.coresecurity.com/index.php?module=Wiki&action=attachment&type=tool&page=InlineEgg&file=InlineEgg-1.08.tar.gz
extraer
python setup.py build
instalación de sudo python setup.py
Todos saben que la aplicación que usualmente escribimos se ejecuta en el sistema operativo. Y manejado por eso.
Significa que el sistema operativo se ejecuta en la máquina. Entonces creo que ese es el código de máquina PURE que dijiste.
Entonces, necesitas estudiar cómo funciona un sistema operativo.
Aquí hay un código de ensamblado de NASM para un sector de arranque que puede imprimir "Hola mundo" en PURE.
org
xor ax, ax
mov ds, ax
mov si, msg
boot_loop:lodsb
or al, al
jz go_flag
mov ah, 0x0E
int 0x10
jmp boot_loop
go_flag:
jmp go_flag
msg db ''hello world'', 13, 10, 0
times 510-($-$$) db 0
db 0x55
db 0xAA
Y puede encontrar más recursos aquí: http://wiki.osdev.org/Main_Page .
FIN.
Si había instalado Nasm y tenía un disquete, puede
nasm boot.asm -f bin -o boot.bin
dd if=boot.bin of=/dev/fd0
Luego, puede iniciar desde este disquete y verá el mensaje. (NOTA: debe hacer que el primer inicio de su computadora sea el disquete).
De hecho, sugiero que ejecute ese código en una máquina virtual completa, como: bochs, virtualbox, etc., porque es difícil encontrar una máquina con un disquete.
Entonces, los pasos son Primero, debería necesitar instalar una máquina virtual completa. En segundo lugar, cree un disquete visual mediante commend: bximage En tercer lugar, escriba el archivo bin en ese disquete visual. Por último, inicie su máquina visual desde ese disquete visual.
NOTA: en https://wiki.osdev.org , hay información básica sobre ese tema.