Study/Basic Study

Linux Study - Gdb, 함수 프롤로그/에필로그

대장흰둥 2021. 6. 27. 15:41

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. 스택에 저장해 둔 리턴 주소를 꺼내서 호출된 함수에서 빠져 나온다. 

   [예시]