私は現在、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 ?? ()