1. ホーム
  2. security

[解決済み] 正規のコードに0x90(NOP)シーケンスが含まれる場合

2022-02-07 11:31:27

質問

背景を教えてください。 私は、IPパケット、特にパケットのペイロード/データを検査して、それがバッファ(スタック)オーバーフローに使用できるかどうかを検出するために、Pythonスクリプトを書きました。NOPスレッドは、命令ポインタが最終的に悪用コードにぶつかるようにスタックを埋めるために使用されると私は理解していますが、これは0x90の繰り返しを探すことで簡単に検出することができます。SQL slammerの場合、NOPコマンドの数が8個と少ないので、最小限の8個で済むかもしれません。

さて、質問ですが、NOPスレは正規のコードでよく使われるのでしょうか?もし答えがイエスなら、いくつかの特定のケースがあるのでしょうか(つまり、これらのケースを探して、潜在的に無害なパケットを除外することができます)、それともこのアプローチは悪意のあるコードを識別するために実用的ではないのでしょうか?

どのように解決するのか?

例えば、x86のある種の反復では、ジャンプは 行き先 は4バイト、8バイト、あるいは16バイトの境界にアラインされています。

コンパイラによっては、可能な限り "long NOPs" を使おうとするものもあります -- 1 バイト以上のスペースを取り、形式的には何かを行うかもしれませんが、プロセッサの状態には影響を及ぼさない単一の命令です。 一部 x86アーキテクチャの繰り返しでは、この方が高速です。 例えば 66 90 は2バイトのNOPであり 8d 74 26 00 は4バイトのNOPです(厳密には lea 0(%esi,%eiz,1),%esi の値をコピーしているだけです。 %esi を自分自身に置き換えるので、何の効果もない)。しかし、これらはすべてのケースで使えるわけではなく、いくつかのx86で最も高速なシーケンスは、気が滅入るほどしばしば本当に 遅い があります。 現在のマイクロ最適化ガイドラインは読んでいませんが、もしIntelとAMDが、文字列を 90 が長いNOPを実行する最速の方法であり、コンパイラもそれに合わせるようにしたのです。