ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • pwntools
    CTF/TOOL 2021. 1. 8. 04:01

    PRELIMINARY 서론


    pwntools는 CTF를 위해 최적화된 기능들을 제공하는 python 라이브러리이다. 주어진 바이너리에 대해 분석하고, 호스트와 상호작용하는 등 다양한 작업을 수행할 수 있다.

     

    다음 명령어를 터미널에 입력해 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 --upgrade pwntools

     

    pwntools를 python 코드에서 사용하기 위해서는 pwn을 import 해주면 된다.

    from pwn import *

    pwntools 라이브러리에는 다양한 함수와 기능들이 존재하고, 아래에는 자주 사용하는 것들을 따로 정리해 보았다.

    Connection 연결


    p = remote(host , port) # 원격 호스트에 TCP, UDP로 통신
    
    p = process("./binary") # 로컬 프로세스를 실행하여 통신
    
    p = ssh(user, host, post, password) # ssh 서버에 접속해 통신
    
    p.interactive() # 호스트와 상호작용하기 위한 함수

    Input / Output 입출력


    p.recv() # 수신
    p.recv(3) # 3byte 만큼 수신
    
    p.recvuntil("l0tus") # "l0tus"를 받을 때까지 수신
    
    p.send(payload) # payload를 송신
    
    p.sendline(payload) # payload + '\n'을 송신
    
    p.sendlineafter("l0tus", payload) # "l0tus"까지 수신하고, payload를 송신 

    Packing 패킹


    p8(data) # 8-bit integer를 little-endian으로 pack
    p16(data) # 16-bit 
    p32(data) # 32-bit
    p64(data) # 64-bit
    
    u8(data) # 8-bit little-endian data를 unpack
    u16(data) # 16-bit
    u32(data) # 32-bit
    u64(data) # 64-bit

    ELF


    binary = "./l0tus"
    
    e = ELF(binary) # ELF 파일을 다루기 위한 객체 호출
    
    e.plt["read"] # binary에 존재하는 PLT 주소
    
    e.got["read"] # binary에 존재하는 GOT 주소
    
    e.symbols["main"] # binary에 존재하는 함수/전역 변수의 주소
    
    l = ELF('./libc.so.6') # 라이브러리 객체 호출
    
    binsh = next(l.search(b"/bin/sh\x00")) # libc에 존재하는 /bin/sh 문자열의 offset

    ROP


    e = ELF(binary)
    r = ROP(e) # ROP를 위한 객체 호출
    
    prdi = (r.find_gadget(['pop rdi', 'ret']))[0] # binary에 존재하는 pop rdi, ret 가젯의 주소

    FmtStr


    def send_payload(payload): # FmtStr 객체가 사용할 payload 출력 함수
    	log.info("payload = %s" % repr(payload))
    	p.sendline(payload)
    
    f = FmtStr(send_payload, offset = 2) # FmtStr을 위한 객체 호출, 스택 포인터와의 offset을 인자로 받음
    
    dest = e.symbols["flag"]
    src = e.got["exit"]
    
    f.write(dest, src) # dest에 src를 overwrite하는 payload 작성
    
    f.execute_writes() # 지금까지 작성한 payload를 출력

    MISC


    context.log_level = 'debug' # 디버그 메세지를 화면에 출력
    
    context.binary = "./binary" # 대상 바이너리의 환경과 동기화
    

    SHELLCODE


    shellcode = asm(shellcraft.execve("/bin/sh",0,0)) # execve("/bin/sh")를 호출하는 쉘코드
    
    asm('mov rax, 0') # 어셈블리를 바이너리로 변환
    disasm(b'\xba\x00\x00\x00') # 바이너리를 어셈블리로 변환

    'CTF > TOOL' 카테고리의 다른 글

    Oneshot gadget  (0) 2021.01.08
    pwngdb  (0) 2021.01.08
    WSL2  (0) 2021.01.08

    댓글

Designed by Tistory.