***スタックスマッシング検出***無効:終了

***スタックスマッシング検出***無効:終了

私は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、これはバイナリでコンパイルされたスタックプロテクタコードから呼び出されます。

おすすめ記事