web-dev-qa-db-fra.com

Comment écrire et exécuter manuellement le code machine PURE sans conteneurs tels que EXE ou ELF?

J'ai juste besoin d'une démonstration du monde Hello pour voir comment fonctionne le code machine.

Bien que windows 'EXEet linux'ELFsoit proche du code machine, mais ce n'est pasPURE

Comment puis-je écrire/exécuter_ PUREcode machine?

44
compiler

Tout le monde sait que l'application que nous écrivons habituellement est exécutée sur le système d'exploitation. Et géré par elle.

Cela signifie que le système d'exploitation est exécuté sur la machine. Donc, je pense que c'est le code machine PURE que vous avez dit.

Vous devez donc étudier le fonctionnement d’un système d’exploitation.

Voici un code d'assemblage NASM pour un secteur de démarrage pouvant imprimer "Hello world" dans 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

Et vous pouvez trouver plus de ressources ici: http://wiki.osdev.org/Main_Page .

FIN.

Si vous avez installé nasm et possédez une disquette, vous pouvez

nasm boot.asm -f bin -o boot.bin
dd if=boot.bin of=/dev/fd0

Ensuite, vous pouvez démarrer à partir de cette disquette et vous verrez le message . (NOTE: vous devriez faire le premier démarrage de votre ordinateur la disquette.)

En fait, je vous suggère d’exécuter ce code dans une machine virtuelle complète, telle que: bochs, virtualbox, etc. .. car il est difficile de trouver une machine avec une disquette.

Ainsi, les étapes sont Premièrement, vous devez installer une machine virtuelle complète . Deuxièmement, créez une disquette visuelle en recommandant: bximage Troisièmement, écrivez le fichier bin sur cette disquette visuelle . , démarrez votre machine visuelle à partir de cette disquette visuelle.

REMARQUE: Dans https://wiki.osdev.org , vous trouverez des informations de base sur ce sujet.

20
gelosie

Vous pouvez écrire manuellement dans le code machine PURE SANS assemblage

Linux/ELF: https://github.com/XlogicX/m2elf . C'est encore un travail en cours, je viens de commencer à travailler sur cela hier.

Le fichier source de "Hello World" ressemblerait à ceci:

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 (prend le shellcode asciihex et crée un fichier exe MZ PE légitime):

http://zeltser.com/reverse-malware/shellcode2exe.py.txt

dépendance:

corelabs.coresecurity.com/index.php?module=Wiki&action=attachment&type=tool&page=InlineEgg&file=InlineEgg-1.08.tar.gz

extrait

python setup.py build




Sudo python setup.py install
18
XlogicX

On dirait que vous recherchez le vieux format de fichier 16 bits DOS .COM . Les octets d'un fichier .COM sont chargés avec un décalage de 100h dans le segment de programme (en les limitant à une taille maximale de 64 Ko - 256 octets) et la CPU a simplement démarré son exécution avec un décalage de 100h. Il n'y a aucun en-tête ou aucune information requise d'aucune sorte, juste des instructions brutes de la CPU.

13
Greg Hewgill

Le système d'exploitation n'exécute pas les instructions, pas le processeur (sauf si nous parlons d'un système d'exploitation de machine virtuelle, qui existe, je pense à Forth ou à de telles choses). Cependant, le système d’exploitation nécessite certaines méta-informations pour savoir qu’un fichier contient effectivement du code exécutable et comment il s'attend à ce que son environnement ressemble. ELF n’est pas juste près de code machine. Il s’agit de est code machine et de quelques informations permettant au système d’exploitation de savoir qu’il est supposé mettre le processeur à bien pour exécuter cette tâche.

Si vous voulez quelque chose de plus simple que ELF mais * nix, regardez le format a.out, qui est beaucoup plus simple. Traditionnellement, les compilateurs * nix C écrivent (encore) leur exécutable dans un fichier appelé a.out, si aucun nom de sortie n’est spécifié.

9
datenwolf

Sous Windows (Windows 32 bits ou plus), vous pouvez exécuter RAW INSTRUCTIONS à l'aide d'un fichier .com.

Par exemple, si vous prenez cette chaîne et l'enregistrez dans le bloc-notes avec une extension .com:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Il imprimera une chaîne et activera votre logiciel antivirus.

2
Patrick

Avec du code machine pur, vous pouvez utiliser n’importe quel langage capable d’écrire des fichiers . Même Visual Basic.net peut écrire 8,16,32,64 bits en échangeant entre les types int lorsqu’il écrit.

