-
PRELIMINARY 서론
pwntools는 CTF를 위해 최적화된 기능들을 제공하는 python 라이브러리이다. 주어진 바이너리에 대해 분석하고, 호스트와 상호작용하는 등 다양한 작업을 수행할 수 있다.
다음 명령어를 터미널에 입력해 pwntools를 설치하자.
$ sudo apt-get update $ sudo 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
pwntools를 python 코드에서 사용하기 위해서는 pwn을 import 해주면 된다.
from pwn import *
pwntools 라이브러리에는 다양한 함수와 기능들이 존재하고, 아래에는 자주 사용하는 것들을 따로 정리해 보았다.
Connection 연결
p = remote(host , port) # 원격 호스트에 TCP, UDP로 통신 p = process("./binary") # 로컬 프로세스를 실행하여 통신 p = ssh(user, host, post, password) # ssh 서버에 접속해 통신 p.interactive() # 호스트와 상호작용하기 위한 함수
Input / Output 입출력
p.recv() # 수신 p.recv(3) # 3byte 만큼 수신 p.recvuntil("l0tus") # "l0tus"를 받을 때까지 수신 p.send(payload) # payload를 송신 p.sendline(payload) # payload + '\n'을 송신 p.sendlineafter("l0tus", payload) # "l0tus"까지 수신하고, payload를 송신
Packing 패킹
p8(data) # 8-bit integer를 little-endian으로 pack p16(data) # 16-bit p32(data) # 32-bit p64(data) # 64-bit u8(data) # 8-bit little-endian data를 unpack u16(data) # 16-bit u32(data) # 32-bit u64(data) # 64-bit
ELF
binary = "./l0tus" e = ELF(binary) # ELF 파일을 다루기 위한 객체 호출 e.plt["read"] # binary에 존재하는 PLT 주소 e.got["read"] # binary에 존재하는 GOT 주소 e.symbols["main"] # binary에 존재하는 함수/전역 변수의 주소 l = ELF('./libc.so.6') # 라이브러리 객체 호출 binsh = next(l.search(b"/bin/sh\x00")) # libc에 존재하는 /bin/sh 문자열의 offset
ROP
e = ELF(binary) r = ROP(e) # ROP를 위한 객체 호출 prdi = (r.find_gadget(['pop rdi', 'ret']))[0] # binary에 존재하는 pop rdi, ret 가젯의 주소
FmtStr
def send_payload(payload): # FmtStr 객체가 사용할 payload 출력 함수 log.info("payload = %s" % repr(payload)) p.sendline(payload) f = FmtStr(send_payload, offset = 2) # FmtStr을 위한 객체 호출, 스택 포인터와의 offset을 인자로 받음 dest = e.symbols["flag"] src = e.got["exit"] f.write(dest, src) # dest에 src를 overwrite하는 payload 작성 f.execute_writes() # 지금까지 작성한 payload를 출력
MISC
context.log_level = 'debug' # 디버그 메세지를 화면에 출력 context.binary = "./binary" # 대상 바이너리의 환경과 동기화
SHELLCODE
shellcode = asm(shellcraft.execve("/bin/sh",0,0)) # execve("/bin/sh")를 호출하는 쉘코드 asm('mov rax, 0') # 어셈블리를 바이너리로 변환 disasm(b'\xba\x00\x00\x00') # 바이너리를 어셈블리로 변환
'CTF > TOOL' 카테고리의 다른 글
Oneshot gadget (0) 2021.01.08 pwngdb (0) 2021.01.08 WSL2 (0) 2021.01.08