11月18日(水)1コマ目
今日、やったこと バッファオーバーフローの確認テスト1 今日のテスト 一応、解答例を公開します。 図 解答例(設問1、設問2) 設問1 バッファオーバーフローはコピー先にサイズにかかわらずデータを書き込むことで発生します。プログラムでこのようなことをしているのは15行目のstrcpy()です。 ということで、 15行目 が正解。 設問2 printf("You are Administrator\n");の実行命令がコードエリアのどこにロードされているのか確認するには、デバッガ(GDB)のdisasコマンドでmain()関数を逆アセンブルして確認します。 図 設問2 disasコマンド出力結果 disasコマンドの出力結果から 0x0000 0000 0040 080b 番地からprintf("You are Administrator\n");の命令が始まることがわかります。 ただし、これは全員同じ値になる保証はなにもないため、明らかにおかしい値(例えば、0x7fff・・はスタックエリア)以外は正解にしています。 図 解答例(設問3) 設問3 これもデバッガで確認する問題です。 getuid()関数内にブレークポイントをセットして実行、停止時に各変数のアドレスを確認します。 図 設問3 変数cnt、uid、buffのアドレス確認 図 設問3 disasコマンド出力結果からリターンアドレスを確認 図 設問3 値からリターンアドレスが格納されるエリアを特定する 図 解答例(設問4,設問5) 設問4 このプログラムはコマンドライン引数(ユーザー名:ユーザーID)の:以降を15行目で配列buffに\0まで書き込みます。このとき、バッファオーバーフローが発生します。 スタック上の各変数およびリターンアドレスが書き込まれるエリアの並びを確認すると、配列buffの先頭から25バイト目以降にリターンアドレスがあります。ということは、buffの先頭から24バイトは適当な値、25バイト目以降に飛ばしたいアドレス(設問2で確認したアドレス)を書き込めばOKです。 ということで、正解は a.out ユーザー名:[24バイト分のデータ][設問2で確認したアドレス] となります。 設問5 そもそもstrcpy()は危険すぎます。 何バイト書き込むか...