Как написать и выполнить PURE машинный код вручную без контейнеров, таких как EXE или ELF? - PullRequest
46 голосов
/ 11 марта 2011

Мне просто нужна демоверсия hello world, чтобы увидеть, как на самом деле работает машинный код.

Хотя windows ' EXE и linux' ELF близки к машинному коду, но это не PURE

Как мне написать / выполнить PURE машинный код?

Ответы [ 9 ]

21 голосов
/ 11 марта 2011

Всем известно, что приложение, которое мы обычно пишем, выполняется в операционной системе.И управляется им.

Это означает, что операционная система запущена на машине.Поэтому я думаю, что это чистый код, который вы сказали.

Итак, вам нужно изучить, как работает операционная система.

Вот код сборки NASM для загрузочного сектора, который может печатать "Hello world "в 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

И вы можете найти больше ресурсов здесь: http://wiki.osdev.org/Main_Page.

END.

Если вы установили nasm и у вас есть дискета,Вы можете

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

Затем вы можете загрузиться с этой дискеты, и вы увидите сообщение.(ПРИМЕЧАНИЕ: вы должны сделать первую загрузку вашего компьютера дискетой.)

На самом деле, я предлагаю вам запустить этот код на полной виртуальной машине, например: bochs, virtualbox и т. Д., Поскольку трудно найтимашины с дискетой.

Итак, во-первых, вам нужно установить полноценную виртуальную машину.Во-вторых, создайте визуальную дискету с помощью commend: bximage В-третьих, запишите файл bin на эту визуальную дискету.Наконец, запустите ваш визуальный компьютер с этой визуальной дискеты.

ПРИМЕЧАНИЕ. В https://wiki.osdev.org есть некоторая базовая информация по этой теме.

20 голосов
/ 25 августа 2014

Вы можете написать в PURE машинный код вручную БЕЗ СБОРКИ

Linux / ELF: https://github.com/XlogicX/m2elf. Это все еще в стадии разработки, я только начал работать над этим вчера.

Исходный файл для «Hello World» будет выглядеть так:

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 (принимает шеллкод asciihex и создает допустимый exe-файл MZ PE):

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

зависимость:

corelabs.coresecurity.com / index.php? Модуль = Wiki и действие = прикрепление и тип = инструмент и страница = InlineEgg и файл = InlineEgg-1.08.tar.gz

экстракт

python setup.py build




sudo python setup.py install
14 голосов
/ 11 марта 2011

Звучит так, будто вы ищете старый 16-битный формат файла DOS .COM . Байты файла .COM загружаются со смещением 100h в программном сегменте (ограничивая их максимальным размером от 64 до 256 байт), и процессор просто начинает выполнять со смещением 100h. Там нет заголовков или какой-либо необходимой информации, только необработанные инструкции процессора.

9 голосов
/ 25 марта 2012

ОС не выполняет инструкции, а процессор (кроме случаев, когда мы говорим об ОС на виртуальной машине, которая существует, я думаю о Forth или о других вещах). Однако ОС требуется некоторая метаинформация, чтобы знать, что файл на самом деле содержит исполняемый код и как он ожидает, что его среда будет выглядеть. ELF - это не просто около машинного кода. Это - это машинный код, вместе с некоторой информацией для ОС, которая должна знать, что ЦП должен фактически выполнять эту вещь.

Если вы хотите что-то более простое, чем ELF, но * nix, взгляните на формат a.out, который намного проще. Традиционно * nix C-компиляторы (все еще) записывают свой исполняемый файл в файл с именем a.out, если выходное имя не указано.

2 голосов
/ 11 марта 2011

В Windows - не менее 32-битной Windows - вы можете выполнить RAW ИНСТРУКЦИИ, используя файл .com.

Например, если вы возьмете эту строку и сохраните ее в блокноте с расширением .com:

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

Он напечатает строку и отключит антивирусное программное обеспечение.

1 голос
/ 30 мая 2012

С чистым машинным кодом вы можете использовать любой язык, который умеет писать файлы.даже visual basic.net может записывать 8,16,32,64 бит при обмене между типами int во время записи.

