pwntools 사용 안내

0x01 pwntools?
pwntools 는 ctf 프레임 워 크 와 구멍 을 이용 한 개발 라 이브 러 리 로 Python 으로 개발 되 었 으 며, rapid 디자인 으로 사용자 가 exploit 를 간단 하고 빠르게 작성 할 수 있 도록 합 니 다.
pwntools 다운로드:https://pwntools.com/
문서 온라인:http://pwntools.readthedocs.io/en/latest/
현재 pwntools 는 python 2 를 지원 합 니 다. python 3 이 필요 하 다 면 python 3 - pwntools 도 있 습 니 다.설치 방법 은 사실 가장 간단 한 것 은 PYPI 를 사용 하 는 것 입 니 다. 다음 과 같 습 니 다.
sudo pip install pwntools

0x 02 사용 안내
대체적인 틀
홈 페이지 의 간단 한 사례
from pwn import *
context(arch = 'i386', os = 'linux')

r = remote('exploitme.example.com', 31337)
# EXPLOIT CODE GOES HERE
r.send(asm(shellcraft.sh()))
r.interactive()

기본적으로 이 형식 을 모방 하면 exp 를 쓸 수 있다.
from pwn import *

pwntools 모듈 가 져 오기
context(arch = 'i386', os = 'linux')

대상 기 정보 설정
r = remote('exploitme.example.com', 31337)

원 격 연결, url 또는 ip 를 주소 로 만 든 다음 포트 를 가리 키 는 데 사용 합 니 다.
로 컬 파일 만 사용 할 수 있 습 니 다. 디 버 깅 할 때 편리 합 니 다.
r = process("./test")

test 는 파일 이름 입 니 다. 원 격 과 로 컬 을 바 꾸 는 것 이 편리 합 니 다.
asm(shellcraft.sh())

asm () 함 수 는 문자열 을 매개 변수 로 받 아 외환 인 코딩 을 받 는 기계 코드 입 니 다.예 를 들 면
>>> asm('mov eax, 0')
'\xb8\x00\x00\x00\x00'

셸 크 래 프 트 모듈 은 셸 코드 의 모듈 로 셸 코드 를 만 드 는 함 수 를 포함 합 니 다.
그 중의 하위 모듈 성명 구조, 예 를 들 어 셸 크 래 프 트. arm 은 ARM 구조 이 고 셸 크 래 프 트. amd 64 는 AMD 64 구조 이 며 셸 크 래 프 트. i386 은 Intel 80386 구조 이 며 셸 크 래 프 트. comon 은 모든 구조 가 통용 된다.
여기 셸 크 래 프 트. sh () 는 / bin / sh 를 실행 하 는 셸 코드 입 니 다.
r. send () 셸 코드 를 원 격 연결 로 보 내기
마지막 으로
r.interactive()

사용자 에 게 제어 권 을 맡 기 면 열 린 셸 을 사용 할 수 있 습 니 다.
컨 텍스트 설정context pwntools 가 환경 을 설정 하 는 기능 입 니 다.많은 경우 에 바 이 너 리 파일 의 상황 이 다 르 기 때문에 우 리 는 환경 설정 을 해 야 exp 를 정상적으로 실행 할 수 있 습 니 다. 예 를 들 어 어 어 셈 블 리 를 해 야 하지만 32 의 어 셈 블 리 와 64 의 어 셈 블 리 가 다 르 기 때문에 context 를 설정 하지 않 으 면 문제 가 발생 할 수 있 습 니 다.
일반적으로 우리 가 context 를 설정 하려 면 간단 한 한 마디 만 필요 합 니 다.
context(os='linux', arch='amd64', log_level='debug')

