コールゲートテストカーネル学習

  • コールゲート実験

ターゲット:3のプログラムは、データのシクロアルキル環を読むことができるように、0

ステップ分析:

  1. 3つのCSセグメントレジスタは、ループのプロシージャを保存CPLループ3であります

  1. 見えない部分記述子に格納されているCSリングセグメントレジスタ3プログラムがDPL 3の記述子であります

  1. 0にCPLループ3セグメント・レジスタに必要なCS、リングC​​Sの見えない部分を0にロードされるコードセグメントは、最後の手順では、データにアクセスするための特権レベル3リング0リング0リングを有しています。

  • 実装手順:

  1. GDTでは、手動でコールゲートを構築

  1. ローディングドア3環呼び出しルーチン(呼出ゲート記述子リング0をロードするためには、レジスタ3リングセグメントCSにロードされます。)

  2.1は、csが次の要件を満たす必要があり、ディスクリプタのループをロードするには:

  修飾は、CSレジスタ間接命令のセグメントを使用する必要があり2.1.1

  2.1.2 CPL <= DPL && RPL <= DPL、ここでDPLは、コールゲートDPLの保存を意味

  そのため、コールゲートDPLはでなければならない3

  実行した後、ゲート記述2.1.3ので、ドアは、CSにロードされた文字セグメントセレクタに直接説明します。

  したがって、セグメント・セレクタリング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 [] = { 00000x4b00 };
 
    呼び出す_asm FWORD PTR DS:[BUFF]; 

    のprintf(" ESP =%08Xコール、SSは=%04X \ N-後" 、g_esp、g_ss ); 
    のprintf(" g_num D =%\ N- " 、g_num); 
    システム(" PAUSE " ); 
}

 

  1. GDTコールゲートを使用すると、コールゲートディスクリプタシステム、2台のマシンのデバッグのWinDbgに書き込まれる必要がある前に、GDTのアドレスを取得します

  KD> rgdtr 

  GDTR = 80b95000

 

  1. アイドル状態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であります

チャーバフ[] = { 00000x4b00 }; 
__asmコールfword PTR DS:[バフ]
3. 0119EC00〜000811CCを実行している仮想マシンに作成したプログラム

 
4.ステップ2で得られた情報は、GDT [9]のアドレス80b95000 + 6 * 8開始する書き込みまたは80b95040 + 8
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まで続けます。

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/TJTO/p/11426864.html