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

+ Recent posts