pwndbg 사용법 정리
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
데이터를 프로세스에 전송해주는 메소드
process
나 remote
로 열어놓은 프로세스를 사용함
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)