Linuxでのアセンブラー開発

一般的に、Linuxでのアセンブリ言語プログラミングは広まっておらず、アセンブラーのファンがそれに取り組んでいます。 今日は、アセンブリ言語のプログラミングとツールキットについてお話します。 必要なもの:

実際、誰もが自分でツールを選択します。 私は自分でこれらを選びました。

FASMをインストールする


アーカイブをオフからダウンロードした後。 サイトを展開します。

tar zxvf fasm-1.69.11.tgz

このフォルダには、コンパイルに使用できるバイナリfasmファイルがあります。 便宜上、シンボリックリンクを作成できます:

sudo ln -s /home/username/fasm/fasm /usr/local/bin

aldとshedのインストールはこれ以上複雑ではありません。

$ ./configure
$ make
# make install


その結果、アセンブリ言語プログラミングに役立つ3つのツールが用意されます。

システムコール


他のほとんどのオペレーティングシステムと同様に、Linuxはいわゆる API-プログラマーにとって便利な機能のセット。 ほとんどの場合、80h割り込みを使用してシステム関数呼び出しが行われます。 Linuxはfastcallパラメーターの受け渡し規則を使用していることに注意してください。 それによると、パラメーターはレジスターを介して渡されます(たとえば、ウィンドウでは、パラメーターがスタックを介して渡されるstdcallが使用されます)。 呼び出された関数の数はeaxに入れられ、パラメーターはレジスターに入れられます。

パラメータ番号/レジスタ

1 / ebx
2 / ecx
3 / edx
4 / esi
5 / edi
6 / ebp

ご覧のとおり、すべてがそれほど複雑ではありません。 少なくともここで、システム関数の数、その説明、およびパラメーターを調べることができます。 例としてsys_exitを取り上げます。 このページでわかるように、1つのパラメーターがあります-戻りコードとシリアル番号1。したがって、次のコードで呼び出すことができます。

mov eax, 1 ; 1 -
sub ebx, ebx ; ( mov ebx, 0)
int 80h ; 80h


すべてが明確であることを願っています。

Hello World!


じゃあ 何も書かない すべてが私たちのために書かれています:) fasm/examples/elfexeには、hello.asmファイルがあり、これには次のコードが含まれています。

; fasm demonstration of writing simple ELF executable

format ELF executable 3
entry start

segment readable executable

start:

mov eax,4
mov ebx,1
mov ecx,msg
mov edx,msg_size
int 0x80

mov eax,1
xor ebx,ebx
int 0x80

segment readable writeable

msg db 'Hello world!',0xA
msg_size = $-msg


ご覧のとおり、2つのシステム関数がここで呼び出されますsys_write (シリアル番号4)とsys_exitです。 sys_writeは、出力ストリーム記述子(1-stdout)、文字列へのポインター、および文字列サイズの3つのパラメーターを受け入れます。 既に述べたように、関数番号自体はeaxに入れなければなりません。 すでにsys_exit関数。 この奇跡をfasm hello.asmようにfasm hello.asmできfasm hello.asm (ただし、ソースと同じ場所にバイナリがあるため、必ずしもそうではありません)。

中身を見てみましょう


バイナリを調べる時が来たと思います。 まず、16進エディターを使用して、取得するものを確認します。 コマンドを実行します:

shed hello

画像

プログラム全体、データ、エルフヘッダーが表示されます。 悪くない? 次に、デバッガでプログラムを確認します。 コンソールに入力します:

ald hello

コマンドを入力するという提案のある行で迎えられるべきです。 helpと入力しhelpコマンドのリストを調べるか、help commandと入力して別のコマンドでヘルプを取得できます。 disassembleコマンド(またはそのエイリアス-" d ")を使用してプログラムを逆アセンブルできます。 プログラムの逆アセンブルされたリストが表示されます。 左側は住所、右側はチーム自体、中央はチームのオペコードです。

dumpコマンドを使用してダンプを取得できます(奇妙ですが、 helpコマンドの出力にはありません)。

画像

次に、 nextコマンドを使用してみてください。 それを実行すると、それに応じて、レジスタの値、フラグセット、次に実行されるアドレス、オペコード、逆アセンブルされたコマンドが表示されます。 コマンドを実行し、フラグとレジスタの変更を監視してください。 最初の割り込みが呼び出された後、「Hello world!」が画面に表示されます。

この記事の目的は、一般的なアセンブリ言語プログラミングではなく、Linuxでのアセンブリ言語プログラミングの基本を示すことでした。 ここから何か役に立つことを学んだことを願っています。

PS。 Habrに関する最初の記事。

便利なリンク


asm.sourceforge.net
www.int80h.org

Source: https://habr.com/ru/post/J79454/


All Articles