1 minute read

pwntools 한줄 설치

python3 -m pip install --upgrade pwntools

python>>> from pwn import *

지원하는 메소드들

process / remote

  • process(String filename)

로컬 컴퓨터의 바이너리를 대상으로 익스플로잇 실행
실행시 파라미터가 필요하다면 배열에 담아 보내면 됨 process(['./yass', 'ok', '1'])

  • remote(String address, Int port)

address에 지정된 주소(ip, URI 등)로 지정된port에서 수행되는 프로세스에 대해 익스플로잇 진행

send

데이터를 프로세스에 전송해주는 메소드
processremote로 열어놓은 프로세스를 사용함

from pwn import *

p = process('./yass')

# ./yass에 'A'입력
p.send('A');

# ./yass에 'iKaroS\n'입력
p.sendline('iKaroS');

# ./yass에서 hello가 출력되면 'no'입력
p.sendafter('hello', 'no');

# ./yass에서 hello가 출력되면 'no\n'입력
p.sendlineafter('hello', 'no');

recv / recvn

열린 프로세스에서 데이터를 받기위해 사용

  • recv(Int byte)

최대 지정된 byte만큼 데이터를 받아옴

  • recvn(Int byte)

정확히 지정된 byte만큼의 데이터를 받기 전까지 계속 대기

from pwn import *

p = process('./yass')

# `./yass`가 출력하는 데이터를 최대 1024바이트 만큼 받아서 `data`에 저장
data = p.recv(1024);

# `./yass`가 출력하는 데이터를 `\n` 개행문자를 만날때까지 받아 `data`에 저장
data = p.recvline();

# `./yass`가 출력하는 데이터가 `ok`가 출력 될 때까지 `data`에 저장
data = p.recvuntil('ok')

# `./yass`가 출력하는 데이터를 해당 프로세스가 끝날때까지 받고 `data`에 저장
data = p.recvall()

packing / unpacking

packing 메소드는 리틀 엔디안으로
unpaking은 다시 빅 엔디안으로

  • p[bit](Void data)

data를 지정된 비트로 패킹해줌

p32('ok');
p64('no');
  • u[bit](Void data)
a = p32('ok');
b = p64('no');

u32(a);
u64(b);

interactive

셸 획득완료 혹은 특정상황에 직접 입력을 주면서 출력을 확인할때 사용

p = process('./yass')
p.interactive()

ELF

ELF 헤더를 읽어주는 메소드

e = ELF('./yass')

# ./yass에서 METHOD1()의 PLT 주소를 찾아 plt 변수에 저장
plt = e.plt['METHOD1']

# ./yass에서 METHOD2()의 GOT 주소를 찾아 got 변수에 저장
got = e.got['METHOD2']

context

pwntools에서 지원하는 디버그 로깅 기능(현재 작성중인 프로그램 말하는거)

# context 라는 전역 변수가 기본적으로 존재하는듯 함
context.log_level = ['error' | 'debug' | 'info']

# pwntools가 지정된 아키텍쳐로 돌아가도록 함수의 동작을 정의하게됨
context.arch = ['amd64' | 'i386' | 'arm']

shellcraft

작성되어있는 셸 코드를 실행시켜주는 메소드

https://docs.pwntools.com/en/stable/shellcraft/amd64.html

위 링크에서 사용가능한 셸코드를 찾을 수 있다고 함 실행 전에 context.arch 로 미리 아키텍처를 지정하는게 좋음

code = shellcraft.[ 링크에 존재하는 메소드]

asm

어떤 코드를 어셈블리 해줌 shellcraft와 마찬가지로 context.arch를 미리 지정해줘야 함

code = shellcraft.sh()

code = asm(code)

Tags:

Updated: