これは可能ですか?
Intel アセンブリ コードを char バッファーに配置し、そのコードを C プログラム内から実行したい
アセンブリ コードをバッファに配置した場合、それを関数ポインタにキャストして呼び出すことはできますか?
GCCとLinuxを使用しています
Intelアセンブリコードまたはマシンコードのどちらを実行しますか? マシン コードを実行したい場合は、文字バッファーが置かれているメモリ ページが NX (実行なし) とマークされていなければ実行できます。
アセンブリ コードについて話している場合は、いいえ、最初にアセンブラを介してコードを実行する必要があります (Un*x システムでは、標準のコードは通常 と呼ばれas
ます。Linux では、これは と同じである必要がありますgas
)。結果のマシンコード。
はい、できます。実際、それがバッファオーバーフロー攻撃がどのように機能するかです。詳細については、Google バッファ オーバーフロー攻撃を参照してください。実行を直接アセンブリに分割することは、(アセンブリが正しい限り) 常に機能します。
コメントに書き込むときに「pop%[register] push%[register]」のようなものを実行したい場合は、はい、これは可能ですが、簡単ではありません。
アセンブラを作成するか、アプリケーションにオープンソースのアセンブラを埋め込む必要があります。アセンブラにchar配列をフィードし、他のバッファにマシンコード(できればPICコード、リンクと再配置を省略できます)を作成し、関数ポインタを介してこのバッファでコードを実行します。
コードを実行するプラットフォームに「as」または「gas」があることを保証できる場合は、コードをパイプインし、オブジェクトコードをパイプアウトして「as」を呼び出すための迅速で汚いハックを回避できる可能性があります。
おそらく、Google がバッファ オーバーフローのエクスプロイトを作成するのを手伝ってくれるでしょうか?
おそらく -- 構文は次のとおりです。
char buff[/* enough space */];
/* fill in buff with the right opcodes that conform to the Linux ABI */
((void (*)()) buff) ();
問題は、最近の x64 には「W^X」または「NX ビット」と呼ばれるモードがあり、上記のコードがデータ ポインターから実行されないようになっていることです。これを処理するための API はありますが、Linux の API には詳しくありません。少しグーグルで調べてみると、リンク時に.oファイルを実際にマークして、NXビットを無効にしたいことが示されているようです。それは私には悪い考えのように思えます (代わりに、実行時にデータ領域を実行可能に昇格させたり、メモリの実行可能な領域から書き込み可能な領域を割り当てたりできるようにする必要があるようです。しかし、それは私の意見です。 -- それを行うのは本当に難しいかもしれません。)
NX ビットまたは W^X の問題がないと仮定すると、上記のキャストを実行してボールを取得します。
関数ポインターの構文を正しく理解していれば、これは実際には期待どおりに機能します。セキュリティの悪用以外にも、この手法を使用してパフォーマンスを最適化できます。
携帯電話でコードを入力するよりはよく知っているはずですが...
unsigned char buffer[]={blah, blah, blah ...};
void (*p)() = (void (*))buffer;
p();