これは課題ですが、基本的な理解に問題があります。
脆弱なコード:
int choc(char *arg)
{
char buf[400];
snprintf(buf, sizeof buf, arg);
return 0;
}
arg は、戻りアドレスを実行したいコードのアドレスで上書きするフォーマット文字列である必要があることを理解しています。しかし、フォーマット文字列の作成に問題があります。
したがって、フォーマット文字列に必要なものは次のとおりです。
- 上書きする必要がある return 命令のアドレス
- %x のリスト
- リターンアドレスに書く値。これは、実行したいコードのアドレスになります。
戻りアドレスを取得するには、gdb の 'ret' 命令のアドレスを確認するだけですよね? %x の目的は何ですか? また、実行したいコードのアドレスをフォーマット文字列にエンコードするにはどうすればよいですか?
私が行ったテスト: gdb を使用して、自分の buf のアドレスが 0xbffffba0 であることを発見しました。「\xa0\xfb\xff\xbf_%x.%x.%n」になるように引数を生成しました。これはアドレス 0xbffffba0 のバフの先頭に何らかの値を書き込むべきではありませんか? ただし、セグメンテーション違反が発生します。私は何を間違っていますか?
どんな助けでも大歓迎です!