簡単な C プログラムを AMD64 向けにコンパイルして radare2 でディスアセンブルしてみよう!(Part 2)
June 16, 2020

さて前回は「プログラムを書くとはどういうことか」や「ディスアセンブルするとはどういうことか」などを、ろくにわかりもしない僕が偉そうに語らせていただきましたが、今回からはいよいよ少しずつ手を動かしながら C 言語でプログラムを書いてコンピュータとお近づきになろうと思います。

※ 今回はこの記事のように Terminal での作業を前提とします👿
※ 記事に書いてあることをまじでちゃんと理解して実行しようとすると簡単な CUI の操作や 簡単な Linux Command 等に関する知識が必要となります。
※ ほんとはそこまで含めてできる限り全部説明したいし、実際一度そこらへんの説明まで盛り込んだ文章を途中まで書いていたのですが、
※ 全部を丁寧に説明するのがあまりに大変すぎて断念しました。
※ 興味ある人(特に CUI での開発等)や実際に作業していて詰まった方などはもっとご説明しますので
Twitterツイキャス などまで…

コンパイラをインストールする


まず C 言語を翻訳してくれる天才翻訳者であるところのコンパイラをインストールしていきます!!

Windows 環境

WSL の環境を前提とします👿
まだ環境を作ってない人はこれでも読んで作ってみてください!!!
C 言語でこれからプログラムを書き、コンピュータがわかる言語に翻訳していくわけですが、その天才翻訳者であるところの gcc というコンパイラさんの助けなしには人間は無力なので、丁重にインストールしましょう!

その前に、何かの手違いでもうすでに gcc さんにご入居いただいていないかを軽く確認してみましょうか。
Terminal を開き下記のコマンドを入力してみてください!!

gcc --version

以下は表示の一例ですが、こんな感じで表示されていたらもうすでに gcc さんにはご入居いただいております。

gcc_version


ちなみにこの手法は大抵のコマンドに対して有効です。つまり 「このコマンド入ってたっけ?」 みたいなときは

<調べたいコマンド> --version

のように入力して version 情報を表示させれば確認できます!コマンドがなければ

command not found

みたいな表示がされます。そのまんまですね!

gcc さんがまだ入っていなければ今から入れましょう!!

sudo apt update
sudo apt install gcc

そこでもう一度さきほどの --version コマンドを入力し、ちゃんとインストールされたか確認してみましょう。


Mac や Linux などその他の環境

Mac ってどうやって入れるのが普通なんでしょうね。

まあこれの最初のほうに 「Mac に Homebrew 入れる」 みたいな記事あるんですが、それでも見ながら Homebrew とかいう、コマンドを注文するとだいたいなんでも持ってきてくれる Amazon みたいなツールを、まずは入れてみて、そのあとその Homebrew でさっそく gcc 注文しますかね…。

brew install gcc

Linux は WSL のときとだいたいいっしょでしょ。がんばえー!!!

C 言語でプログラムを書いてみる


まずいきなりプログラムを書き始める前に、適当な場所に今回の作業用のディレクトリでも作成しておくのがいいかと思います。

ちなみにディレクトリが何なのかわからない方のためにですが、ディレクトリはフォルダのようなものです。
厳密には文脈によりフォルダとディレクトリは使い分けしたほうがいいっぽいですが、細かいことは気にせずこのブログではフォルダのことをディレクトリと呼びます。
ディレクトリはフォルダのことであると知っておくと、今後なにかと便利でもあります。

ところで作業場を作る場所ですが、個人的にはまあデスクトップが視覚的に確認しやすくてわかりやすくていいかなと思ったので、なんとなく下記ではデスクトップに作業用のtestという名前のディレクトリを、コマンドにて作成しています。

cd Desktop
mkdir test

ターミナルを用いた CUI 操作にあまり慣れていない人へ、たとえば下記の gif のような感じの作業風景となります。

mkdir

上記コマンドでデスクトップにディレクトリがちゃんと作成されたことは、下記の用にデスクトップにアイコンが作成されていることからも確認できます。

test

作成したtestというディレクトリの中にさっそくコマンドラインで移動してみましょう。

cd test

では作業場もできたのでいよいよコードを書いていきましょう。
下記のように C 言語でコードを書き、 test.c というファイル名で保存してください。

#include <stdio.h>

int main () {
	printf("Hello World.\n");
	return 0;
}

上の C 言語をコンピュータが理解し実行できるように、下記のコマンドを入力し、コードをコンパイル(コンピュータがわかる言語に翻訳)します。

※ ほんとはここで行われているのはコンパイルのみならず、そのコンパイルをも含んだ「ビルド」と呼ばれる一連のプロセスなのですが、このへんあとで、というかたぶん次のポストで,もう少し詳しく説明します👿

gcc test.c

そうすると作業しているのと同じディレクトリに a.out という実行可能ファイルができるので、そのファイルを実行してみます。

「実行してみます」とは結局のところ、 C 言語で書いたプログラムに乗せたあなたの想いが、ついにコンピュータに届くことを意味するのです。

思えばここまで長い道のりでしたね…。

日本語でコンピュータに「これをしてください」と話しかけても伝わらない、とはいえコンピュータが理解できる言語は今度はこっちが理解できない、そこへ C 言語という一条の光明が差し、コンパイラという超天才の助けも借りて、ついにあなたはコンピュータに自分の想いを伝えることに成功したのです…。

こうして人は少しずつコンピュータを知り、コンピュータと友達になり、やがてコンピュータと恋に落ち、この広く青く美しい地球で、人類の輝かしい明日は築かれるのかな…と僕は思います。

…いや早く話を先に進めろって話ですよね?わかりみです。ちょっと待ってください。

さあ、ついに下記のコマンドを入力して、先ほど作った 「コンピュータへのあなたの想いが詰まった」 実行ファイルを…実行してみましょう。

./a.out

下記のように表示されれば成功です!!!!!!!!!!

helloworld



今回はこのくらいにさせてください。中身がいつも以上に無いですけど。

次回



たぶん

・コンパイルだけじゃコンピュータに想いは伝わらない? gcc がひそかに行ってくれているビルドとはなにか。コンパイルとの違いは。
・もう少し gcc を知ろう!
・いよいよ登場 radare2 ! コンパイラに自分の想いがどう翻訳されコンピュータに伝わったのかの確認をしよう!

引き続きご質問ご意見ご感想等はTwitterツイキャス などまでお寄せいただけましたら…