ひさしぶりにブログを書きます。
今日から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);
}
こんな感じですかね。








