파이썬 모듈
익스플로잇에 자주 사용되는 함수들을 모아놓은 것
- process : 로컬 바이너리를 대상으로 하는 익스플로잇 (디버깅)
- remote : 원격 서버를 대상으로 하는 익스플로잇 (실제 공격)
from pwn import * p = process('./test') #로컬 바이너리의 'test'를 대상으로 익스플로잇 p = remote('example.com', 31337) #'example.com의 31337 포트에서 실행 중인 프로세스를 대상으로 익스플로잇
데이터를 프로세스에 전송
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'을 입력
프로세스에서 데이터를 수신
data = p.recv(1024) # p가 출력하는 데이터를 최대 1024바이트까지 받아옴 data = p.recvline() # p가 출력하는 데이터를 \n을 만날 때까지 받아옴 data = p.recvn(5) # p가 출력하는 데이터를 5바이트만 받아옴 data = p.recvuntil('hello') # p가 출력하는 데이터를 'hello'를 만날 때까지 받아옴 data = p.recvall() # p가 출력하는 데이터를 프로세스가 종료될 때까지 받아옴
어떤 값을 리틀 엔디언의 바이트 배열로 변경, 혹은 그 역의 과정
s32=0x41424344 s64=0x4142434445464748 p32(s32) # 패킹 b'DCBA' p64(s64) # 패킹 b'HGFEDCBA' s32="ABCD" s64="ABCDEFGH" hex(u32(s32)) # 언패킹 0x44434241 hex(u32(s32)) # 언패킹 0x4847464544434241
셸을 획득했거나, 익스플로잇의 특정 상황에 직접 입력을 주면서 출력을 확인하고 싶을 때 사용
p.interactive()
익스플로잇에 사용될 수 있는 각종 정보(ELF 헤더)를 참조
e = ELF('./test') puts_plt = e.plt['puts'] # ./test에서 puts()의 PLT주소를 찾아서 puts_plt에 저장 read_got = e.got['read'] # ./test에서 read()의 GOT주소를 찾아서 read_got에 저장
익스플로잇의 디버깅
context.log_level='error' # 에러만 출력 context.log_level='debug' # 대상 프로세스와 익스플로잇 간에 오가는 모든 데이터를 화면에 출력 context.log_level='info' # 비교적 중요한 정보만 출력
아키텍처 정보를 지정
context.arch="amd64 / i386 / arm" # x86-64 / x86 / arm 아키텍처 사용
자주 사용되는 셸 코드들
shellcraft.sh() # 셸을 실행하는 셸 코드
어셈블 기능
asm(code) # 셸 코드를 기계어로 어셈블