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()実行時のメモリの様子 |
どうすればいい?
どんな引数でもかならず”I find Numerical!”と出力するには、コマンドライン引数に40文字+リターンアドレスで実行すればいい。
確認テストについて
採点後結果を発表します。



