-
コールゲート実験
ターゲット:3のプログラムは、データのシクロアルキル環を読むことができるように、0
ステップ分析:
-
3つのCSセグメントレジスタは、ループのプロシージャを保存CPLループ3であります
-
見えない部分記述子に格納されているCSリングセグメントレジスタ3プログラムがDPL 3の記述子であります
-
0にCPLループ3セグメント・レジスタに必要なCS、リングCSの見えない部分を0にロードされるコードセグメントは、最後の手順では、データにアクセスするための特権レベル3リング0リング0リングを有しています。
-
実装手順:
-
GDTでは、手動でコールゲートを構築
-
ローディングドア3環呼び出しルーチン(呼出ゲート記述子リング0をロードするためには、レジスタ3リングセグメントCSにロードされます。)
2.1は、csが次の要件を満たす必要があり、ディスクリプタのループをロードするには:
修飾は、CSレジスタ間接命令のセグメントを使用する必要があり2.1.1
2.1.2 CPL <= DPL && RPL <= DPL、ここでDPLは、コールゲートDPLの保存を意味
そのため、コールゲートDPLはでなければならない3
したがって、セグメント・セレクタリング0コードセグメントは、コールゲート選択サブパラグラフを保存することができ
2.1.4ローディング後、必要がアドレスは、コールゲートセグメントの指定された部分内のオフセットであり、アドレスコードの実行に移動します。
したがって、関数のアドレスがこの場所に格納されてもよいです。
// メインコードを実装 INT g_numと、 ショートg_ss; INT ; g_esp // 関数呼び出しゲート呼び出すことにより、 空隙_declspec(裸)GateFun() { g_num = 100 ; _asmのMOV [g_esp]、ESP; _asmのMOVのAX、SS。 _asm MOVワードPTR [g_ss]、AXの _asmのRETF; } int型のmain() { のprintf(" コールゲート関数アドレス:%08X \ N- " 、GateFun); のprintf(" ハンドオーバ・セグメント・セレクタ:%04X N- \ "、8); / * 8コード・セグメント・セレクタ・カーネルである* / 符号なし長い 長い DESCRIPT = createCallGateDescript(8 / * 8は、コード・セグメント・セレクタ・カーネルである* /(符号なし整数)GateFun、0 ); のprintf(" [9]れたセグメント記述子GDTに書き込みしてください。" ) ; STD :: COUT << <<進STD STD :: :: :: setfillが大文字<< STD(' 0 ')<< STD :: setw(8。 DESCRIPT << <<)' \ N- ' ; システム(" PAUSE " ); // 。レジスターの現在の値を取得 _asmのMOV [g_esp]、ESP; _asmのMOV AXを、SS。 ワードMOVのPTRの_asm [g_ss]、AX のprintf(" 呼び出し前ESP =%08X、04X SS =%\ N- " 、g_esp、g_ss); // 最初の4つのバイトがEIPで、2つのバイトがCSである(0x004b) チャー BUFF [] = { 0、0、0、0、0x4b、00 }; 呼び出す_asm FWORD PTR DS:[BUFF]; のprintf(" ESP =%08Xコール、SSは=%04X \ N-後" 、g_esp、g_ss ); のprintf(" g_num D =%\ N- " 、g_num); システム(" PAUSE " ); }
-
GDTコールゲートを使用すると、コールゲートディスクリプタシステム、2台のマシンのデバッグのWinDbgに書き込まれる必要がある前に、GDTのアドレスを取得します
KD> rgdtr
GDTR = 80b95000
-
アイドル状態GDTを表示するために、DQコマンドを使用(アイドル値は0)
KD> DQ 80b95000 80b95000 00000000 ` 00000000 00cf9b00`0000ffff 80b95010 00cf9300`0000ffff 00cffb00`0000ffff 80b95020 00cff300`0000ffff 80008b1e`500020ab 80b95030 84409313 ` ac003748 0040f300`00000fff 80b95040 0000f200`0400ffff 00000000 ` 00000000 80b95050 84008913 ` 80000068 84008913 ` 80680068 80b95060 00000000 ` 00000000 00000000 ` 00000000 80b95070 800092b9`500003ff 00000000 ` 00000000
2. 構造体3は、建設ルール、コード・リング・セグメント・セレクタで使用することができます。
記述子インデックステーブルで|:セグメントフォーマットに従ってセレクタ13 | T1:0 | RPL:2 |
それはGDTを知ることができる上に、項目9は、アイドル、ゲート記述子はこの場所、対応するセグメント・セレクタに保存されているから。
13ディスクリプタ・テーブルのインデックス | 1:T1 | 2:RPL |
---|---|---|
小数9 | 0 | 3 |
1001バイナリ | 0 | 0x11を |
合併:01001011進4B
最初の4つのバイトは、EIP、2つのバイトが、この値は第二の工程で構成され、2つのバイトが0x004Bあり、CSであります
チャーバフ[] = { 0、0、0、0、0x4b、00 }; __asmコールfword PTR DS:[バフ]
3. 0119EC00〜000811CCを実行している仮想マシンに作成したプログラム
KD> EQ 80b95048 0119EC00`000811CC
5.発見を表示するには、成功した書き込みが書き込まれた後
KD> DQ 80b95000 80b95000 0000000000000000 00cf9b000000ffff 80b95010 00cf93000000ffff 00cffb000000ffff 80b95020 00cff3000000ffff 80008b1e500020ab 80b95030 84409313ac003748 0040f30000000fff 80b95040 0000f2000400ffff 0119ec00000811cc 80b95050 8400891380000068 8400891380680068 80b95060 0000000000000000 0000000000000000 80b95070 800092b9500003ff 0000000000000000
6. 実験が正常に完了したことを書き込み、表示するためにバック仮想マシンダウンgまで続けます。