덤프 분석에서는 기본적으로 CORE 메모리 덤프 파일과 . 해당 덤프를 발생 시킨 실행 프로그램이 필요하다.
아래내용은 App2D를 분석한 내용이다.
gdb -c ./core -se ./App2D
gdb 로 core 덤프 파일 열면 위 그림과 같이 procA() 함수에서 크래쉬가 발생 한 걸 확인 할 수 있다.
info thread - 덤프 발생 시점에 수행중인모든 스레드를 보여준다.
현재 6개의 스레드가 돌고 있고, 1,6번을 제외하고 4개의 스레드는 현재 중지 상태에 있는걸 확인 할 수 있다.
thread 1 - 1번 스레드 선택
bt - 현재 스레드의 콜스택
문제가 된 1번 스레드로 context를 맞춰 놓고 콜 스택을 보면 위 그림과 같다.
x/i <address> - x 메모리 데이터 View, i<명령> 형식
x/i 0x0000000000400500
크래쉬 난 지점의 명령어를 보면 mov DWORD PTR [rax],0x1
즉 rax 메모리지점에 0x1를 Write 하는 명령어 이다.
info r $rax - info r 는 레지스터의 정보.
rax 레지스터의 값을 보면 0x0 임을 확인 할수 있고, 즉 0번지에 0x1를 쓰려고 하다가 크래쉬가 발생 하였다.
pdis procA - pdis 는 디스어셈블
procA 함수의 전체 코드를 디스어셈블 해 보면 위와 같다.
rbp는 베이스 레지스터로 위에 보면 mov rbp, rsp 로 함수 시작시 rsp의 값을 가지고 있는걸 확인 할 수 있다.
위 그림은 스택 프레임 구성이 끝나후의 스택 메모리의 모습니다.
위 어셈블리코드로 확인하면 mov rbp, rsp 까지 의 내용. 스택메모리는 높은 메모리에서 낮은 메모리쪽으로 수행 된다.
여기서 [rbp-0x8]은 함수를 호출시 넘겨 온 첫 번째 인자이다. (호출 하는 코드에서 인자를 전달 하였다면)
하지만 여기 문제가 된 코드를 보면 rax는 위에 mov rax,QWORD PTR [rbp-0x8] 에서 가져온걸 확인 할 수 있고, 그위에 QWORD PTR [rbp-0x8], 0x0 으로 해당 스택에 0을 저장 하고 있다. (해당 덤프는 연습을 하기위에 일부러 CRASH 발생을 내기위한 예제 코드), 즉 보통 인자로 전달되는 영역에 0을 들어가므로서 크래쉬를 유발 시켰다.
'개발 > Linux' 카테고리의 다른 글
Linux Binary Analysis - 1 (0) | 2021.06.04 |
---|---|
[디버깅] Radare2 (1) 설치 (0) | 2021.03.30 |
Linux Core Dump Analysis - 3 (덤프분석 및 디버깅 환경 구축 ) (0) | 2020.09.11 |
Linux Core Dump Analysis - 2 (Dump on Linux) (0) | 2020.09.11 |
Linux Core Dump Analysis - 1 ( LINUX MEMROY ARCHITECTURE) (0) | 2020.09.03 |