[포너블] pwntools

Chris Kim·2024년 10월 11일

시스템해킹

목록 보기
4/33

1. 서론

등장배경

아래와 같은 코드로 파이썬을 통해 공격 페이로드 생성, 프로그램 전달로 익스플로잇 수행이 가능하다.

$ (python -c "print 'A'*0x30 + 'B'*0x8 + '\xa7\x05\x40\x00\x00\x00\x00\x00'";cat)| ./rao

근데 사실상 한줄로 모든걸 수행하기는 어렵다. 하단 코드는 socket 모듈을 사용한 초기 파이썬 익스플로잇 스크립트의 예다.

#!/usr/bin/env python2
import socket

# Remote host and port
RHOST = '127.0.0.1'
RPORT = 31337

# Make TCP connection
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((RHOST, RPORT))

# Build payload
payload = ''
payload += 'Socket script'
payload += '\n'

# Send payload
s.send(payload)

# Print received data
data = s.recv(1024)
print 'Received: {0}'.format(data)

리틀 엔디언 바이트 배열로 바꾸고 이를 역으로 수행하는 패킹/언패킹 함수들 처럼 자주 쓰이는 함수를 사용할 때마다 정의하는 것은 효율적이지 않다. 그래서 이런 함수들을 모아놓은 파이썬 모듈이 있으니 pwntools다.

pwntools의 공식문서는 여기다.

간단하게 앞으로 자주 쓸 함수를 몇 개 살펴보자면
1. process & remote(전자는 익스플로잇 테스트와 디버깅을/후자는 대상 서버를 실제로 공격하기 위해 사용)
2. send(데이터를 프로세스에 전송)
3. recv(프로세스에서 데이터를 받기 위해 사용, recv(n)recvn(n)은 다르다.)
4. packing & unpacking(p32,p62,u32,u64)
5. interactinve(셸을 획득했거나, 익스플로잇의 특정 상황에 직접 입력을 주면서 출력을 확인하고 싶을 때 사용하는 함수)
6. ELF (e = ELF('./test')) plt got
7. context.log (context.log_level 변수로 로그 레벨을 조절할 수 있다.)

from pwn import *
context.log_level = 'error' # 에러만 출력
context.log_level = 'debug' # 대상 프로세스와 익스플로잇간에 오가는 모든 데이터를 화면에 출력
context.log_level = 'info'  # 비교적 중요한 정보들만 출력
  1. context.arch(아키텍처 정보를 프로그래머가 지정할 수있음)
from pwn import *
context.arch = "amd64" # x86-64 아키텍처
context.arch = "i386"  # x86 아키텍처
context.arch = "arm"   # arm 아키텍처
  1. shellcraft: pwntools에서는 자주 사용되는 셸 코드들이 있다. 매우 편리하지만 정적으로 생성된 셸 코드는 셸 코드가 실행될 때의 메모리 상태를 반영하지 못한다. 또한 프로그램에 따라 입력할 수 있는 셸 코드의 길이나, 구성 가능한 문자의 종류에 제한이 있을 수 있는데, 이런 조건들도 반영하기 어렵다. 따라서 제약 조건이 존재하는 상황에서는 직접 셸 코드를 작성하는 것이 좋다.
    여기 에서 x86-64를 대상으로 생성할 수 있는 셸 코드들을 볼 수 있다.

  2. asm: 어셈블 기능. 아키텍처를 미리 지정해야한다.

profile
회계+IT=???

0개의 댓글