私はUbuntu 18.04と次の簡単なプログラムを実行しています。
#include <stdio.h>
int main(int ac, char *av[ac+1], char **env) {
char arr[8];
printf("0x%x\n", av);
scanf("%s", arr);
return 0;
}
次のメッセージでバッファオーバーフロー攻撃が発生すると終了します。
*** stack smashing detected ***: <unknown> terminated
以前のバージョンのUbuntu(またはLinux?何が変更されたのかわかりません)では、次のように印刷されます。
*** stack smashing detected ***: ./a.out terminated
復元できますか?何が変わりましたか?
答え1
私はUbuntuを実行していませんが、最新バージョンのglibcではこれは可能ではないと思います。これを見て犯罪。
もちろん欠けているのは、独自のスタックスマッシュ検出器を作成することです。
あなたは見ることができます源泉このメッセージを印刷する機能:
void
__attribute__ ((noreturn))
__fortify_fail_abort (_Bool need_backtrace, const char *msg)
{
/* The loop is added only to keep gcc happy. Don't pass down
__libc_argv[0] if we aren't doing backtrace since __libc_argv[0]
may point to the corrupted stack. */
while (1)
__libc_message (need_backtrace ? (do_abort | do_backtrace) : do_abort,
"*** %s ***: %s terminated\n",
msg,
(need_backtrace && __libc_argv[0] != NULL
? __libc_argv[0] : "<unknown>"));
}
need_backtrace = False
この機能は次から始まります。__stack_chk_fail
、これはバイナリでコンパイルされたスタックプロテクタコードから呼び出されます。