시스템해킹/공부
pwntool 사용법
Goblebin
2024. 4. 29. 10:50
반응형
pwn 모듈 불러오기
from pwn import *
p = process('./프로그램') # 로컬 프로그램을 대상으로 익스플로잇
r = remote('주소', 포트번호) # 원격 서버를 대상으로 익스플로잇
ELF 매서드로 아키텍처 알아내서 쓰면 될 듯 하다.
context.arch = "amd64" # x86-64 아키텍처
context.arch = "i386" # x86 아키텍처
context.arch = "arm" # arm 아키텍처
str = 0x12345678
p32(str) # 0x78563412 값을 가짐.
# 값을 packing하는 매서드, 입력 값을 little endian으로 변환해줌.
p32(str, endian = 'big') # big endian으로 packing
# p64는 64바이트를 대상으로 패킹
str = b'ABCD'
hex(u32(str)) # 0x44434241 값을 가짐.
# 값을 unpacking 하는 매서드, 서버의 응답 값을 출력할 때 쓰이는 듯?
u32(str, endian = 'big') # big endian으로 unpacking
# u64는 64바이트를 대상으로 언패킹
r.send(payload) #서버로 paylod 전송
r.sendline(payload) #서버로 paylod 전송 후 줄바꿈
r.sendafter(payload, b'input : ') #서버에서 'input :' 출력 후 서버로 paylod 전송
r.sendlineafter(payload) #서버에서 'input :' 출력 후 서버로 paylod 전송 후,
#p.process도 마찬가지
data = r.recv(1024) # 1024바이트 수신
data = r.recvline() # 줄바꿈 나올때까지 수신
data = r.recvn(5) # 5바이트만 수신
data = r.recvuntil(b'apple') # apple을 출력할때까지 수신
data = r.recvall() # 전부 수신
r.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에 저장
# 동적 링킹하는 과정에서 plt, got를 사용함.
# plt는 got 주소를 가르키고, got는 실제 함수 동작 위치?
context.log_level = 'error' # 에러만 출력
context.log_level = 'debug' # 대상 프로세스와 익스플로잇간에 오가는 모든 데이터를 화면에 출력
context.log_level = 'info' # 비교적 중요한 정보들만 출력
반응형