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 를 설정 하여 예상 치 못 한 오 류 를 피해 야 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.