これを行う32ビットLinuxのカーネルモードのシェルコードを書きたい:
commit_creds (prepare_kernel_cred(0));
だから私は次のファイルを作成します:
xor eax, eax
call 0x1234567
call 0x1234568
ret
ここで、0x1234567はprepare_kernel_credのアドレスであり、0x1234568はcommit_credsのアドレスであり、どちらも/ proc/kallsymsから見つかります。
nasm -f elfとobjdump-dを使用してアセンブルし、マシンコードを取得します。
私は次のようなものを手に入れます:
31 c0 which is xor eax, eax
e8 7c 67 06 c1 which is call prepare_kernel_cred
e8 7c 65 06 c1 which is call commit_creds
c3 which is ret
これは機能しません。ただし、2番目のe8 79
代わりにe8 7c
およびの代わりにを使用すると、機能します。この2番目のマシンコードをどこから入手したか(別のファイルにありました)は覚えていませんが、なぜこれが機能するのか、単純にそのように組み立てるのではないのか、非常に興味があります。e8 74
e8 7c
これはどんなタイプCALL
ですか?上に示したように、コードを単純にアセンブルしないのはなぜですか?e8 79
とをCALLに使用すると、おもちゃのエクスプロイトは人工カーネルのバグに対して正常にe8 74
機能しますが、nasm/objdumpからアセンブルされたマシンコードを使用すると失敗します。