파이썬 모듈, pwntools
: pwntools를 설치하고, 기본적인 사용법을 알기
여러 개의 익스플로잇 스크립트 작성할 때마다 함수들을 반복 구현하는 것은 비효율적이기 때문에 이를 간단하고 쉽게 제작하기 위하여 만든 파이썬 모듈
pwntools API 사용법
manual : https://docs.pwntools.com/en/latest/
1. process & remote
: 로컬 프로세스 또는 원격 서버의 서비스를 대상으로 익스플로잇 수행
- process : 익스플로잇을 로컬 바이너리를 대상으로 할 때 사용하는 함수
-> 익스플로잇을 테스트하고 디버깅하기 위해 사용
- remote : 원격 서버를 대상으로 할 때 사용하는 함수
-> 대상 서버를 실제로 공격하기 위해 사용
2. send
: 데이터 송수신
3. recv
: 데이터 송수신
recv()와 recvn()의 차이
recv(n) : 최대 n 바이트를 받는 것, 그만큼을 받지 못해도 에러를 발생시키지 않음
recvn(n) : 정확히 n 바이트의 데이터를 받지 못하면 계속 대기
4. packing & unpacking
: 정수를 바이트 배열로, 또는 바이트 배열을 정수로 변환
- 어떤 값을 리틀 엔디언의 바이트 배열로 변경하거나, 또는 역의 과정 거치기 위하여 사용
5. interactive
: 프로세스 또는 서버와 터미널로 직접 통신
- 셸을 획득했거나, 익스플로잇의 특정 상황에 직접 입력을 주면서 출력을 확인하고 싶을 때 사용하는 함수
- 호출하고 나면 터미널로 프로세스에 데이터를 입력하고, 프로세스의 출력을 확인할 수 있음
6. ELF
: ELF헤더의 여러 중요 정보 수집
- ELF 헤더에는 익스플로잇에 사용될 수 있는 각종 정보가 기록
7. context.log
: 익스플로잇 과정에서 출력할 정보의 중요도
- 버그가 발생 시 익스플로잇도 디버깅해야 하기 때문에 디버그의 편의를 돕는 로깅 기능 사용
- 로그 레벨은 context.log_level 변수로 조절 가능
8. context.arch
: 익스플로잇 대상의 아키텍처
- pwntools는 셸코드를 생성하거나, 코드를 어셈블, 디스어셈블하는 기능 등을 가지고 있는데, 이들은 공격 대상의 아키텍처에 영향을 받음
- 아키텍처 정보를 프로그래머가 지정할 수 있게 하며, 이 값에 따라 몇몇 함수들의 동작이 달라짐
9. shellcraft
: 다양한 셸 코드를 제공
- pwntools 에는 자주 사용되는 셸 코드들이 저장되어 있어서, 공격에 필요한 셸 코드를 쉽게 꺼내 쓸 수 있게 함
- 매우 편리한 기능이지만 정적으로 생성된 셸 코드는 셸 코드가 실행될 때의 메모리 상태를 반영하지 못함 / 프로그램에 따라 입력할 수 있는 셸 코드의 길이나, 구성 가능한 문자의 종류에 제한이 있을 수 있는데, 이런 조건들도 반영하기 어려움
- 따라서 제약 조건이 존재하는 상황에서는 직접 셸 코드를 작성하는 것이 좋음
10. asm
: 어셈블리 코드를 기계어로 어셈블
- 어셈블 기능을 제공
- 대상 아키텍처가 중요하므로, 아키텍처를 미리 지정해야 함