이 말 은 1. os 설정 시스템 은 Liux 시스템 이 고 ctf 문 제 를 완성 할 때 대부분 Pwn 문제 의 시스템 은 Liux 2. arch 설정 구 조 는 amd 64 이 며 64 비트 모델 로 간단하게 설정 할 수 있 으 며 해당 하 는 32 비트 모델 은 'i386' 3. loglevel 로그 출력 등급 을 debug 로 설정 합 니 다. 이 말 은 디 버 깅 할 때 보통 설정 합 니 다. 그러면 pwntools 는 완전한 io 과정 을 인쇄 하여 디 버 깅 을 더욱 편리 하 게 합 니 다. CTF 문 제 를 완성 할 때 IO 와 관련 된 오류 가 발생 하지 않도록 할 수 있 습 니 다.
데이터 패키지
데이터 패키지, 곧 전체 수 치 를 32 비트 또는 64 비트 주소 와 같은 표현 방식 으로 바 꿀 것 입 니 다. 예 를 들 어 0x 400010 은 \ x10 \ x00 \ x40 과 같이 우리 의 구조 payload 를 편리 하 게 만 들 것 입 니 다.
용법: * p32/p64: 하나의 정 수 를 포장 하고 각각 32 비트 또는 64 비트 로 포장 합 니 다 * u32/u64: 문자열 을 풀 고 정 수 를 얻 습 니 다.
p 대응 pack, 포장, u 대응 unpack, 해 지, 기억 하기 쉽 습 니 다.
payload = p32(0xdeadbeef) # pack 32 bits number

데이터 출력
만약 에 정 보 를 출력 할 필요 가 있다 면 pwntools 가 가지 고 있 는 것 을 사용 하 는 것 이 좋 습 니 다. pwntools 의 원래 형식 과 일치 하기 때문에 보기 도 편 하고 용법 도 좋 습 니 다.
some_str = "hello, world"
log.info(some_str)

그 중의 info 대 표 는 log 등급 이 고 다른 log 등급 도 사용 할 수 있 습 니 다.
Cyclic Pattern
Cyclic pattern 은 강력 한 기능 입 니 다. 아마도 pwntools 를 사용 하여 pattern 을 만 드 는 것 입 니 다. pattern 은 하나의 문자열 을 말 합 니 다. 그 중의 일부 데 이 터 를 통 해 그 가 문자열 에 있 는 위 치 를 찾 을 수 있 습 니 다.
스 택 넘 침 문 제 를 완성 할 때 pattern 을 사용 하면 넘 침 점 을 계산 하 는 시간 을 크게 줄 일 수 있 습 니 다.사용법:
cyclic(0x100) #     0x100   pattern,         
cyclic_find(0x61616161) #       pattern    
cyclic_find('aaaa') #                

예 를 들 어 우리 가 스 택 에 넘 칠 때 먼저 구조 cyclic(0x100) 나 긴 길이 의 pattern 을 만들어 입력 을 한다. 입력 한 후에 pc 의 값 이 0x 61616161 맛 이 변 했다. 그러면 우 리 는 cyclic_find(0x61616161) 을 통 해 어느 바이트 부터 PC 레지스터 를 제어 하고 불필요 한 계산 을 피 할 수 있다.
어 셈 블 리 와 셸 코드
때때로 우 리 는 exp 를 쓸 때 간단 한 셸 코드 를 사용 해 야 한다. pwntools 는 간단 한 셸 코드 에 대한 지원 을 제공한다.우선, 가장 간단 한 셸 코드, 즉 호출 /bin/sh 은 셸 크 래 프 트 를 통 해 얻 을 수 있 습 니 다.
각 플랫폼, 특히 32 비트 와 64 비트 의 셸 코드 가 다 르 기 때문에 context 를 설정 하 는 것 이 좋 습 니 다.
print(shellcraft.sh()) #    shellcode

그러나 지금 우리 가 본 셸 코드 는 어 셈 블 리 코드 로 사용 할 수 있 는 기계 코드 가 아니 기 때문에 어 셈 블 리 를 한 번 더 해 야 합 니 다.
print(asm(shellcraft.sh())) #        shellcode

asm 는 어 셈 블 리 코드 를 어 셈 블 리 할 수 있 지만 pwntools 의 현재 asm 실현 에는 아직도 일부 결함 이 있 습 니 다. 예 를 들 어 상대 적 인 점프 를 지원 하지 못 하 는 등 간단 한 어 셈 블 리 작업 만 할 수 있 습 니 다.좀 더 복잡 한 어 셈 블 리 기능 이 필요 하 다 면 keystone-engine 프로젝트 를 사용 할 수 있 고, 여 기 는 더 이상 군말 하지 않 겠 다.
asm 도 구조 와 관련 이 있 기 때문에 반드시 context 를 설정 하여 예상 치 못 한 오 류 를 피해 야 합 니 다.

좋은 웹페이지 즐겨찾기