등장 배경
pwndbg에서 만약 인자로 전달할 값이 많거나 파이썬의 코드가 길어지게 되면 불편하고 가독성이 떨어진다.
그래서 해커들은 파이썬으로 익스플로잇 스크립트를 작성하여 바이너리를 실행한다.
설치 방법
sudo apt-get update
sudo apt-get 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
설치 후에 사진과 같이 명령어를 입력했을 때 이런 화면이 뜨면 잘 설치된 것이다.
사용 방법
1. process: 익스플로잇을 로컬 바이너리를 대상으로 할 때 사용하는 함수, 익스플로잇을 테스트하고 디버깅할 때
2. remote: 원격 서버를 대상으로 할 때 사용하는 함수, 대상 서버를 공격하기 위해
3. send: 데이터를 프로세스에 전송하기 위해 사용
- send
- sendline: 인자를 \n과 함께 출력
- sendafter: 해당 바이너리가 첫 번째 인자를 출력하면 두 번째 인자를 입력
- sendlineafter
4. recv: 프로세스에서 데이터를 받기위해 사용
- recv: 프로세스가 출력하는 데이터를 최대 인자의 크기 만큼 받기
- recvline: 프로세스가 출력하는 데이터를 개행문자를 만날 때까지 받기
- recvn: 프로세스가 출력하는 데이터를 인수에 적힌 숫자의 크기만큼만 받기
- recvuntil: 프로세스가 인자에 해당하는 문자를 출력할 때까지 데이터를 수신하여 받기
- recvcall: 프로세스가 출력하는 데이터를 프로세스가 종료될 때까지 받기
5. p32/p64:
6. u32/u64:
from pwn import *
p = process('./test')
p.interactive()
7. interactive: 특정 상황에 직접 입력을 주면서 출력을 확인하고 싶을 때 사용하는 함
from pwn import *
e = ELF('./test')
puts_plt = e.plt['puts'] # ./test에서 puts()의 PLT주소를 찾아서 puts_plt에 저장
read_got = e.got['read'] # ./test에서 read()의 GOT주소를 찾아서 read_got에 저장
8. e: elf 에 저장되어 있는 각종 정보를 추출
from pwn import *
context.log_level = 'error' # 에러만 출력
context.log_level = 'debug' # 대상 프로세스와 익스플로잇간에 오가는 모든 데이터를 화면에 출력
context.log_level = 'info' # 비교적 중요한 정보들만 출력
9. context.log: 익스플로잇을 디버깅하기 위해 사용
from pwn import *
context.arch = "amd64" # x86-64 아키텍처
context.arch = "i386" # x86 아키텍처
context.arch = "arm" # arm 아키텍처
10. context.arch: 아키텍처 정보를 지정할 수 있는 변수
#!/usr/bin/env python3
# Name: shellcraft.py
from pwn import *
context.arch = 'amd64' # 대상 아키텍처 x86-64
code = shellcraft.sh() # 셸을 실행하는 셸 코드
print(code)
code = asm(code) # 셸 코드를 기계어로 어셈블
print(code)
11. shellcraft: 공격에 필요한 셸 코드를 쉽게 꺼내 쓸 수 있도록 함
12. asm: 어셈블 언어로 바꾸어주는 기능, 아키텍처를 미리 지정해야 함