본문 바로가기
Pwnable

Pwnable 방법론

by ms-eo 2025. 11. 19.

Pwnable 기초 지식

파일 디스크립터

  • 리눅스 혹은 유닉스 계열의 시스템에서 프로세스가 파일을 다룰 때 사용 (파일 핸들러)
  • 파일로 취급되는 외부 장치를 포함한 모든 장치들에 접근할 때 사용
  • 파일이 시스템으로부터 할당 받은 대표 번호
  • 음수가 아닌 정수 타입으로 표현

※ POSIX : 운영체제 간의 호환성을 위해 IEEE에서 만든 유닉스 운영체제 기반의 API 규격

파일 디스크립터 확인 방법

  1. 실행 중인 프로세스 PID 확인

2. PID로 해당 프로세스의 파일 디스크립터 정보 확인

연산자 우선순위

  • 수식 내에 여러 연산자가 함께 등장할 때, 어느 연산자를 먼저 처리해야 되는지를 정하기 위함

1순위 : x++, x—, (), [], ., →

2순위 : ++x, —x, +x, -x, !, ~, (자료형), *x, &x, sizeof

3순위 : *, /, %

4순위 : +, -

5순위 : <<, >>

6순위 : <, ≤, >, ≥

7순위 : ==, ≠

8순위 : &

9순위 : ^

10순위 : |

11순위 : &&

12순위 : ||

13순위 ?:


Pwnable 방법론

  1. 사전 조사
    • 파일 정보 수집
      • 바이너리 파일과 관련된 정보를 수집하는 단계
      • file : 바이너리 형식, 바이트오더링 등 바이너리에 관한 정보를 제공
      • readelf : ELF 파일 정보를 제공 (하나 이상의 옵션을 사용해야 함)
      • ldd : 지정한 프로그램이나 파일을 실행할 때 필요한 공유 라이브러리 의존성
    • 메모리 보호 기법
      • 허가되지 않은 메모리 접근으로 인한 영향을 예방할 수 있는 보호 기법
      • 메모리 보호 기법을 우회하여, RIP를 컨트롤할 수 있는 시나리오를 구상해보는 단계
      • 메모리 보호 기법 확인하기 → 공격 기법 추리기 → 취약점 예상

※ checksec : 바이너리에 어떤 메모리 보호 기법이 적용되어 있는지 확인하는 명령어

    • Memory Map
      • 어떤 메모리 영역에 쓰기 권한과 실행 권한 이 있는지 메모리 스펙을 확인함
      • 인자로 주소 전달 시 해당 주소가 어떤 메모리 영역에 위치하는지 메모리 상황 파악

※ vmmap : Virtual Memory Map의 약자로 프로세스 메모리 매핑 정보를 확인할 때 사용하는 GDB 명령어

2. 바이너리 파일 실행

    • 파일 실행
      • 사전 조사를 마친 뒤, 주어진 바이너리 파일을 실행해 프로세스 확인
    • 실행 동작 파악
      • 어떤 실행 흐름을 보이는지 간단히 파악하는 단계

3. 정적 분석

    • 코드 분석
      • 바이너리의 실행 동작을 알기 위해 코드를 실행하지 않고 분석하는 단계
      • 사용자의 입력 값에서 발생할 취약점을 예상하고 RIP 컨트롤 시나리오를 작성
      • ex. IDA,
    • 변수 및 함수의 취약점 존재 여부

4. 동적 분석

    • 파일 디버깅
      • 프로그래밍 과정 중에 발생하는 논리적 오류나 비정상적인 연산, 버그를 찾고 수정하는것
      • Pwnable에서는 소스코드를 복원하거나 프로그램의 취약점을 분석한다는 의미
    • 코드 및 로직 분석
      • 제공된 바이너리 파일을 디버거로 실행시켜 메모리 구조를 확인
      • 사용자의 입력 값이 필요한 부분에 중단점을 설정한 뒤, 실행하면서 문제에 필요한 정보를 수집
    • 취약점 존재 여부

5. Payload 작성

    • 공격 시나리오
      • 취약점을 통해 대상의 시스템을 공격하는 코드를 의미
    • Python
    • Pwntools
      • 공격 Payload를 편하게 작성할 수 있는 Python 모듈

6. Exploit

    • Payload 실행
    • Flag 획득
    • 최종 목적 (관리자 권한 획득 등)

'Pwnable' 카테고리의 다른 글

Integer Overflow  (0) 2025.11.19
Format String Bug  (0) 2025.11.19
Buffer Overflow  (0) 2025.11.19
Pwnable Tools  (0) 2025.11.19
리눅스 & 어셈블리어  (0) 2025.11.19