[Linux] Core Dump
Core Dump
Core Dump는 프로그램이 비정상적으로 종료될 때 그 시점의 메모리 상태를 기록한 파일이다. Core Dump는 메모리, 레지스터, 스택 등 시스템 상태 정보를 포함한다.
기본적으로 리눅스에서 core dump 파일 크기에 제한이 있을 수 있다. core dump 파일 크기 제한을 보려면 ulimit -a
명령어로 확인하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-m: resident set size (kbytes) unlimited
-u: processes 63627
-n: file descriptors 1048576
-l: locked-in-memory size (kbytes) 65536
-v: address space (kbytes) unlimited
-x: file locks unlimited
-i: pending signals 63627
-q: bytes in POSIX msg queues 819200
-e: max nice 0
-r: max rt priority 0
-N 15: unlimited
위에 나온 정보들을 보면 리눅스에서 사용자의 자원 제한 설정을 볼 수 있다. 여기서 core file size이 0으로 설정되어 있는 모습을 볼 수 있는데, ulimit -c unlimited
명령어를 사용하여 자원 제한 설정을 해제하면 된다. 해당 설정을 영구적으로 하고 싶으면 쉘에 ulimit -c unlimited
명령어를 추가하면 된다.
1
2
3
4
ps # 사용하는 쉘 확인: zsh - zshrc, bash - bashrc
vi ~/.zshrc # zsh로 가정
ulimit -c unlimited # .zshrc에 저장
source ~/.zshrc
Core Dump 분석
Core Dump를 분석하기 위해서는 Core Dump가 발생했을 때 파일이 어디에 저장되었는지를 확인해야 한다.
cat /proc/sys/kernel/core_pattern
명령어로 Core Dump 파일 경로 및 형식을 확인한다. 만약 Core Dump가 발생한 경로에서 Core Dump 파일이 생성되게 한다면 sudo sh -c 'echo "core.%e.%p" > /proc/sys/kernel/core_pattern'
명령어를 작성하면 된다. 이는 일시적으로 적용되는 것이라 영구적으로 설정하고 싶다면 /etc/sysctl.conf
을 수정해야 한다.
1
2
3
4
5
6
7
$ ls
vuln
$ ./vuln
Input: AAAAAAAAAAAAAAAA
Segmentation fault (core dumped)
$ ls
vuln core.vuln.30583
위 예시를 보면 vuln
프로그램이 비정상적으로 종료되어서 Segmentation fault (core dumped)가 나타나고, core dump 파일이 생성된 것을 볼 수 있다.
1
$ gdb ./vuln ./core.vuln.3053
gdb ./program ./core dump file
이 형식으로 gdb를 하면 signal error number와 eip, corruption reason이 보인다. 위와 같은 정보로 디버깅 하면 된다.