分割エラーによりコアダンプが記録されない

分割エラーによりコアダンプが記録されない

私は現在、The Shellcoder Handbook: Finding and Exploiting Security Vulnerability, Second Editionを読んでいます。

このような単純なバッファオーバーフローの問題(Cコード)は、第2章で考慮されます。

int main () {
    int array[5];
    int i;
    for (i = 0; i <= 255; i++ ) {
        array[i] = 10;
    }
}

作成者はコードをコンパイルしccて実行します。

shellcoders@debian:~/chapter_2$ cc buffer2.c
shellcoders@debian:~/chapter_2$ ./a.out
Segmentation fault (core dumped)

次に、作成されたコアダンプを見ましたgdb

shellcoders@debian:~/chapter_2$ gdb -q -c core
Program terminated with signal 11, Segmentation fault.
#0 0x0000000a in ?? ()
(gdb)

問題は、私の場合はコアダンプが書かれていないことです。メッセージは1つだけですzsh: segmentation fault ./a.out

VirtualBoxでKali 2021.4aを使用しています。デフォルトのシェルを変更してみましたが、chsh -s /bin/bash何も変更されず、端末は開いたままですzsh

エラー時にコアダンプを作成する方法は?実行可能ファイルと同じディレクトリに作成されたファイルである必要があるようです。

ベストアンサー1

ulimitまず、コマンド(bashまたはzsh)を使用して制限内でコアファイルのサイズを確認する必要があります。

# ulimit -c
0

0の場合は増やす必要があります。たとえば、無限大に増やすと次のようになります。

# ulimit -c unlimited
# ulimit -c          
unlimited

次に、コアダンプが生成された場所を確認する必要があります。以前のディストリビューションでは、デフォルト値は通常 CWD で「core」というファイルです。これはおそらく執筆時のデフォルト設定です。

# /sbin/sysctl kernel.core_pattern
kernel.core_pattern = core

しかし、最近のほとんどのディストリビューションではもうそうではありません。今日、コアは通常次のように生成されます。systemd-coredump(8)

# /sbin/sysctl kernel.core_pattern
kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %e

男性からsystemd-coredump(8):

デフォルトでは、systemd-coredumpはトレースバックを含むコアダンプをログに記録し、コアダンプ(プロセスメモリの内容のイメージ)自体を外部ファイルに保存します。 /var/lib/systemd/coredump

このディレクトリでコアダンプを検索するか、次を使用できます。coredumpctl以下をリストします(sudoまたはrootとして実行する必要があるかもしれません)。

# coredumpctl list
TIME                            PID   UID   GID SIG PRESENT EXE
Wed 2022-01-26 12:53:06 IST   10347   111   222 11  *       /tmp/a.out

*以下の「PRESENT」は、コアダンプファイルが生成されたことを示します。

次のコマンドを使用して(圧縮された)コアダンプの場所を表示できますcoredumpctl info <pid>

# coredumpctl info 10347 |grep Coredump
      Coredump: /var/lib/systemd/coredump/core.a\x2eout.111.1bd8e22a25e844f1b03a87d378b4ed9b.10347.1643194386000000.xz

xz次のコマンドを使用してファイルを解凍できます。

# xz --decompress --stdout '/var/lib/systemd/coredump/core.a\x2eout.111.1bd8e22a25e844f1b03a87d378b4ed9b.10347.1643194386000000.xz' > core

または、次のコマンドを使用してコアをいくつかのターゲットにダンプします。

# coredumpctl -o core dump 10347

次のいずれかのコマンドがファイルを生成します。

# gdb -q -c core
[New LWP 10347]
Core was generated by `/tmp/a.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000000af7a56725 in ?? ()

おすすめ記事