yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

gdb 사용하기 본문

컴퓨터 시스템

gdb 사용하기

yehey 2020. 9. 6. 23:29

gcc 컴파일

:실행가능한 파일을 만든다.

:gcc -o 실행파일명 소스파일명(*.c)

:gcc 소스파일명(*.c) -o 실행파일 명

 

컴파일 과정
소스파일 컴파일-> 오브젝트 파일(*.o) 생성-> 실행파일 생성-> 오브젝트 파일 삭제

 

gcc 옵션

  • -S: cc1으로 전처리된 파일을 어셈블리 파일로 컴파일까지만 수행하고 멈춘다. (*.s)

  • -c: as에 의한 어셈블까지만 수행, 링크를 수정하지 않는다.

  • -v: gcc 가 컴파일을 어떤 식으로 수행하는지를 화면에 출력한다.

  • --save-temps: 컴파일 과정에서 생성되는 전처리 파일(*.i)과 어셈블리 파일(*.s)를 지우지 않는다.

  • -W: 합법적이지만 모호한 코딩에 대해 경고를 보낸다.

  • -Wall: 모든 모호한 코딩에 대해서 경고를 보낸다.


gdb: GNU에서 나온 디버거 프로그램

-디버거: 프로그램 내부에서 무슨 일이 일어나고 있는지 보여주는 것

-디버깅을 하기 위해서는 컴파일/링크 과정이 필요하다.

 

gdb 시작하기

:gdb를 실행하는 데는 4가지 방법이 있다.

  1. gdb : gdb를 먼저 실행 후 file 명령어로 program을 나중에 부른다.

  2. gdb (프로그램이름): 일반적인 gdb 방법

  3. gdb (프로그램이름) (core): 코어 파일을 사용할 때 동시에 인자로 준다.

  4. gdb (프로그램이름) (프로세스ID): 실행 중인 프로세스를 디버그 할 때 사용한다. gdb를 프로세스ID 에 접속시킨다. 

core 파일
프로그램의 비정상적인 종료(segment fault 등)가 발생하는 경우, 커널에서 해당 프로세스와 관련된 메모리를 dump시킨 파일
(리눅스는 기본적으로 core dump를 하지 않도록 되어있음)

 

gdb 명령어 보기-> 2020/09/07 - [컴퓨터 시스템] - gdb 명령어 모음

 

gdb 사용하기

(2)번 방법을 이용해서 gdb를 사용했음.

 

왼쪽: windows 10의 ubuntu(64bit)에서 gdb 사용/오른쪽: putty(32bit)에서 gdb 사용

 

gdb client와 gdb attackme 명령어를 각각 쳐서 gdb를 실행했다.

gdb 실행 후 disas main 명령어를 쳐서 main함수를 디스어셈블링한다.

(main함수의 기계어를 어셈블리어로 변환한다는 의미)

 

두 사진의 제일 왼쪽 값 (0x0000000000000a0a, 0x08048440)은 주소를 나타낸다.

<+0>과 <main+0>의 다음 값은 어셈블리어 명령어(push, mov 등)이다.

마지막은 레지스터 값이다.

 

이제 gdb를 이용해서 메모리 구조를 파악하는 연습을 할 것이다!

'컴퓨터 시스템' 카테고리의 다른 글

gdb 명령어 모음  (0) 2020.09.07
어셈블리어 명령어와 범용 레지스터  (0) 2020.09.06
8086 Memory Architecture, register  (0) 2020.09.06
컴퓨터 시스템의 기초  (0) 2020.09.05
Comments