Pwntools

2026. 5. 11. 21:27·STUDY/CS

Pwn은 시스템이나 프로그램의 취약점을 이용해 제어권을 빼앗는 공격이다. 

pwntools는 해킹하는 과정에 도움이 되는 기능들을 모아둔 도구로, 공격 스크립트를 신속하게 작성할 수 있도록 도와주는 프레임 워크이다. 파이썬 패키지 형태로 제공된다.

 

설치 명령어는 아래와 같다.

sudo apt-get update
sudo apt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential
python3 -m pip install --upgrade pip
python3 -m pip install pwntools

externally-managed-environment Error가 떴다. 직역으로 외부 관리 환경 오류라는 놈인데 읽어보면

1. 시스템 전역에 파이썬 패키지를 설치할거면 python3-xyz를 apt로 설치하던가 

2. python3를 virtual environment에서 pip 설치를 하던가 

를 선택지로 준다.

 

추가로 sudo apt-get install python3-pwntools 로 설치하는 방법도 있는 듯하다. 

 

어쩌라고 ... 그러기 싫다

해당 에러를 구글링 하다가 python3 -m pip config set global.break-system-packages true 로 해결할 수 있다는 것을 알게 되었다. 

해당 오류를 발생시키는 파이썬의  connfig 설정을 OFF 해주는 코드이다.

설치 중에 WARNING 문구가 눈에 띄어서 해결하고 가기로 했다. /home/kwonhan/.local/bin이라는 디렉토리에 설치했는데, 이 디렉토리가 시스템 PATH에 등록되어있지 않다고 한다. 

 

export PATH=$PATH:/home/kwonhan/.local/bin

echo 'export PATH=$PATH:/home/kwonhan/.local/bin' >> ~/.bashrc

source ~/.bashrc

 

으로 등록해주었다.

위처럼 뜨면 정상적으로 잘 설치된 것이다.


pwntools 프로세스 통신 기능

<>는 ""이 된다.

연결 맺기

  • process()
    로컬에 위치한 프로그램 실행하여 통신할 때 사용 
    p = process(<경로>)
    *인자 전달이나 환경 변수 설정하는 경우 p = process(["./example". "AAAA"], env = {"LD_PRELODAD":"./libc.so.6"})
    -> argv[1]에 "AAAA"전달, LD_PRELOAD 환경 변수를 ./libc.so.6으로 설정해 실행 

    성공적으로 연결되면 해당 함수는 이후 데이터 송수신에 사용할 pwnlib.tubes 클래스 반환, 해당 클래스는 p에 저장 
  • remote()
    호스트 도메인 or IP주소와 포트 번호 인자로 받아서 원격 서버에 통신할 때 사용. process 와 동일 클래스 반환 
    기본적으로 TCP 연결이고, UDP 연결 맺고싶다면 typ인자에 'udp'
    r = remote("example.com", 1337, typ = 'udp')
  • ssh()
    SSH 서버에 접속해서 통신하기 위해 이용. <IP주소>의 <포트>에 열린 서버에 <NAME>과 <PW>로 로그인 
    s = ssh(<USERNAME>, <IP주소>, port = 포트번호, password = <PW>)

 

데이터 송수신

b는 문자가 아닌, 바이트 데이터임을 명시

  • recv()
    데이터 수신. 수신한 데이터를 bytes 클래스로 반환

    recv(n)는 최대 n바이트를 받는 함수. 해당 바이트만큼 데이터 받지 못해도 함수 종료
    recvn(n)은 정확히 n바이트를 받아야 종료. 못채우면 계속 기다림

    서버 -> 스크립트로 데이터가 파이썬 프로그램의 버퍼로 들어간다.
    스크립트 -> 터미널은 스크립트에서 print()를 사용하거나 r.interactive일때만 화면에 보인다. 
    • data = p.recv(n)         
      p가 출력하는 데이터를 최대 n바이트까지 받아서 data에 저장
    • data = p.recvline()           
      p가 출력하는 데이터를 개행문자 만날 때까지 받아서 data에 저장
    • data = p.recvn(n)             
      p가 출력하는 데이터를 n바이트만 받아서 data에 저장
    • data = p.recvuntil(b<문자열>) 
      p가 b<문자열> 출력할 때까지 데이터 수신, data에 저장
      data = p.recvuntil(b'hello')
    • data = p.recvall()           
      p가 출력하는 데이터를 프로세스가 종료될 때까지 받아서 data에 저장. 걍 다 받는다는 소리
  • send()
    데이터 송신. 데이터를 bytes 클래스 인자로 받아 전송
    sendafter()와 sendlineafter()은 실제 인자로 전달된 내용들이 나올때까지 수신한 뒤 데이터 전송
    • p.send(b<str1>)                     
      ./example에 b<str1> 입력 (= 전송)
    • p.sendline(b<str1>)     
      ./example에 b<str1> + b'\n' 입력. 데이터 보낼때 개행 해서
    • p.sendafter(b<str1>, b<str2>) 
      ./example이 b<str1> 출력하면 b<str2> 입력
      즉, str1이 받을 데이터(값), str2는 전송할 데이터 
      recvuntil과 send 합침 
    • p.sendlineafter(b<str1>, b<str2>) 
      ./example이 b<str1> 출력하면 b<str2> + b'\n' 입력

  • interactive()
    터미널에서 사용자가 실시간으로 데이터를 수신하고 전송할 수 있게 하는 함수      p.interactive()
    터미널을 통해 프로세스에 입력값을 전달, 프로세스의 출력도 실시간으로 터미널에 출력 -> 터미널에서 직접 프로그램 실행해 조작하는 것과 비슷한 효과 
    Exploit 코드 맨 마지막에 삽입하여 쉘 획득 후 서버와의 상호작용 및 명령어 전달

 

