1. GDB
실행방법
gdb -q [파일이름] or gdb [파일이름] | gdb를 실행해 준다. |
list [파일이름] | 소스코드를 10줄 단위로 보여 줄 수 있다. |
r | 프로그램을 실행해 준다. |
k | 프로그램 실행을 종료한다. |
bt | 역추적, 오류가 발생한 함수를 역으로 찾아간다. |
b [함수], [주소] | 함수, 주소에 브레이크포인트를 설정해 준다. main + [숫자] 와 같은 연산도 가능다. |
cl [함수], [주소] | 함수의 시작부분이나 숫자의 행에 있는 브레이크 포인트를 지워준다. |
si | 다음 행으로 진행, 함수가 있을 시 내부로 들어간다. |
ni | 다음 행으로 진행, 함수가 있을 시 내부로 들어가지 않고 건너뛴다. |
disas [함수], [주소] | 함수 또는 주소를 어셈블리 언어로 보여준다. |
x/[표현식] [주소], [레지스터] x/x : 16진수 x/d : 10진수 x/s : string |
주소나 레지스터를 원하는 표현식으로 보여준다. |
save breakpoints [파일이름] | 파일에 bp를 저장한다. |
source [파일이름] | 저장한 bp를 불러온다. |
2. 스택 프레임
함수가 호출될 때 마다 함수를 호출 해 주기 위해 할당 받는 메모리
함수 프롤로그는 호출 해 준 함수의 실행 준비과정
함수 에필로그는 호출 해 준 함수의 마무리 과정 이라고 할 수 있다.
3. 함수 호출 과정
1. 호출된 함수가 인자를 받을 수 있도록 스택에 넣는다.
2. 함수 호출이 종료 된 후에 되돌아와야 할 코드의 주소를 스택에 넣는다.
3. EIP레지스터에 함수가 종료 된 후에 되돌아갈 코드의 위치를 로드한다.
4. 스택에 호출한 함수의 전의 스택 메모리 주소를 스택에 저장하고, 그 함수가 시작되는 시점의 스택 포인터를 프레 임 포인터로 설정한다.
→ push EBP
→ mov EBP, ESP
5. EBP와 ESP사이에 호출한 함수에서 사용할 로컬 변수를 저장할 공간을 할당한다.
6. 원래 함수로 되돌아 갈 경우, 정상적으로 프로그램을 실행 할 수 있도록 호출한 함수의 실행 상태를 보존한다.
7. 함수를 실행한다.
8. 6번에서 저장해 준 함수의 실행 상태를 다시 복구해 준다.
→ mov ESP, EBP
9. 함수의 시작 시점의 스택 포인터를 복구해서 스택을 정리한다.
→ pop EBP
10. 현재 프레임 포인터 위치에 있는 이전 함수의 프레임 포인터를 복구한다.
11. 스택에 저장해 둔 리턴 주소를 꺼내서 호출된 함수에서 빠져 나온다.
[예시]
'Study > Basic Study' 카테고리의 다른 글
Linux Study - Compile, 파일 권한, Assembly (0) | 2021.06.21 |
---|---|
Linux Study - 리눅스 쉘, 구조, 메모리 구조 (0) | 2021.05.04 |