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バイト目にリターンアドレスが書き込まれる。ここを書き換えればいい。

どうすればいい?

どんな引数でもかならず”I find Numerical!”と出力するには、コマンドライン引数に40文字+リターンアドレスで実行すればいい。


確認テストについて

採点後結果を発表します。


 

このブログの人気の投稿

1月12日(金)1、2コマ目

1月9日(火)1、2コマ目