Shellenは対話型のシェルコード作成環境です。シェルコードを書くための便利なツールをお探しなら、shellenはあなたの友になるかもしれません。Shellenはアセンブルツールや逆アセンブルツールとしても使用できます。
shellenのすべての操作にはkeystoneエンジンとcapstoneエンジンが使用されています。
Shellenはpython3でのみ動作します。python2のサポートは将来追加されるかもしれません。
まず、shellenの依存パッケージをインストールする必要があります:
$ sudo apt-get install cmake python3-dev python3-setuptools
pip3を使用してshellenの安定版をインストールできます:
$ sudo pip3 install shellen
または、必要なパッケージがすでにすべて揃っている場合(必要条件を参照):
$ python3 setup.py install
keystone-engineのインストールで問題が発生した場合は、keystone-engineをコンパイルする必要があります(keystoneリポジトリ内のCOMPILE.mdファイルを参照)。
shellenと必要なパッケージをインストールした後、ターミナルで次のように入力するとshellenを実行できます:
$ shellen
shellenの使用方法については、shellenのhelpコマンドを実行すると情報を得られます。
Shellenは命令のアセンブルと逆アセンブルを行うため、それぞれasmモードとdsmモードという2つの使用モードがあります。その他の機能には、システムコールテーブルの検索や一般的なシェルコードの検索などがあります。
Shellenには、現在のモード、OS(システムコール用のオペレーティングシステム)、および現在のモードで選択されているアーキテクチャを表示する便利なプロンプトがあります。Shellenのプロンプトは次のようになります:
L:asm:x86_32 >
ターミナルで入力しているのと同じように入力を編集できます。また、shellenはコマンド履歴を記録します(上矢印キーを押すだけで以前のコマンドを表示できます)。
プロンプトのLはLinuxの短縮名です。以下に他のすべてのOS名を示します:
LはLinuxWはWindowsMはMacOSOSを変更したい場合は、次のようにsetos [linux/windows/macos]と入力します:
L:asm:x86_32 > setos windows
[+] OS changed to windows.
現在のモードを変更するには、プロンプトでasmまたはdsmを入力します。
L:dsm:arm32 > asm
[+] Changed to asm (assembly) mode
L:asm:x86_32 > dsm
[+] Changed to dsm (disassembly) mode
L:dsm:arm32 >
| コマンド | 説明 |
|---|---|
clear | ターミナル画面をクリアします。Windowsのclsや*nix系のclearと同じです。 |
help | ヘルプメッセージを表示します。 |
quit,q,exit |
命令をアセンブルするには、次のようにセミコロンで区切って入力します:
L:asm:x86_32 > mov edx, eax; xor eax, eax; inc edx; int 80;
[+] Bytes count: 7
Raw bytes: "\x89\xc2\x31\xc0\x42\xcd\x50"
Hex string: "89c231c042cd50"
アセンブルされたバイトにヌルバイトが含まれている場合、shellenがそのことを通知します。
逆アセンブルはアセンブルと似ています。プロンプトにバイトを入力して結果を確認してください!
L:dsm:x86_32 > 89c231c042cd50
0x00080000: mov edx, eax
0x00080002: xor eax, eax
0x00080004: inc edx
0x00080005: int 0x50
また、シェルコードをサブプロセスで実行することもできます。これによりシステムに害が及ぶ可能性があることに注意してください! サブプロセスで最後のシェルコードにジャンプします。何が問題になるというのでしょう? なお、コードがロードされるベースアドレスを制御することはできず、命令がCPUにとって意味のあるものであることを前提としています。使用方法については、shellen内のhelpを参照してください。
潜在的に危険なシェルコードをより安全に実行できるよう、何らかの仮想環境でサブプロセスを実行することを計画しています。
asmモードとdsmモードは、さまざまなアーキテクチャで動作します。現在のモードで利用可能なアーキテクチャの一覧を表示するには、次のように入力します:
L:dsm:x86_32 > archs
┌────────┬────────┬─────────┬─────────┬────────┐
│ │ │ │ │ │
│ arm32 │ mips32 │ sparc32 │ systemz │ x86_16 │
│ arm64 │ mips64 │ sparc64 │ │ x86_32 │
│ arm_tb │ │ │ │ x86_64 │
└────────┴────────┴─────────┴─────────┴────────┘
現在のアーキテクチャを変更するには、次のように入力します:
L:dsm:x86_32 > setarch arm32
[+] Architecture of dsm changed to arm32
シェルコードを作成するときは、システムコールが必要になります。shellenでシステムコールを調べるには、sysと目的のシステムコール名を入力します。Shellenは、探しているシステムコールを含む可能性のあるシステムコールのリストを表示します。
L:asm:x86_32 > sys open
┌────────┬───────┬──────────────────────┬──────────────────────┬──────────────┬──────────────┐
│ name │ eax │ ebx │ ecx │ edx │ esi │
├────────┼───────┼──────────────────────┼──────────────────────┼──────────────┼──────────────┤
│ open │ 0x05 │ const char *filename │ int flags │ umode_t mode │ - │
│ openat │ 0x127 │ int dfd │ const char *filename │ int flags │ umode_t mode │
└────────┴───────┴──────────────────────┴──────────────────────┴──────────────┴──────────────┘
sysは、指定されたシステムコールの可能なバリアントのリストを表示します。shellenが検索するシステムコールテーブルは、選択されたアーキテクチャとオペレーティングシステム(OS)によって異なります。この場合、アーキテクチャはx86_32で、OSはLinuxです。
Shellenは、キーワードに応じた一般的なシェルコードのリストを表示できます。Shellenのキーワード検索はshell-storm.orgのAPIを使用しており(作者に感謝!)、次のように使用できます:
L:asm:x86_32 > shell <keyword> <count>
countパラメータは必須ではないことに注意してください。shell <keyword> <count>の出力の画像は画像セクションにあります。
現在、shellenはLinuxでのみサポートされています。WindowsまたはMacOS用の機能を追加したい場合は、issueを作成してください。サポートを追加します。
問題やバグなどを見つけた場合は、その問題についてissueを作成してください。また、shellenに追加すると良い機能があると思った場合も同じように、issueを作成してください。リクエストいただいた機能の追加を試みます。
asmモードとdsmモードで異なる履歴ちょっとした画像の数々です。(さまざまな機能が追加されたため、古いものです)
| 現在のセッションを終了してshellenを終了します |