[Tool] pwndbg 설치 & 사용법

2022. 2. 7. 19:01

 

지난시간에는 디버그가 무엇인지, 그리고 gdb 사용법을 알아보았다.

 

https://mobuk.tistory.com/18

 

[Pwnable] DBG(디버거) 사용법

버그(bug)와 디버깅(debugging) 개발을 하면서 발생한 프로그램의 결함을 버그라고 한다. 버그는 '벌레'라는 뜻으로 최초의 프로그래머 그레이스 호퍼에 의해 발생한 용어이다. 그가 Mark Ⅱ를 개발할

mobuk.tistory.com

 

 

이번시간에는 지난시간 내용에 이어서 gdb를 조금 더 편리하게 사용할 수 있도록 도와주는 gdb 플러그인인 pwndbg에 대해 알아보겠다.

 

설치 방법

https://github.com/pwndbg/pwndbg

 

GitHub - pwndbg/pwndbg: Exploit Development and Reverse Engineering with GDB Made Easy

Exploit Development and Reverse Engineering with GDB Made Easy - GitHub - pwndbg/pwndbg: Exploit Development and Reverse Engineering with GDB Made Easy

github.com

 

git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh

코드를 차례대로 입력해주면 설치가 완료된다. 최근 pip 오류로 ./setup.sh에서 오류가 나는 사람들이 많다고 들었다. 그럼 pip 버전을 낮추는 등의 방법을 사용해서 설치하면 된다. 인터넷에 검색하면 친절하게 나오니 그 글들을 참고하자.

 

사용법

설치가 성공적으로 완료가 되었다면 아래 사진처럼 gdb라고 입력했을 때 예전과는 다르게 pwndbg라고 빨간색으로 뜨는 모습을 볼 수 있다.

 

그럼 지난번에 만들었던 debugger 프로그램을 다시 실행해보겠다. 

//debugger.c
#include<stdio.h>
int main(void){
	int val1 = 1;
	int val2 = 2;
	int val3;
	val3 = val1 + val2;
	printf("1+2=%d\n", val3);
	return 0;
}

 

기본적인 사용 명령어는 gdb랑 똑같았다. 하지만, interface가 정말 사용자 친화적이라는 것을 실행하자마자 느낄 수 있었다. 

pwndbg-> b * main
pwndbg-> start

실행했을 때의 모습이다. Register, disasm, stack, backtrace 총 4부분으로 나누어져 있었다. 이 네가지를 프로그램이 실행될 때의 문맥 즉, Context라고 부른다. context는 어셈블리를 실행할 때마다 갱신이 된다. 그래서 변화를 한 눈에 살펴볼 수 있다. 

 

기본적인 명령어

 

기본적인 명령어는 gdb랑 똑같다.

1. break & continue (b & c)

break는 종단점을 설정하고 continue는 이어서 실행할 수 있도록 해준다. 

우리는 사실 프로그램의 처음부터 끝까지 디버깅하는 일은 그리 많지 않다. 특정 함수가 잘 실행되는지, 코드의 일부분만 디버깅을 하기 때문에 종단점의 설정은 매우 중요하다. 물론 이번 프로그램은 짧아서 main함수 전체를 살펴보고 있는 중이다.

 

2. next instruction(ni)

명령을 한 줄 실행시켜준다.

 

3. step into(si)

명령을 한 줄 실행시켜준다. 이 때, ni와는 다르게 서브루틴의 내부로 들어간다.

예를 들어 printf함수를 불렀을 때에는 printf함수의 내부도 분석을 할 수 있다. 

printf 내부

만약, 서브루틴을 벗어나고 싶으면 finish를 입력하면 된다.

 

4. run(r)

프로그램을 실행시켜준다. 단, 종단점이 설정되어 있으면 종단점까지 실행을 시켜준다.

 

5. disassemble(disass)

디스어셈블리 한 결과를 알려준다. 

gdb랑 비교하면 pwndbg가 훨씬 가독성이 높은 것을 알 수 있다. 

 

6. x

프로그램을 사용하다보면 가상 메모리의 값에 접근을 해야하는 상황이 올 수 있다. 이때 사용할 수 있는 명령어이다. 

Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal), t(binary), f(float), a(address), i(instruction), c(char), s(string) and z(hex, zero padded on the left). Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes).

ex1) x/10gx &rsp 

rsp부터 80바이트를 8바이트씩 hex로 출력

ex2) x/s 0x400000

0x400000번지가 가리키는 문자열 출력

 

이 외에도 다양하게 사용 할 수 있고, 용도에 따라 검색해서 사용하면 될 것이다. 

 

7. telescope (tele)

메모리 덤프 기능이다. 메모리의 값을 재귀적으로 보여준다. 

 

 

8. vmmap

가상 메모리의 레이아웃을 보여준다.

 

pwndbg를 사용하면서 더 중요한 기능이 발견되면 계속 포스팅을 수정하여 내용을 추가하겠다. 

 

 

 

[소감]

아직, vmmap이나 tele의 기능을 정확하게는 모르겠지만, 기본적인 사용방법을 학습할 수 있어서 좋았다. 처음에 pwndbg 설치 오류때문에 힘들었지만 한 걸음 드디어 나아간 것 같아서 좋다. 

'Linux' 카테고리의 다른 글

[Linux] 3. 셸을 능숙하게 다루는 방법  (0) 2022.08.10
[Linux] 2. 셸이란 무엇인가?  (0) 2022.08.10
[Linux] 1장. 리눅스 설치하기  (0) 2022.08.09
[Tool] Pwntool 설치 및 사용법  (0) 2022.02.07
[Tool] DBG(디버거) 사용법  (0) 2022.02.07

BELATED ARTICLES

more