보안전문가로 향하는 길
디버깅 - gdb(pwngdb) 사용방법 본문
기본적인 c언어및 리눅스 사용법에 대해 알고 있는 전제하에 써 놓는다
만약 모른다면 리눅스를 공부하고 오자
gdb(pwngdb) 다운및 사용법은 인터넷에서 찾아보자
아래 코드는 val1 val2를 더한 값을 출력하는 코드이다
enrty 프로그램의 진입점
readelf -h 파일명 명령어를 통해서 프로그램의 진입지점을 확인 할 수 있다

gdb 파일명을 입력해서 gdb를 실행시킨다

entry를 입력하면 프로그램 진입점에서 멈춘다.

Break(b) & Continue(c) 중단점, 시작
b를 통해서 중단점을 설정할 수 있고 c를 통해서 프로그램을 실행시킨다
아래 사진을 보면 main에 멈춰있는 것을 볼 수 있다.

Run(r) 프로그램 실행
r은 c와 다르게 프로그램을 처음부터 실행하는 것이다.
중단점을 설정해 놓지 않았다면 끝까지 실행하게 된다.
아래 사진을 보면 main에 중단점을 설정해 놨기 때문에 main에 멈춰 있는 것을 볼 수 있다.

next instruction(ni), step into(si) 단계별로 실행
ni와 si는 프로그램을 한줄한줄 실행한다.
차이첨은 ni는 프로그램이 실행 도중에 함수를 만나도 해당 함수 안으로 들어가지 않는다.
si는 프로그램이 실행 도중에 함수를 만난다면 해당 함수 안으로 들어가게 된다.
아래는 si인 경우이다 printf함수를 만나서 si를 입력하니 printf의 함수 안으로 들어갔다


아래는 ni인 경우이다. printf함수를 만났지만 함수 안으로 들어가지 않고 다음 줄로 넘어갔다.


disassemble, u, nearpc, pdisass 어셈블리 코드 보이기
disassemble

u, nearpc, pdisass는 pwngdb에서 제공하는 명령어로 가독성을 좋게 해준다



finish 함수 종료, 함수 끝까지 실행
si를 통해서 함수의 내부로 들어가는 경우가 있다.
함수의 내부로 들어가서 원하는 것을 다 확인했는데 함수를 끝내기 위해서 실행해야 하는 명령어가
너무 많은 경우가 있다. 이때 finish명령어를 입력해서 해당 함수를 끝까지 실행할 수 있다.
examine(x) 주소에 들어 있는 값 확인
아래 값들을 조합해서 원하는 값을 출력 할 수 있다.
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).
x/10gx $rsp
rsp부터 80바이트를 8바이트씩 hex형식으로 출력

x/5i $rip
rip부터 5줄의 어셈블리 명령어 출력

telescope(tel) pwngdb가 제공하는 메모리 덤프 기능
특정 주소의 메모리 값들을 보여줌, 메모리가 참조하고 있는 주소를 재귀적으로 탐색하여 값을 보여줌

vmmap 가상의 메모리 레이아웃 출력
어떤 파일이 매핑 된 영역일 경우, 해당 파일의 경로까지 보여줌

파이썬을 이용해서 값을 입력하기
gdb로 디버깅을 할 때 키보드로 직접 타이핑하기 어려운 복잡한 값을 입력하고 싶은 순간이 있다.
숫자도 아니고, 알파벳도 아니며, 특수 문자도 아닌 값을 입력하는 상황이다
이러한 값은 이용자가 직접 입력할 수 없는 값이기 때문에 파이썬으로 입력값을 생성하고,
이를 프로그램 입력으로 넘겨주는 방식을 사용한다.
run 명령어의 인자로 $() 와 함께 파이썬 코드를 입력하면 값을 전달할 수 있다.
파이썬에서 print 함수를 통해 출력한 값을 run(r) 명령어의 인자로 전달하는 명령입니다.
r $(python3 -c "print('\xff' * 100)")

$() 와 함께 파이썬 코드를 입력하면 값을 입력할 수 있다.
입력값으로 전달하기 위해서는 <<< 를 사용한다.
argv[1]에 임의의 값을 전달하고, 값을 입력하는 명령어
r $(python3 -c "print('\xff' * 100)") <<< $(python3 -c "print('dreamhack')")

'드림핵 > 시스템 해킹' 카테고리의 다른 글
| checksec -- 파일에 어떤 보안기법이 있는지 확인 하는 명령어 (0) | 2024.01.03 |
|---|---|
| 스택 카라리 알아보기, 생성방법 및 우회 (2) | 2024.01.03 |
| 셸코드 모음 (0) | 2024.01.02 |
| [시스템 해킹] ORW(open-read-write), execve, objdump (1) | 2024.01.01 |
| pwntools - 해킹 오픈 api (0) | 2024.01.01 |