연결 종료

  • close()
    send, recv, interactive와 같이 pwnlib.tubes 클래스에 구현됨
    연결 종료하고 싶을때 사용        p.close()
    근데 interactive() 호출한 경우 함수 종료될 때 연결도 종료돼서 close() 추가로 사용할 필요는x

 

로그 출력

  • context.log_level = <옵션>
    로그 출력 상세도 설정
    • critical : 치명적인 오류 외에 출력 안함
    • error : 에러 메시지만 출력
    • warning / warn : 경고 메시지 출력
    • info : default. 일반적인 상태 메시지 출력
    • debug : 송수신 데이터, 내부 변수 등 상세히 출력

 

그 외 기능들

Packing & Unpacking

데이터를 하나의 형태로 모아 포장 또는 다시 분해
뒤의 숫자는 Bytes 클래스의 비트 수

  • p8(), p16(), p32(), p64() : 숫자 → Bytes 클래스로 패킹
  • u8(), u16(), u32(), u64() : Bytes 클래스 → 숫자로 언패킹 

패킹/언패킹 함수는 기본적으로 리틀 엔디언으로 동작. 빅엔디언으로 설정도 가능 p8(0x12, endian = 'big')

 

GDB

  • gdb.attach(p)
    p는 process()로 생성한 객체. remote()로 생성한 객체나 PID 전달해도 됨 
    (단, remote로 생성한 객체 전달할 경우, remote()로 접속한 프로세스가 같은 장치에서 실행되고 있어서 디버깅이 가능한 프로세스인 경우만 허용. 내 컴퓨터에서 도커 띄워놓고 도커 서버에 remote로 접속한 경우)  
    해당 프로세스에 GDB가 붙어 실행이 중단, GDB 터미널이 열려 디버깅 수행이 가능한 상태가 된다.
p = process("./example")
gdb.attach(p)
sleep(1)   # 또는 pause(). GDB가 성공적으로 붙을 수 있는 시간 벌기 위함

추가 참고

 

Assemble & Disassemble

  • context.arch = <대상 아키텍처>
    아키텍처(Instruction Set Disassemble, ISA) 마다 어셈블리 언어와 기계어가 다르기에 어셈블/디스어셈블하기 위해서는 대상 아키텍처 적절하게 설정해야함

    amd64(x86-64), i386(x86), arm
  • asm(), disasm()
context.arch = "amd64" # x86-64

machine_code = asm('mov eax, 0')  # 어셈블리어 -> 기계어
print(machine_code)
assembly_code = disasm(machine_code)  # 기계어 -> 어셈블리어
print(assembly_code)

 

ELF

리눅스 운영체제 실행 파일 형식. ELF()인자에 ELF파일 경로 넣으면 pwnlib.elf.elf.ELF 클래스 반환
ELF정보 담고있는 멤버변수들과 다양한 기능 지원하는 함수들이 구현

  • symbols
    pwnlib.elf.elf.ELF 클래스의 멤버변수. 심볼들 주소를 가지고 있는 doctdict 클래스(딕셔너리같은건데 속성으로 섭근 가능)
    symbols에서 제공하는 주소는 가상 주소다. 
    PIE 보호기법이 적용되어있지 않다면 가상 주소 제공, 적용되었으면 이미지 베이스로부터의 상대 가상 주소를 제공
e = ELF("./example")
print(hex(e.symbols['write']))  # 'write' 심볼의 주소
print(hex(e.symbols.write))     # 'write' 심볼의 주소, 속성 접근
저작자표시 비영리 변경금지 (새창열림)

'STUDY > CS' 카테고리의 다른 글

함수 호출 규약  (0) 2026.05.16
GDB (GNU Debugger)  (0) 2026.05.11
어셈블리어와 시스템콜  (0) 2026.05.10
리눅스 메모리 레이아웃  (0) 2026.05.10
2진수의 음수 표현 : 부호화-크기 표현, 보수  (0) 2026.03.23
'STUDY/CS' 카테고리의 다른 글
  • 함수 호출 규약
  • GDB (GNU Debugger)
  • 어셈블리어와 시스템콜
  • 리눅스 메모리 레이아웃
권 한
권 한
포렌식 같이 하실래요?
  • 권 한
    Kwon5an.log
    권 한
    • 분류 전체보기 (115) N
      • @Xpert (28)
        • 2025 (23)
        • 2026 (5)
      • Forensic (26)
        • Windows (7)
        • Linux (3)
        • Memory (4)
        • Network (0)
      • System Hacking (6)
      • Reversing (0)
      • STUDY (11)
        • 컴퓨터 구조 (2)
        • 운영체제 (0)
        • 알고리즘 자료구조 (0)
        • CS (7)
      • #컴공에서살아남기 (15) N
        • 201 C++ (3)
        • 201 보안기초 (12) N
        • 201 OSS (0)
      • Write-up (15)
        • H4CKING GAME (1)
        • DreamHack (12)
        • bandit (0)
      • PROGRAM (0)
        • K-shield.jr (0)
      • PROJECT (0)
      • 사담.생각.끄적끄적 (7)
  • 공지사항

    • Notice
  • 링크

    • DAILY BLOG
    • Velog
    • NOTION
  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.6
권 한
Pwntools
상단으로

티스토리툴바