Tool : pwntools

곽무경·2022년 6월 29일
0

System Hacking

목록 보기
8/27

pwntools

파이썬 모듈
익스플로잇에 자주 사용되는 함수들을 모아놓은 것

process & remote

  • process : 로컬 바이너리를 대상으로 하는 익스플로잇 (디버깅)
  • remote : 원격 서버를 대상으로 하는 익스플로잇 (실제 공격)
from pwn import *
p = process('./test') #로컬 바이너리의 'test'를 대상으로 익스플로잇
p = remote('example.com', 31337)
#'example.com의 31337 포트에서 실행 중인 프로세스를 대상으로 익스플로잇

send

데이터를 프로세스에 전송

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'을 입력

recv

프로세스에서 데이터를 수신

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가 출력하는 데이터를 프로세스가 종료될 때까지 받아옴

packing & unpacking

어떤 값을 리틀 엔디언의 바이트 배열로 변경, 혹은 그 역의 과정

s32=0x41424344
s64=0x4142434445464748
p32(s32)         # 패킹 b'DCBA'
p64(s64)         # 패킹 b'HGFEDCBA'
s32="ABCD"
s64="ABCDEFGH"
hex(u32(s32))    # 언패킹 0x44434241
hex(u32(s32))    # 언패킹 0x4847464544434241

interactive

셸을 획득했거나, 익스플로잇의 특정 상황에 직접 입력을 주면서 출력을 확인하고 싶을 때 사용

p.interactive()

ELF

익스플로잇에 사용될 수 있는 각종 정보(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

익스플로잇의 디버깅

context.log_level='error'   # 에러만 출력
context.log_level='debug'   # 대상 프로세스와 익스플로잇 간에 오가는 모든 데이터를 화면에 출력
context.log_level='info'    # 비교적 중요한 정보만 출력

context.arch

아키텍처 정보를 지정

context.arch="amd64 / i386 / arm"   # x86-64 / x86 / arm 아키텍처 사용

shellcraft

자주 사용되는 셸 코드들

shellcraft.sh()   # 셸을 실행하는 셸 코드

asm

어셈블 기능

asm(code)   # 셸 코드를 기계어로 어셈블

0개의 댓글