はじめに
近年はファイル名を指定して実行を用いたPC初心者向けの攻撃が流行りつつあるらしいですね。
ユーザー自身が実行しているのでセキュリティ的にいろいろ突破しやすいのだとか。
PC上級者の皆様は大丈夫だと思いますが、ファイル名を指定して実行をする際にはよく注意する必要がありますね。
今回は持ってる知識でファイル名を指定して実行からメッセージボックスを表示できそうだったので試してみました。
やっていることは非常に単純ですが、一部応用すれば何かに活用できるかもしれません。
使用条件
- 特に設定を変更していない市販の新しめのWindowsPCを使用する(Windows7SP1以降なら多分大体できる)
- 設定や権限、セキュリティソフトなどでアプリケーションの実行を阻害していない
- ユーザーディレクトリ直下にa.cs、a.exeがないこと(上書きされ削除されます)
- 37字程度の文字列をメッセージボックスで表示できる
前提情報
- 「ファイル名を指定して実行」はWin+Rキーで表示されるアレ(英語環境だと「Run」)
- 「ファイル名を指定して実行」は標準で260文字までのコマンドを実行できる
- コマンドプロンプトは「cmd /C コマンド」のように実行するとコマンドを実行して閉じる
- csc.exeはプリインストールされている.NET Framework4.0のC#コンパイラ
やり方
以下のコードを「ファイル名を指定して実行」欄に張り付けて実行します。
cmd /C cd %USERPROFILE%&echo namespace P{class P{static void Main(){System.Windows.Forms.MessageBox.Show("あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆ");}}}>a.cs&%windir%\Microsoft.NET\Framework\v4.0.30319\csc.exe /target:winexe a.cs&start /wait a.exe&del a.cs a.exe
ちょうど260文字です。
「あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆ」とメッセージボックスで表示されます。
説明
260文字で以下のようなことをしています。
- メッセージボックスを表示するC#コードをファイルに書き込む
- コンパイルして実行
- メッセージボックスを閉じたら関連ファイルを削除
上のワンライナーは以下のように分解できます。
コマンドプロンプトで以降のコードを実行して閉じる
cmd /C
フォルダ移動:ファイル出力可能フォルダに移動
cd %USERPROFILE%
%USERPROFILE% は C:\Users\ユーザー名 を指す環境変数です。
基本的にはファイル出力できるフォルダです。
コード部:メッセージボックスを表示するC#コードをファイルへ出力
echo namespace P{class P{static void Main(){System.Windows.Forms.MessageBox.Show("あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆ");}}}>a.cs
メッセージボックスを表示する最低限のC#のコードをファイルにa.cs書き込んでいます。
コンパイル部:csc.exeでc#のコードをexeへとコンパイル
%windir%\Microsoft.NET\Framework\v4.0.30319\csc.exe /target:winexe a.cs
%windir% は C:\Windows を指す環境変数です。
WinFormsアプリケーションを作る際は /target:winexe のオプションを指定する必要があります。
実行:exeを実行する
start /wait a.exe
start は /wait オプションを付けると実行したものの終了まで処理を待ちます。
後始末:出力したコードと実行ファイルを削除する
del a.exe a.cs
delコマンドは複数のファイルを削除できます。
C#のコード部を見やすくしたもの
namespace P{
class P{
static void Main(){
System.Windows.Forms.MessageBox.Show("メッセージ内容");
}
}
}
任意のC#コードにすることでいろいろなことができます。(短すぎて大したことはできませんが)
.NET Framework4.0でコンパイル可能だと多分これ以上は短くできないと思います。
名前空間usingせずにメッセージボックス表示したの初めてかも。
ちなみにVBScriptだと
cmd /C cd %USERPROFILE%&echo MsgBox "メッセージ内容">a.vbs&start /wait a.vbs&del a.vbs
コンパイルしなくていいので短いですね。
187文字のメッセージを表示できます。
VBScriptは古くセキュリティホールが度々見つかったりしているので無効化している人も多いと思います。
また2027年頃にはデフォルトで無効化されるようです。
まとめ
- これ自体には特に使いどころはないし多分もっといい手段がある
- ファイル名を指定して実行でも実行ファイルを作って実行できる
- C#書けるとその辺にあるデフォルトの市販PCで簡単に実行ファイル作れる
- レジストリいじるともう少し長いものを実行できるらしい
- 悪用しないように