GDB 사용법
윈도우에서는 OllyDBG, ImmunityDBG, IDA, WINDBG 등의 다양한 디버거가 존재하며, 리눅스에서는 GDB가 존재하죠. 기본적으로 GDB를 많이 사용합니다.
기본적으로 GDB를 사용하는 방법에 대해서 알아보도록 하겠습니다.
앞서 포스팅했던 HelloWorld.nasm 을 이용하여 분석하도록 하겠습니다. 분석할 때는 소스코드를 컴파일한 실행파일을 가지고 분석합니다.
GDB는 다음과 같이 사용합니다.
GDB 실행
gdb 실행파일 을 입력하면 위 사진과 같이 gdb가 실행이 됩니다.
추가적으로 위 사진처럼 쓰잘때기 없는 글들이 나오는 것을 방지하려면 -q 옵션을 주면 글이 없이 실행됩니다.
존재하는 함수, 심볼 확인하기
해당 프로그램에 어떤 함수, 심볼이 존재하는지 확인하기 위해서는 다음과 같은 명령어를 입력합니다.
info functions를 입력하게 되면 존재하는 함수와 심볼들을 확인 할 수 있습니다. 이 작업은 프로그램의 main이 어디에 있는지 확인할 수 있습니다.
추가적으로 i func 를 입력해도 출력됩니다.
Disassembly
_start가 존재하는 것을 확인 했으므로 해당 부분의 ASM 코드를 확인합니다.
_start부분의 어셈블리어가 나타나게 됩니다.
위 사진의 어셈블리어는 AT&T 방식으로 평소 보던 방식과 다릅니다. 소스코드 작성과 반대로 나타나는 것을 알 수 있습니다.
평소처럼 보기 쉽게 하기 위해 다음 명령어를 입력합니다.
set disassembly-flavor intel 을 입력하면 intel 방식으로 출력하게 됩니다.
추가적으로 disassemble _start를 disas _start로 줄여서 사용할 수 있습니다.
Breakpoint
브레이크포인트는 프로그램의 실행을 한줄 한줄 실행시키기 위해 필요합니다. 그냥 실행하게 되면 어셈블리어가 모두 실행되어 종료되기 때문에 반드시 브레이크포인트를 설정 한 후 실행해야 한 줄씩 분석 할 수 있습니다.
breakpoint 라고 명령어를 입력하는 것이 아니라 break *를 사용합니다. C언어에서 포인터 사용시 *를 기억하면 쉽습니다.
줄여서 b * 를 사용해도 됩니다.
실행하기
브레이크 포인트를 설정 했으므로 이제 프로그램을 실행하여 분석해야 합니다.
run을 입력하면 프로그램이 시작되며 disas 명령어를 입력하여 어셈블리어를 확인하면 현재 위치하고 있는 곳을 =>로 나타내어 줍니다.
다음 줄 실행하기
다음 어셈블리어를 실행하기 위해서는 septi와 nexti를 사용합니다.
stepi와 nexti 모두 다음 한줄을 실행하게 됩니다. 하지만 차이점으로 stepi는 함수를 출력하는 부분이 존재하면 그 함수를 따라 들어가게 되고 nexti는 함수 안으로 들어가지 않고 다음 한줄을 실행합니다.
stepi는 si로 nexti는 ni로 실행할 수 있습니다.
다음 브레이크포인트로 넘어가기
소스코드가 긴 프로그램을 분석하는데 있어서 어느 세월에 si, ni를 치면서 분석할 수는 없습니다.
다음 브레이크 포인트가 설정된 곳까지 넘어가는 명령어는 다음과 같습니다.
미리 설정해둔 두번째 브레이크 포인트로 넘어가게 되었습니다.
분석 중 지저분해진 화면 깨끗하게 하기
해당 프로그램을 분석중 터미널창이 보기 싫다면 다음과 같은 명령어를 입력하면 됩니다.
깨끗해진 것을 확인 할 수 있습니다.
이렇게 기본적인 사용방법을 알아보았습니다. 추가적인 포스팅 내용에서 그때 그때 추가적으로 설명하도록 하겠습니다.
GDB TUI
gdb를 조금더 보기 편하게 사용하는 방법이 있습니다. 바로 tui 모드인데요. 사용하는 방법은 아래와 같습니다.
이 화면에서 어셈블리어와 레지스터를 실시간으로 확인이 가능합니다.
layout regs와 layout asm 을 입력하면 위와 같이 분석을 할 수 있습니다.
'High Level Technique > Shellcoding' 카테고리의 다른 글
Prologue, Epilogue (0) | 2016.03.11 |
---|---|
Stack (0) | 2016.03.11 |
Section (0) | 2016.03.11 |
출력과 입력 (0) | 2016.03.11 |
System Call (0) | 2016.03.11 |