だから私はこの機能を持っています:
void print_usage(char* arg)
{
char buffer[640];
sprintf(buffer, "Usage: %s [options]\n"
"Randomly generates a password, optionally writes it to /etc/shadow\n"
"\n"
"Options:\n"
"-s, --salt <salt> Specify custom salt, default is random\n"
"-e, --seed [file] Specify custom seed from file, default is from stdin\n"
"-t, --type <type> Specify different encryption method\n"
"-v, --version Show version\n"
"-h, --help Show this usage message\n"
"\n"
"Encryption types:\n"
" 0 - DES (default)\n"
" 1 - MD5\n"
" 2 - Blowfish\n"
" 3 - SHA-256\n"
" 4 - SHA-512\n", arg);
printf(buffer);
}
フォーマット文字列の脆弱性攻撃を利用したい (私の課題)。これが私の試みです:
noops とシェル コードでバッファを埋めるエクスプロイト プログラムがあります (このプログラムを使用して、同じ機能のバッファ オーバーフローを行ったので、その良さを知っています)。ここで、ファイルのオブジェクト ダンプを実行して .dtors_list アドレスを見つけたところ、0x0804a20c が得られ、最後に 0x804a210 を得るために 4 バイトが追加されました。
次に、gdb を使用して、プログラムの実行中に noops が開始するアドレスを見つけました。これを使用して、0xffbfdbb8 を取得しました。
ここまでは自分が正しいと感じていましたが、書式文字列を使用して noop アドレスを .dtors_end アドレスにコピーする必要があることがわかりました。これが私が思いついた文字列です(これは、関数へのユーザー入力として提供している文字列です):
"\x10\xa2\x04\x08\x11\xa2\x04\x08\x12\xa2\x04\x08\x13\xa2\x04\x08%%.168u%%1$n%%.51u%%2$ n%%.228u%%3$n%%.64u%%4$n"
これは私にはうまくいきません。プログラムは正常に実行され、%s は入力した文字列に置き換えられます (先頭のリトルエンディアン メモリ アドレスを差し引いたもので、2 つのパーセント記号が何らかの理由で 1 つのパーセント記号になりました)。
とにかく、私はここで困惑しています。どんな助けもいただければ幸いです。