jitb00cの紹介
(0) はじめに
- このプログラムは面白半分で作っているだけです。実用性がないとか言って怒らないように。
(1) これはなに?
- プログラムをコマンドラインから16進数で書いていくと、それを即座に実行することができます。
- 言うまでもないですが、おかしな命令を書けばすぐに落ちます。まあCで200行くらいのプログラムでしかないので、多くを期待してはいけません。実行ファイルは5.0KBです。
- ちなみに VirtualAlloc を使っているのでWindows専用ですが、ここさえ直せばLinuxとかでも行けると思います。
(2) 実行例
> がプロンプトなので、その行だけが入力行で、残りは出力です。
→ 起動直後にregsコマンドを実行してみました。
>regs
<regs> eax:00000000 ecx:00000000 edx:00000000 ebx:00000000 esp:00680000 ebp:00000000 esi:00000000 edi:00000000
<stack>
→ espレジスタ以外は0に初期化されています。スタックは何も積んでいないので表示されません。
→ セクション命令で機械語をメモリにおいてみます。セクション命令が代入命令の一部ではないとき、これは直ちに実行されます。
>sec(0xb8 0x11 0x22 0x33 0x44)
→ B8はEAXへの代入命令です。
→ ちゃんと代入できているか確認してみます。
>regs
<regs> eax:44332211 ecx:00000000 edx:00000000 ebx:00000000 esp:00680000 ebp:00000000 esi:00000000 edi:00000000
<stack>
→ よしよし
→ ではスタックに積んでみましょう。
>sec(0x50)
→ 50 は PUSH EAX です。しかし何も言わないのでうまくいっているかどうかわかりません・・・。
→ ということで確認です。
>regs
<regs> eax:44332211 ecx:00000000 edx:00000000 ebx:00000000 esp:0067fffc ebp:00000000 esi:00000000 edi:00000000
<stack> [44332211]
→ よしよし
→ スタックからおろしてみます。
>sec(0x59)
→ ちなみにこれは POP ECX です。
→ 確認すると・・・
>regs
<regs> eax:44332211 ecx:44332211 edx:00000000 ebx:00000000 esp:00680000 ebp:00000000 esi:00000000 edi:00000000
<stack>
→ うまくいっていることが分かります。
→ これだけだと面白くないので、他のこともやってみます。
>labels
004012f0 : putdec
→ 登録済みの関数が表示されます。
→ この関数を使ってみます。Cで書かれた関数なので、スタックに引数を積みます。
>sec(0x50 0xe8 rel32(0x4012f0) 0x58)
1144201745
→ ADD ESP,4 するのが面倒だったので、 POP EAX で戻しています。
→ ちゃんと10進数表示されているようです。
→ rel32は32ビットの相対アドレスを書き込む命令です。E8はCALL命令です。
- 命令secはセクションの略だったのですが、セクションを作るという発想はいまいちだったなと今は思っていますので許してください。
(3) 見どころは?
- スタックが中途半端な状態でも、ちゃんと帰ってこられるし、続行できる。
- レジスタは全部自由に使える。
- ソースはC言語だけになっていて、インラインアセンブラも使ってない。・・・でも16進数はところどころに書いてあるけどね。
こめんと欄