ひさしぶりにブログを書きます。

今日からftzのレベル1から最後のレベルまで挑戦します。

まず、レベル1のhintを見るとlevel2権限のsetuidがかかっているファイルを

探してくださいというメッセージがでます。(韓国語ででてます。)

はい。

find命令語で探しました。

見つけたファイルを実行したらlevel2の権限で命令語を一つ実行させてあげます。

ただし、my-passとchmodは除外というメッセージがでます。

一回実行+一つの命令語でlevel2の権限を維持できる命令語は。。?

写真の通りシェール実行命令語を入力するとlevel2の権限が維持できます。

shを入力後idを確認してみると、uidがlevel2になっていることがわかります。

そのままmy-passを入力するとlevel2のパスワードがでます。

簡単です。。。

なのでgdbで開いてもうちょっと分析してみます。

長いです。。。。

関数をcallする前にpush 0xなんちゃらかんちゃら~は

呼び出す関数の引数です。

system関数を呼び出す前に引数/usr/bin/clearをstackにpushしてcallします。

chdir関数を呼び出す前に引数/home/level2をstackにpushしてcallします。

printf関数達も同じです。

なので、見つけ出したファイルを実行すると画面が一度クリアされ

文字列が出力されます。(chdirでlevel2のディレクトリに移動します。)

次はfgets関数がでます。breakをかけてみてみます。

fgetsをcallする前にpushされてる奴らを見てみると

0x8049948はstdin、0x1eは10進数で30、ebp-40は配列なのが分かります(アスキーコード表を見るとchmodが入ってます。私が入力しました!)

つまりfget(buff、30、stdin);ということです。

fgets(buff、sizeof(buff)、stdin);これがもっといいですね。

つぎは、

eaxにユーザーから入力された住所を入れてstackにpush

0x804879もstackにpush(確認したらmy-passが入ってました。)

そしてstrstr関数を呼び出して比較します。

比較して同じだったら、エラーをだしてexit関数を利用し、プログラムを終了します。

同じじゃなかったら、main+201にjumpして次の禁止命令語chmodと

同じく比較します。

全部通過したら

0xbbaを二回stackにpushして(bbaは10進数で3002です。3002はlevel2のuidです。)

setreuid関数を呼び出します。

そして、ユーザーから入力された文字列をstackにpushしてsystem関数を呼び出し、

命令語を実行します。

 

今まで分析した情報をソースコードにすると

int main()

{

char buff[30];

char kinsi1[]="my-pass";

char kinsi2[]="chmod";

system("/usr/bin/clear");

chdir("/home/level2");

printf(画面に出てた文字列1);

printf(画面に出てた文字列2);

printf(画面に出てた文字列3);

printf("[level2@ftz level2]$");

fgets(buff,sizeof(buff),stdin);

if(strstr(buff,kinsi1)!=NULL)

 {

  printf("ダメでーす");

  exit(0);

 }

 if(strstr(buff,kinsi2)!=NULL)

  {

   printf("これもダメでーす");

   exit(0);

  }

setreuid(3002,3002);

system(buff);

}

こんな感じですかね。