리버싱

pwntools 사용법

곽도우너 2024. 1. 22. 01:19

pwntools 설치방법

sudo apt update
sudo apt install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential
sudo python3 -m pip install --upgrade pip
sudo python3 -m pip install --upgrade pwntools

자주 사용되는 API들

0. pwn 모듈 import 시키기

from pwn import * #pwntools를 사용하려면 파이썬 파일의 처음에 pwn 모듈을 import 시켜야 함.

1. process & remote

process 함수

: 익스플로잇을 로컬 바이너리를 대상으로 할 때 사용하는 함수

  • 보통 익스플로잇을 테스트하고 디버깅하기 위해 사용
p = process('./test/) #로컬 바이너리 'test'를 대상으로 익스플로잇 수행
#해당 프로그램을 실행시키고, 입력을 대기하게 됨
#이후 실행된 프로그램에는 p 변수를 통해 접근 가능

remote 함수

: 원격 서버를 대상으로 할 때 사용하는 함수

  • 대상 서버를 실제로 공격하기 위해 사용
p = remote('example.com', 3000) 
#'example.com'의 3000 포트에서 실행 중인 프로세스를 대상으로 익스플로잇 수행

2. send

send 함수

: 데이터를 프로세스에 전송하기 위해 사용

p = process('./test')
p.send('a') #./test에 'a'를 입력
p.sendline('a') #./test에 'a'+'\\n'을 입력
p.sendafter('hello','a') #./test가 'hello'를 출력하면, 'a'를 입력
p.sendlineafter('hello','a') #./test가 'hello'를 출력하면, 'a'+'\\n'을 입력

3. recv

recv 함수

: 프로세스에서 데이터를 받기 위해 사용

  • *recv()와 recvn()의 차이점
    • recv(n) : 최대 n바이트를 받는 것, 그만큼을 받지 못해도 에러를 발생시키지 않음
    • recvn(n) : 정확히 n바이트의 데이터를 받지 못하면 계속 기다림
p = process('./test')
data = p.recv(1024) #p가 출력하는 데이터를 최대 1024바이트까지 받아서 data에 저장
data = p.recvline() #p가 출력하는 데이터를 개행문자를 만날 때까지 받아서 data에 저장
data = p.recvn(5) #p가 출력하는 데이터를 5바이트만 받아서 data에 저장
data = p.recvuntill('hello') #p가 출력하는 데이터를 'hello'가 출력될 때까지 받아서 data에 저장
data = p.recvall() #p가 출력하는 데이터를 프로세스가 종료될 때까지 받아서 data에 저장

4. packing & unpacking

  • packing
    • p32 : 정수를 32bit little endian으로 packing 해주는 함수
    • p64 : 정수를 64bit little endian으로 packing 해주는 함수
  • unpacking
    • u32 : 32bit little endian을 정수로 unpacking 해주는 함수
    • u64 : 64bit little endian을 정수로 unpacking 해주는 함수
s32= 0x41424344
print(p32(s32))
#b'DCBA
s64 = "ABCDEFGH"
print(hex(u64(s64))
#0X4847464544434241

5. interactive

interactive 함수

: 쉘을 획득했거나, 익스플로잇의 특정 상황에서 직접 입력을 주면서 출력을 확인하고 싶을 때 쓰는 함수

  • 호출하고 나면 터미널로 프로세스에 데이터를 입력하고, 프로세스의 출력을 확인할 수 있음
p = process('./test')
p.interactive()

6. ELF

ELF 함수

: ELF 헤더에는 익스플로잇에 사용될 수 있는 각종 정보가 기록되어있음

from pwn import *

e = ELF('./test')

7. context.log

context.log_level

: 내 공격이 어디까지 실행됐는지 확인 가능

from pwn import *

context.log_level = 'error' #에러만 출력
context.log_level = 'debug' #대상 프로세스와 익스플로잇 간에 오가는 모든 데이터를 화면에 출력
context.log_level = 'info' #비교적 중요한 정보들만 출력

8. debug