Вы даже можете настроить, чтобы vb записывал машинный код в цикл по мере необходимости.как setpixel, где x, y изменяется, и у вас есть цвета argb.

или регулярно создавайте вашу программу vb.net в windows и используйте NGEN.exe для создания файла собственного кода вашей программы.Он создает чистый машинный код, специфичный для ia-32, и все это одним выстрелом, отбрасывая отладчик JIT.

1 голос
/ 23 марта 2011

При нацеливании на встроенную систему вы можете создать двоичный образ диска или оперативной памяти, который является строго инструкциями и соответствующими данными из программы.И часто можно записать этот двоичный файл во флэш-память и запустить его.

Операционные системы хотят знать больше, а разработчики часто хотят оставить больше, чем это, в своем файле, чтобы они могли отлаживать или делать другие вещис этим позже (разобрать с некоторыми узнаваемыми именами символов).Кроме того, встроенные или в операционной системе вам может понадобиться отделить .text от .data от .bss от .rodata и т. Д., И форматы файлов, такие как .elf, предоставляют механизм для этого, и предпочтительный вариант использования - загрузить этого эльфа с некоторымисвоего рода загрузчик, будь то операционная система или что-то, программирующее ROM и RAM микроконтроллера.

.exe также имеет некоторую информацию заголовка.Как уже упоминалось, .com не загружается по адресу 0x100h и там разветвляется.

для создания необработанного двоичного файла из исполняемого файла, например, с помощью созданного gcc файла elf вы можете сделать что-то вроде

файл objcopy.elf -O двоичный файл.bin

Если программа сегментирована (.text, .data и т. д.) и эти сегменты не расположены вплотную, двоичный файл может стать довольно большим.Опять же, используя в качестве примера внедренный, если rom находится в 0x00000000, а data или bss в 0x20000000, даже если ваша программа имеет только 4 байта данных. Objcopy создаст файл байтов 0x20000004, заполняющий пробел между .text и .data (как и должно быть)потому что это то, что вы просили это сделать).

Что вы пытаетесь сделать?Чтение файла elf или intel hex или srec довольно тривиально, и из этого вы можете увидеть все биты и байты двоичного файла.Или разборка эльфа или что-то еще покажет вам это в удобочитаемой форме.(objdump -D file.elf> file.list)

0 голосов
/ 04 января 2019

Следующая программа - это программа Hello World, которую я написал в машинном коде 16 бит (intel 8086). Если вы хотите узнать машинный код, я предлагаю вам сначала изучить ассемблер, потому что каждая строка кода в ассемблере преобразуется в Aстрока кода в машинном коде.Насколько я знаю, я из немногих людей в мире, которые все еще программируют на машинном коде вместо ассемблера.

Кстати, чтобы запустить его, сохраните файл с расширением .com и запустите на DOSBOX.!

Итак, это программа Hello World.

0 голосов
/ 03 июня 2017

Это хорошие ответы, но почему кто-то захочет сделать это, может помочь лучше ответить.Я думаю, что самая важная причина - получить полный контроль над своей машиной, особенно над записью в кеш, для максимальной производительности и предотвращения разделения ОС процессором или виртуализации вашего кода (таким образом замедляя его), или особенно в наши дни, отслеживаятвой код тоже.Насколько я могу судить, ассемблер не справляется с этими проблемами, а M $ / Intel и другие компании рассматривают это как нарушение или «для хакеров».Это очень неправильно, однако.Если ваш ассемблерный код передан ОС или проприетарному оборудованию, истинная оптимизация (потенциально на частотах ГГц) будет недостижима.Это очень важный вопрос в отношении науки и техники, поскольку наши компьютеры не могут полностью использовать свой потенциал без оптимизации оборудования, и зачастую они вычисляются на несколько порядков ниже.Вероятно, есть какой-то обходной путь или какое-то оборудование с открытым исходным кодом, которое позволяет это, но я еще не нашел его.Пенни за чьи-то мысли.

...