1. Pwntools
1) CTF 프레임워크이자 익스플로잇을 쉽게 짤 수 있게 해주는 라이브러리
2) 설치방법
- apt-get update
- apt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential
- python3 -m pip install --upgrade pip
- python3 -m pip install --upgrade pwntools
2. Pwntools 사용법
1) pwn 모듈 import
→ from pwn import *
2) 파일 연결
- 원격인 경우 : remote(IP, PORT)
- 로컬인 경우 : process(PATH)
→ 해당 프로그램을 실행시킨 후 입력을 대기한다.
→ process()로 실행시킨 프로그램은 입출력을 화면에 직접 할 수 없고 변수를 통해 함수를 호출하는 방법을 이용해야 한다.
- ssh인 경우 : ssh(USERNAME,IP,PORT,PASSWORD)
3) 데이터 받아오기
- 한 줄 받아오기 : recvline()
- str까지 받아오기 : recvuntil(str)
- int만큼 받아오기 : recv(int)
4) 데이터 보내기
- value 값 보내기 : send(value)
- 데이터 한 줄 보내기 : sendline(value)
- 쉘에 직접 명령을 전송, 수신하기 : interactive()
→ 프로그램에 직접 입출력 조작이 필요할 때 이 함수를 호출
3. Pwntools 자주 쓰이는 모듈, 함수
1) pwnlib.context
- pwntools 설정에 편리
- context.log_level='debug' : exploit에 어려움이 있을 때 세팅
2) remote, listen, ssh, process
- pwnlib.tubes
- CTF에서 가장 일반적으로 쓰이고 편리한 기능
3) log
- pwnlib.log
4) shellcraft
- pwnlib.shellcraft
- shellcode 라이브러리
5) gdb.debug와 gdb.attach
- pwnlib.gdb
- 자동으로 breakpoint 설정하고 exploit에 반복을 만듦
4. 연습문제
먼저 chall.c 코드를 통해 소스코드를 확인할 수 있다.
이 코드는 랜덤으로 결정되는 a와 b를 합한 값을 입력받아 답이 맞다면 correct, 다르다면 wrong을 출력한다.
따라서 문제를 해결하기 위해 파이썬으로 위와 같은 코드를 작성했다.
먼저 swing_pwn_chall이라는 파일은 로컬 파일이기 때문에 process()함수를 이용하여 연결해주었고
위 코드에서 20번 반복되었기 때문에 반복문을 사용해준 후
recvuntil()을 사용하여 해당 문자의 앞까지 데이터를 받아올 수 있도록 하고
sendline()을 사용하여 a와 b에 저장된 값을 int형으로 변환해준 데이터를 보낼 수 있도록 한다.
이 값을 recvline()을 사용하여 한 줄을 보내주고 이와 같이 입출력 조작을 해주었으므로 interactive() 함수를 이용한다.
위와 같이 작성한 코드를 실행시키면 correct와 flag가 잘 출력되는 것을 확인할 수 있다.
'2021-1 STUDY > Pwnable Study' 카테고리의 다른 글
Week05_BOF (0) | 2021.05.19 |
---|---|
Week04_GDB 분석 (0) | 2021.05.12 |
Week03_collision (0) | 2021.05.05 |
Week03_setuid (0) | 2021.05.05 |
Week01_메모리구조 (0) | 2021.03.31 |