web-dev-qa-db-ja.com

EXEやELFなどのコンテナなしでPUREマシンコードを手動で記述して実行するにはどうすればよいですか?

マシンコードが実際にどのように機能するかを確認するには、hello worldデモが必要です。

Windows '[〜#〜] exe [〜#〜]とlinux' [〜#〜] elf [〜#〜]はマシンコードに近いが、そうではない[〜#〜] pure [〜#〜]

[〜#〜] pure [〜#〜]マシンコードを記述/実行するにはどうすればよいですか?

47
compiler

私たちが普段書いているアプリケーションがオペレーティングシステムで実行されていることは誰もが知っています。そしてそれによって管理されます。

これは、オペレーティングシステムがマシン上で実行されることを意味します。それはあなたが言った純粋なマシンコードだと思います。

そのため、オペレーティングシステムがどのように機能するかを調べる必要があります。

PUREで「Hello world」を印刷できるブートセクターのNASMアセンブリコードを次に示します。

 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

終わり。

Nasmをインストールしてフロッピーがあった場合、次のことができます。

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

次に、このフロッピーから起動すると、メッセージが表示されます。 (注:コンピューターの最初の起動はフロッピーにする必要があります。)

実際、bochs、virtualboxなどのような完全な仮想マシンでそのコードを実行することをお勧めします。フロッピーのあるマシンを見つけるのは難しいからです。

したがって、手順は最初に、完全な仮想マシンをインストールする必要があります。第二に、賞賛によってビジュアルフロッピーを作成します。bximage第三に、そのビジュアルフロッピーにbinファイルを書き込みます。最後に、ビジュアルフロッピーからビジュアルマシンを起動します。

注: https://wiki.osdev.org には、そのトピックに関するいくつかの基本情報があります。

21
gelosie

あなたはcanPUREマシンコードを手動で記述できますアセンブリなし

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シェルコードを取得し、正当なMZ PE exeファイルを作成)スクリプトの場所:

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

依存:

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

エキス

python setup.py build




Sudo python setup.py install
20
XlogicX

古い 16ビットDOS .COMファイル形式 を探しているようです。 .COMファイルのバイトはプログラムセグメントのオフセット100hにロードされ(最大サイズ64k-256バイトに制限されます)、CPUは単にオフセット100hで実行を開始します。ヘッダーやあらゆる種類の必要な情報はなく、生のCPU命令だけです。

14
Greg Hewgill

OSは命令を実行せず、CPUは実行します(存在する仮想マシンOSについて話している場合を除き、Forthなどについて考えています)。ただし、OSには、ファイルに実際に実行可能コードが含まれていること、および環境がどのように見えるかを知るために、何らかのメタ情報が必要です。 ELFは単なるnearマシンコードではありません。それはisマシンコードと、OSがCPUにそのことを実際に実行させることになっていることを知るためのいくつかの情報と一緒です。

ELFよりもシンプルで* nixが必要な場合は、a.out形式をご覧ください。これははるかに簡単です。従来、* nix Cコンパイラは、出力名が指定されていない場合、実行可能ファイルを(まだ)a.outというファイルに書き込みます。

9
datenwolf

Windows(少なくとも32ビットWindows)では、.comファイルを使用してRAW INSTRUCTIONSを実行できます。

たとえば、この文字列を取得して、メモ帳に.co​​m拡張子を付けて保存する場合:

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

文字列を出力し、ウイルス対策ソフトウェアを起動します。

2
Patrick

純粋なマシンコードを使用すると、ファイルを作成できる任意の言語を使用できます。 visual basic.netでさえ、書き込み中にint型を交換しながら8,16,32,64ビットを書き込むことができます。

Setpixelのようなものに必要に応じてvbがマシンコードをループで書き出すように設定することもできます。この場合、x、yが変わり、argbの色があります。

または、Windowsでvb.netプログラムを定期的に作成し、NGEN.exeプログラムのネイティブコードファイルを作成します。 IA-32に固有の純粋なマシンコードをすべて一度に作成し、JITデバッガーを脇に置きます。

1
Jason

組み込みシステムをターゲットとする場合、プログラムからの指示と関連データに厳密に一致するromまたはramのバイナリイメージを作成できます。また、多くの場合、そのバイナリをフラッシュ/ ROMに書き込んで実行できます。

オペレーティングシステムはそれ以上のことを知りたいと思っており、開発者は多くの場合、ファイルにそれ以上の情報を残して、後でデバッグしたり、他のことを実行したりします(認識可能なシンボル名で逆アセンブルします)。また、組み込みまたはオペレーティングシステムでは、.textを.dataから.bssから.rodataなどから分離する必要がある場合があり、.elfのようなファイル形式はそのためのメカニズムを提供します。オペレーティングシステム、またはマイクロコントローラのROMとRAMをプログラミングするものなど、ローダーの一種です。

.exeにもいくつかのヘッダー情報があります。前述のとおり、.comはアドレス0x100hでロードし、そこで分岐しませんでした。

gccで作成されたelfファイルを使用して、実行可能ファイルから生のバイナリを作成するには、次のようにします。

objcopy file.elf -Oバイナリfile.bin

プログラムがセグメント化されている場合(.text、.dataなど)、それらのセグメントが連続していない場合、バイナリは非常に大きくなる可能性があります。プログラムに4バイトのデータしかない場合でも、ROMが0x00000000でデータまたはbssが0x20000000の場合、例としてembeddedを使用すると、objcopyは.textと.dataの間のギャップを埋める0x20000004バイトのファイルを作成しますそれがあなたがそれをするように頼んだものだからです)。

何をしようとしているのですか? elfまたはintelのhexまたはsrecファイルの読み取りは非常に簡単であり、そこからバイナリのすべてのビットとバイトを確認できます。または、エルフなどを分解して、人間が読める形式で表示します。 (objdump -D file.elf> file.list)

1
old_timer

次のプログラムは、機械コード16ビット(インテル8086)で書いたHello Worldプログラムです。機械コードを知りたい場合は、最初にAssemblyを学習することをお勧めします。マシンコード。私は、私がアセンブリの代わりにマシンコードでプログラミングをしている世界の少数の人々であることを知っています。

ところで、それを実行するには、ファイルを「.com」拡張子で保存し、DOSBOXで実行してください!

つまり、これはHello Worldプログラムです

0
גיא כהן

これは素晴らしい回答ですが、誰かがこれをしたい理由は、答えをより良く導くかもしれません。最も重要な理由は、特に最大のパフォーマンスを得るために、特にキャッシュ書き込みを完全に制御し、OSがプロセッサーを共有したりコードを仮想化したり(コードを遅くしたり)したり、最近は特にあなたのコードも。私が知る限り、アセンブラーはこれらの問題を処理せず、M $/Intelと他の企業はこれを侵害または「ハッカー向け」のように扱います。ただし、これは非常に間違っています。アセンブラコードがOSまたは独自のハードウェアに引き渡されると、真の最適化(GHz周波数での可能性)が手の届かないところになります。これは科学技術に関して非常に重要な問題です。当社のコンピューターはハードウェアの最適化なしでは最大限の能力を発揮できず、多くの場合、それ以下の数桁を計算しています。おそらく、これを可能にする回避策またはオープンソースのハードウェアがありますが、まだ見つかりません。誰でも考えられるペニー。

0
Zack Barkley