Vous pouvez même configurer vb pour écrire le code machine dans une boucle selon vos besoins Pour quelque chose comme setpixel, où x, y change et vous avez vos couleurs argb.

ou, créez régulièrement votre programme vb.net dans Windows et utilisez NGEN.exe pour créer un fichier de code natif de votre programme. Il crée un code machine pur spécifique à ia-32 tout en un, en jetant le débogueur JIT de côté.

1
Jason

Lorsque vous ciblez un système intégré, vous pouvez créer une image binaire de la ROM ou de la RAM strictement conforme aux instructions et aux données associées du programme. Et souvent peut écrire ce binaire dans un flash/rom et l'exécuter.

Les systèmes d'exploitation veulent en savoir plus, et les développeurs veulent souvent laisser plus que cela dans leur fichier afin de pouvoir déboguer ou faire d'autres choses plus tard (désassembler avec des noms de symboles reconnaissables). En outre, intégré ou sur un système d’exploitation, vous devrez peut-être séparer les fichiers .text de .data de .bss de .rodata, etc., et les formats de fichier tels que .elf fournissent un mécanisme pour cela, et le cas d’utilisation préféré consiste à charger cet elf avec certains fichiers. sorte de chargeur, que ce soit le système d’exploitation ou quelque chose qui programme la ROM et la RAM d’un microcontrôleur. 

.exe contient aussi des informations d’en-tête. Comme mentionné, .com ne l’a pas chargée à l’adresse 0x100h et y est branchée.

pour créer un binaire brut à partir d’un exécutable, avec un fichier elf créé par gcc, par exemple, vous pouvez faire quelque chose comme: 

objcopy file.elf -O fichier binaire.bin

Si le programme est segmenté (.text, .data, etc.) et que ces segments ne sont pas consécutifs, le fichier binaire peut devenir assez volumineux. Encore une fois, en utilisant embedded comme exemple si la rom est à 0x00000000 et data ou bss à 0x20000000 même si votre programme n'a que 4 octets de données. Objcopy créera un fichier d'octets 0x20000004 comblant le vide entre .text et .data (comme il se doit parce que c'est ce que vous lui avez demandé de faire).

Qu'est-ce que vous essayez de faire? Lire un fichier elf ou intel hex ou srec est assez trivial et à partir de là, vous pouvez voir tous les bits et octets du binaire. Ou démonter l'elfe ou quoi que ce soit vous montrera également cela sous une forme lisible par l'homme. (objdump -D fichier.elf> fichier.list)

1
old_timer

Le programme suivant est un programme Hello World que j’ai écrit en code machine 16 bits (intel 8086). Si vous souhaitez connaître le code machine, je vous suggère d’apprendre à assembler d’abord, car chaque ligne de code dans Assembly est convertie en ligne de code A Langage machine. Car je sais que je viens des rares personnes dans le monde, programmant toujours en code machine plutôt qu'en assembleur.

BTW, pour l'exécuter, enregistrez le fichier avec l'extension ".com" et exécutez-le sur DOSBOX!

Donc, c'est un programme Hello World.

0
גיא כהן

Ce sont des réponses intéressantes, mais pourquoi quelqu'un voudrait le faire pourrait mieux guider la réponse. Je pense que la raison la plus importante est d’obtenir le contrôle total de leur machine, en particulier sur son écriture en cache, pour des performances optimales, et empêcher tout système d’exploitation de partager le processeur ou de virtualiser votre code (le ralentissant ainsi) ou particulièrement de nos jours en fouinant votre code aussi. Autant que je sache, l'assembleur ne gère pas ces problèmes et M $/Intel et d'autres sociétés le traitent comme une infraction ou "pour des pirates informatiques". C'est très mal dirigé cependant. Si votre code assembleur est transmis à un système d'exploitation ou à du matériel propriétaire, la véritable optimisation (potentiellement aux fréquences GHz) sera hors de portée. C’est un problème très important du point de vue de la science et de la technologie, car nos ordinateurs ne peuvent être pleinement exploités sans optimisation matérielle et calculent souvent plusieurs ordres de grandeur en dessous. Il existe probablement une solution de contournement ou un matériel à source ouverte qui permet cela, mais je ne l’ai pas encore trouvé. Penny pour les pensées de quiconque. 

0
Zack Barkley