시스템해킹/공부

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

 

 

반응형