1月29日(月)3、4コマ目
今日、やったこと [やってみよう]バッファオーバーフロー 確認テスト 今日のホワイトボード [やってみよう]バッファオーバーフローその1 hasUpperCase()関数にはバッファオーバーフローの脆弱性がある。(13行目) main()関数にてhasUpperCase()を呼び出したときにスタック上に書き込まれるリターンアドレスを43行目のprintf()に書き換える。 プログラムの動き main()関数を逆アッセンブルすると以下のようになる。 図 main()を逆アッセンブルすると 通常はhasUpperCase()実行後、0x7f…400786番地に戻ってくるが、printf()実行の0x7f…4007aa番地に戻るようにスタックエリア上のリターンアドレスを書き換えればいい。 メモリの様子 hasUpperCase()実行時のスタックエリアの様子は以下のとおり。 図 hasUpperCase()実行時のメモリの様子 変数buffの先頭から40バイト離れた(41バイト目以降)ところにリターンアドレスが書き込まれている。ここをバッファオーバーフローで書き換える。 どうすればいい? どんな引数でもかならず”I DO NOT find UpperCase!”と出力するには、コマンドライン引数に40文字+リターンアドレスで実行すればいい。 [やってみよう]バッファオーバーフローその2 chkString()関数にはバッファオーバーフローの脆弱性がある。(23行目) main()関数にてchkString()を呼び出したときにスタック上に書き込まれるリターンアドレスを77行目のprintf()に書き換える。 プログラムの動き main()関数を逆アッセンブルすると以下のようになっている。 図 main()関数を逆アッセンブルすると 通常はchkString()実行後、0x7f…4007e2番地に戻ってくるが、printf()実行の0x7f…400817番地に戻るようにスタックエリア上のリターンアドレスを書き換えればいい。 メモリの様子 chkString()実行時のスタックエリアの様子は以下のとおり。 図 chkString()実行時のメモリの様子 その1と同じように変数buffの先頭から41バイト目にリターンアドレスが書き込まれる。ここを書き換えればいい。 どうすればい...