요즘 워게임이나 CTF들을 참여하며 Pwnable 트랙에 관심이 생겨 WriteUp들을 찾아보았다.
어떤 식의 문제들인지 파악하던 중 색상도 알록달록 예쁜 gdb가 보여서 괜히 나도 설치해서 사용해보고 싶었는데, 최근 문서 하나를 보다가 Gdb-Peda라는 것을 알아내서 설치하게 되었다.
뿐만 아니라 Peda는 gdb와 달리 기본적으로 현재 레지스터의 상태와 실행중인 명령어, 주변 명령어, 스택의 내용 등을 표시해주며,
정말 좋은 기능으로슨 포인터를 따라가 그 안의 내용을 보여주는 기능도 존재한다.
Peda는 Python Exploit Development Assistance의 약어라고 한다.
일반 gdb는 아래와 같이 생겼다.
gdb 입력 시 gdb를 실행시킨다.
peda는 설치 시 gdb 명령어를 입력하면 peda가 연결되어 실행된다.
아래 명령어를 통해 한번에 설치할 수 있다.
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
echo "DONE! debug your program with gdb and enjoy"
pdisas는 gdb의 disas 명령어의 확장판이다.
이전에 사용했던 gdb는 아무 색도 없었더 것 같은데... kali에 설치해서 그런가 약간의 컬러가 있다.
아래 화면은 nxtest 명령어를 사용해 스택에 실행권한이 존재하는지를 체크한다.
Peda 명령어
Break point
info b : 현재 브레이크 포인트 보기
d : 모든 브레이크 포인트 지우기
d n : n번 프레이크 포인트 지우기
enable/disable : 브레이크 포인트 활성화/비활성화
변수 출력
info locals : 현재 스택의 로컬 변수 전체 출력
info variables : 전역변수 전체 출력
p [변수명] : [변수명]의 value 출력
p $[레지스터명] : 레지스터 값 출력
p [변수명] = [value] : [변수명]의 값 설정
p [함수명] : 함수의 주소 출력
info registers : 레지스터 전체 출력
스택 상태
info f : 스택 프레임 내용 출력
info args : 함수 호출 시 인자 출력
info locals : 함수의 지역변수 출력
실행
c : 브레이크 포인트까지 실행
stepi/ nexti : 코드 한줄 실행(step=함수 안으로 들어감, next=들어가지 않고 다음 줄로 넘어감)
Context
context "code/ register/ stack/ all" : 코드, 레지스터, 스택, 전체 영역을 볼 수 있으며, 인자 생략 시 all로 출력한다.
Session
session save "파일명" : 브레이크 포인트 설정 저장
session restore "파일명" : 브레이크 포인트 설정 불러오기
ropgadget / ropsearch / dumprop
ropgadget, ropsearch : ROP 시 필요한 가젯들을 쉽게 찾을 수 있도록 도와줌
ropgadget : 자주 쓰이는 가젯들인 pop-ret, leave-ret, add esp와 같은 가젯들을 찾아줌
ropsearch : 원하는 특정 가젯을 찾을 수 있도록 도와줌
gdb-peda$ ropgadget binary/libc/vdso/all ... ( 인자 생략 시 ropgadget binary 와 같음 )
gdb-peda$ ropsearch "gadget" "범위" ( gadget 부분을 '' 로 빈 상태로 보내면 모든 가젯을 찾음 )
gdb-peda$ dumprop "범위" ( 인자 생략 시 dumprop binary 와 같음 )
|
gdb-peda$ jmpcall "register" "범위" (인자 생략 시 jmpcall "" binary 와 같으며, 바이너리 영역 내 모든 jmp, call 가젯들을 찾아줌) |
그외
checksec : 현재 바이너리에 걸려있는 보안 기법들 출력(NX에 대해서는 vmmap stack, nxtest를 권장)
nxtest : NX가 걸려있는지 테스트 함, 스택에 실행권한이 있는지 체크
vmmap "all/ binary/ libc/ stack 등" : 디버깅 중인 프로세스의 Virtual Memory MAP 출력
procinfo/ getpid : 현재 디버깅중인 프로세스의 정보 출력/ pid 값을 출력
elfsymbol : 현재 디버깅 중인 바이너리의 plt, got 주소 등을 출력(인자 생략 시 모든 symbol을 출력)
elfheader : 현재 디버깅 중인 바이너리 헤더 정보 출력
(exploit 코드를 작성 시 종종 bss 영역의 주소가 필요한 경우 사용)
find/ searchmem "pattern" "범위" : 같은 기능의 명령어, 메모리 영역에서 특정 패턴을 찾아 출력함(범위 생략 시 binary 영역으로 세팅)
shellcode : peda에서 제공하는 쉘코드
shellcode generate : 현재 사용할 수 있는 쉘 코드 종류 확인 및 생성
shellcode generate [쉘코드명] : 해당 쉘 코드를 출력
magic : glibc에서 유용한 함수 주소 출력
parseheap : 힙 메모리를 구조에 맞게 분석
참고
https://github.com/longld/peda
http://ropshell.com/peda/Linux_Interactive_Exploit_Development_with_GDB_and_PEDA_Slides.pdf