Linux Exploit을 손쉽게 – peda 디버거 활용

 

리눅스 환경에서 Exploit 공격 기법을 공부할 때 가장 처음 겪는 어려움은 아마도 GDB 사용이 아닐까 싶다.
윈도우와 같이 편리한 GUI 환경도 아닌데다가 여러개의 복잡한 옵션들,
그리고 Disassemble된 함수 내용이 많을 경우 더욱 더 사용하기가 꺼려지는게 사실이다.

사실 이러한 불편함도 수십번 쓰다보면 어느샌가 적응되어 있기는 하지만,
그럼에도 불구하고 리눅스 환경에서의 디버깅은 윈도우에 비하면 불편한 점이 많다.
(물론 개인적인 생각이지만)

윈도우 환경에서 Exploit을 도와주는 여러 도구들 중 Immunity Debugger와 함께 사용 시 큰 힘을 발휘하는
Mona (https://github.com/corelan/mona) 가 있는데, 리눅스에서도 이와 비슷한 도구가 있어 소개 하고자 한다.

바로 블랙햇 2012에서 공개 된 PEDA 이다.

Cap 2014-12-09 14-31-45-091

 

1. PEDA 개요 및 주요기능 소개

PEDA는 앞서 언급한 것처럼 리눅스 환경에서의 Exploit을 도와주는 도구이다.
PEDA는 Python Exploit Development Assistance for GDB의 약자로써, GDB 기능을 확장하여
Exploit을 손쉽게 할 수 있게 도와주는 다양한 옵션과 유틸리티가 포함되어 있다.

PEDA가 제공하는 주요 기능은 다음과 같다.

  • Memory Operation – 메모리 구조 분석
  • Debugging Helpers – 디버깅을 손 쉽게 해주는 기능들
  • Exploit helpers – 익스플로잇에 필요한 패턴 및 쉘코드 제작
  • Utilities – 기타 유틸리티

그럼 본격적으로 PEDA 기본적인 사용법과 이를 이용한 Exploit을 실습해보도록 하자.

※ 블랙햇 발표자료는 ☞☞☞ [ 다운로드 링크 ]  ☜☜☜ 에서 받아볼 수 있다.

 

2. PEDA 다운로드 및 설치하기

PEDA는 파이썬 기반의 도구이므로, 당연히 파이썬이 먼저 설치되어 있어야 한다. (2.6.X 버전 이상)
그 외 실행에 필요한 라이브러리는 모두 압축파일에 포함되어 있으므로 별도의 모듈 설치과정은
필요하지 않다.

먼저 wget이나 웹브라우저를 통해 PEDA 도구를 다운로드 받는다.
다운로드 경로는 ☞☞☞ [ http://ropshell.com/peda/peda.tar.gz ] ☜☜☜ 이다.

Cap 2014-12-09 00-29-53-774

다운로드가 완료되면, tar를 이용해 다운로드 받은 파일의 압축을 풀어준다.
압축을 풀면 peda 하위 디렉토리 내에 PEDA를 구동하기 위한 파일들이 위치하게 된다.

Cap 2014-12-09 10-52-28-592

리눅스의 GDB 디버거는 실행 시 “.gdbinit” 파일을 참조하여 디버깅 환경을 셋팅하게 된다.
따라서 PEDA 를 사용하기 위해 “peda.py” 파일을 “.gdbinit” 과 연결해주면 모든 설정이 끝난다.
명령어는 아래 그림과 같이 입력한다 (대상 디렉토리는 사용자 임의로 설정)

Cap 2014-12-09 11-03-35-581

마지막으로 “.gdbinit”을 생성한 디렉토리로 이동한 후 디버깅 할 파일을 로드하면
붉은색 글씨의 “gdb-peda$” 프롬프트 화면을 볼 수 있을 것이다.

Cap 2014-12-09 11-09-21-009

PEDA는 생성한 “.gdbinit”파일이 위치한 곳에서만 동작하므로, 기존 GDB로 분석을 원할 때는
다른 경로에서 GDB를 실행하면 기존 방식으로 사용할 수 있으니 참고하도록 하자.

 

3. 기본적인 PEDA 사용법 익히기

본 포스팅에서는 PEDA의 모든 기능에 대해 다루기 보다는 실제 Exploit에 많이 활용할 수 있는
주요 기능들을 위주로 설명할 예정이다. (상세 설명은 블랙햇 발표자료를 보도록 하자)

 

** 바이너리 디스어셈블

다음은 PEDA 사용 전/후의 디스어셈블 결과 화면이다.가장 먼저 GDB의 가장 메인 기능 중 하나인 디스어셈블을 해보도록 하자.
기존 GDB에서의 명령어는 “disasseble”  였으나, PEDA에서는 “pdisas [함수명]” 형식을 사용한다.

Cap 2014-12-09 15-27-04-244 Cap 2014-12-09 15-27-15-520
[ PEDA 미사용 ] [ PEDA 사용]

위 그림과 같이기본적인 Disassemble 기능에서도 기존 GDB 실행결과와 큰 차이점을 보여주고 있다.

가장 눈에 띄는 것은 ANSI Color 가 적용됨으로써 주요 Jmp 구간이나 Exploitable한 Function에 하이라이트가 된다는 점이다.
사실 OllyDbg나 Immunity 사용자들이 GDB를 사용할 때 가장 불편한 점으로 꼽는 것이 색 구분이 없는 밋밋한 화면인데,
이 기능 하나만으로도 Breakpoint 를 설정하는데 큰 도움이 될 것이라 생각한다.

 

** 메모리 / 코드 구조 보기

다음으로 Context View 기능에 대해 알아보자.
PEDA 는 Stack, Register, Code에 대한 정보를 기존 GDB에 비해 훨씬 보기 좋은 형태로 보여준다.

Cap 2014-12-09 16-25-58-748

특히 주목할 만한 기능 중 하나가 바로 “메모리 정보 따라가기 기능” (내 멋대로 이름 지음;;) 이다.

리눅스 환경에서 스택 영역 분석을 하다보면 포인터 (메모리 위치) 값을 일일이 따라가면서 추적해야 하는데
PEDA의 경우는 메모리 주소를 연속적으로 추적하여 보여줌으로써 훨씬 편리하게 구조 분석이 가능하다.
(위 화면에서 가운데 “Context Stack” 부분을 보면 이해갈 것이다)

또한 context code 를 통해 JMP 구간을 한 눈에 확인할 수 있다는 것도 좋은 기능이라 할 수 있겠다
(물론 윈도 계열 디버거에서는 기본적으로 제공되는 기능이긴 하다)

 

** 특정 스트링 검색

Exploit 공격시 “/bin/sh”과 같은 특정 스트링 값을 검색해야 할 경우 “find” 명령어를 사용하면 쉽게 찾을 수 있다.

Cap 2014-12-10 09-49-43-240

 

** Exploit Helper 도구 – 패턴 생성 하기

메타익스플로잇에 내장되어 있는 패턴 페이로드 생성기가 PEDA에 내장되어 있다.
일일이 메타스플로잇에서 패턴을 생성하고 복사-붙여넣기 하는 번거로운 작업을 덜 수 있을 것이다.

Cap 2014-12-10 10-41-17-281

 

** Exploit Helper 도구 – 패턴 검색 하기

생성된 패턴을 이용하여 Exploit 공격을 한 후, 내가 입력한 패턴이 스택의 어느 부분에 위치하는지를
쉽게 찾을 수 있는 기능이다.
먼저 BOF 공격 후 Context View 에 표시되는 결과를 확인해보면, 패턴이 정상적으로 입력된 것을 볼 수 있다.

Cap 2014-12-10 11-00-39-851

이제 스택에 입력된 패턴의 위치를 추적하기 위해 “pattern_search” 를 사용하면
패턴 시작 위치 부터 EIP까지의 거리를 알아낼 수 있다.

Cap 2014-12-10 11-02-39-861

 

** Exploit Helper 도구 – ROP Gadget 찾기

ROP 공격시 가장 중요한 단계는 바로 “쓸만한 – Usable” ROP 가젯들을 수집하는 것이다.
PEDA에는 바이너리 내에서 사용자가 입력한 ROP Gadget들을 검색할 수 있는 기능이 포함되어 있다.
명령어는 “ropsearch “[검색어]” 이다.

Cap 2014-12-10 11-10-11-980

 

** Exploit Helper 도구 – 쉘코드 생성 하기

공격 유형에 맞게 자동으로 쉘코드를 생성해주는 기능이다.
일반 커맨드 쉘, 서버 바인드, 리버스 커넥션 용 쉘코드를 생성해준다. (감동의 물결)

Cap 2014-12-10 11-16-51-020

 

** Exploit Helper 도구 – Skeleton 공격 코드 생성기

PEDA 는 “skeleton” 명령어를 통해 바이너리 공격 코드를 자동으로 생성해주는 기능을 갖고 있다.
바이너리 공격 형태 (argv / env / stdin / remote) 와 생성할 파일명을 설정해주면
아래와 같이 자동으로 공격 코드를 생성해준다.

공격자는 생성된 파이썬 코드의 일부만 수정하면 간편하게 공격을 수행할 수 있다.

Cap 2014-12-10 11-31-55-493

지금까지 PEDA 의 기본적인 기능에 대해서 알아보았다.
위에서 설명한 기능 외에도 Exploit 혹은 바이너리를 분석하는데 유용하게 사용할 수 있는
다양한 기능들이 존재하므로 “phelp” 명령을 통해 꼭 확인해보도록 하자.

 

4. 실제 Exploit 공격 실습 (SmashTheStack Level 5 문제)

이제 실제 워게임 문제를 통해, 바이너리 Exploit  공격 시 PEDA 의 기능을 적극적으로 활용해 보자.
위에서 언급한 기능 외에 추가적으로 사용되는 명령어는 없으므로 부담없이 따라올 수 있을 것이다.

 

Step 1 : 워게임 접속 하기 (io.smashthestack.org)

※ 아래 내용부터는 SmashTheStack Level 5에 대한 스포일러가 포함되어 있습니다. 
단, 본 내용을 통해 다른 바이너리에 실습하시는 것도 무방할것으로 생각되니 참고하시기 바랍니다.

본 실습에서 공격 대상으로 할 바이너리는 SmashTheStack 의 Level 5번 문제이다.
사실 Level 5를 접속하기 위해서는 Level1 ~ 4를 풀어야 패스워드를 얻을 수 있으나,
이미 인터넷에 공개된 write-up 정보가 워낙 많으므로, 편의상 바로 Level5 계정에 접속하고자 한다.

* SmashTheStack Level5 접속 정보SSH : io.smashthestack.org (Port : 22)ID /PASS : level5 / LOoCy5PbKi63qXTh

 

Step 2: PEDA를 통해 바이너리 로드 하기

SmashTheStack  서버에는 편의를 위해 이미 PEDA 가 설치되어 있으므로,
임의의 디렉토리에 “.gdbinit” 파일만 생성해주면 바로 분석이 가능하다.

SmashTheStack 서버는 “/tmp” 경로에만 쓰기 권한이 있으므로, “level05” 디렉토리 생성 후 “.gdbinit”을 생성하자.

Cap 2014-12-10 12-38-29-851

level5 번 바이너리 파일은 “/levels” 경로에 위치하고 있으므로 gdb를 통해 바이너리를 로드한다.
먼저 “pdisas main” 명령어를 통해 메인 함수를 분석해보자.

Cap 2014-12-10 12-40-17-265

전반적인 코드 흐름은 간단해 보인다. <main + 19> 에서 Argv  유/무를 검사한 후, Argv가 있으면
<main + 58> strcpy 함수를 통해 버퍼로 복사한 후 출력할 것으로 생각된다.

임의의 페이로드를 넣어 버퍼오버플로우(BoF) 공격이 가능한지 확인해보자.

Cap 2014-12-10 13-02-40-985

“A” 문자열을 200개 페이로드로 입력한 결과 위와 같이 EIP 값이 “0x41414141” 로 바뀐 것을 확인 할 수 있다.

보통 일반적인 gdb 환경에서는 이 상황에서 스택구조 분석 , 페이로드 위치 확인 등을 일일이 확인해야 하지만
PEDA 기능을 통해 손쉽게 Exploit 할 수 있음을 배웠으므로 이를 활용해보도록 하자.

 

Step 3 : 패턴 생성과 패턴 위치 추적하기

입력한 페이로드 값이 스택 메모리에 어떤식으로 배치되는지 확인하기 위해 다음과 같이
“pattern create” 와 “pattern_search” 명령을 사용한다.

Cap 2014-12-10 13-07-54-277

Cap 2014-12-10 13-09-40-457

생성된 패턴을 페이로드로 입력하여 바이너리를 실행한 결과 “0x41416d41 (“AmAA”)” 에서
Segmentation fault가 난 것을 확인할 수 있다.

“pattern_search”를 통해 해당 패턴 (“AmAA”)가 몇번째 생성한 패턴의 몇번째 문자열인지를 확인해보자.

Cap 2014-12-10 11-02-39-861

확인 결과 “EIP + 0 found at offset : 140” 즉, 140번째 문자열에서 패턴이 발견된 것을 볼 수 있다.

실제로 140번째에서 EIP 주소가 변경되는지 아래 명령어를 통해 확인해보자.

Cap 2014-12-10 14-30-19-088

140 개의 “A” 문자열 뒤에 “BBBB” 문자열을 입력한 결과 EIP 값이 “0x42424242″로 변경되었다.

자, 이제 실제 쉘코드를 생성하고 BoF 하는 과정만 남았다.

 

Step 4 : 쉘코드 위치로 EIP 주소 수정하기

EIP를 자유롭게 변경 할 수 있음을 확인했으므로, 임의의 값 대신 실제 쉘코드가 저장되어 있는
스택 메모리 주소를 EIP 에 덮어써야 한다.

먼저 NOP Sled 를 200개 정도 덧붙여 넣음으로써 대략적인 EIP 리턴 위치를 잡아준다.

Cap 2014-12-10 14-45-07-034

“\x90” 을 200개 정도 넣은 결과 스택 값이 “0x90909090” 으로 덮힌 것을 볼 수 있다.
스택 꼭대기에서 8바이트 떨어진 곳의 위치 (“0xbffffb68”) 를 EIP 에 덮을 주소로 셋팅 한다.

 

Step 5 : 최종 페이로드 완성 및 공격 하기

마지막으로 “shellcode generate” 기능을 통해 공격에 사용할 쉘코드를 생성한 후 최종 페이로드를 완성한다.

Cap 2014-12-10 14-50-24-047

BoF 가 되면서 정상적으로 쉘코드가 실행된 것을 볼 수 있다.

하지만 지금까지의 공격은 디버깅 환경에서 이루어졌으므로, 동일한 페이로드를 사용하여
실제 쉘 환경에서 최종적으로 Exploit 공격을 해보자.

Cap 2014-12-10 14-55-41-680

실제 Non-Debugging 환경에서도 동일한 페이로드로 공격이 성공했다. 그러나…
무슨 문제인지 uid가 여전히 “level5″로 설정되어 있어, 상위 레벨의 패스워드를 획득할 수가 없는 상황이다.

쉘이 실행되었는데 권한이 그대로인 경우는 쉘코드 자체에 setreuid에 대한 함수가 빠져 있을 것으로 생각되어
다른 쉘코드로 변경하여 다시 공격해보았다. (쉘코드 외의 페이로드는 그대로 유지)

Cap 2014-12-10 15-01-47-589

드디어 최종 공격에 성공하여 level6 로그인 패스워드를 알아냈다.

 

5. 마무리 지으며

PEDA 는 2년전 블랙햇에서 공개되었지만 아직까지 국내 블로그 포스팅이 없는 듯하여 자세히 다루어 보았다.

앞서 언급했듯이, 위 내용 외에도 다양한 내부 기능을 제공하므로, 리눅스 계열에서의 Exploit 공격시에
적극적으로 활용한다면, 불필요한 공수를 많이 줄일 수 있을 것으로 보인다.

향후 리눅스 시스템 관련 Exploit 내용을 다룰 때에는 아마도 PEDA를 많이 사용하게 될 듯 하다.

마지막으로 본 툴의 제작자에게 Respect를 보내며 글을 마무리 짓는다.

 

  • garnetiger

    이게 뭔가 했는데 교육 2주만에 감동의 눈물 흘리면서 보고 있습니다.
    하지만 아직은 쌩 GDB로 공부해야 할때 ㅠㅠ

    • ㅋㅋㅋㅋㅋㅋㅋㅋㅋ peda 적응돠면 gdb가 얼마나 구린지 알게 된다능

  • david Hwang

    혹시 geohot 의 QIRA 사용해보셨나요?? 어떤가요??

    • 퀴라도 사용해봤는데…저랑은 잘 맞지 않더군요. 오히려 IDA 물려서 동적 디버깅 하는게 저는 훨씬 편했습니다. 사실 뭐가 더 좋다기 보다는 사용자에 따라 기호가 다른거라고 생각되네요~ ㅎㅎ

Site Footer

Sliding Sidebar

About Me

About Me

June Park