리버싱
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' #비교적 중요한 정보들만 출력