본문 바로가기

High Level Technique/Shellcoding

GDB 사용법

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