[Tool] Pwntool 설치 및 사용법

2022. 2. 7. 23:46

시스템 해킹을 진행하다 보면 많은 tool이 필요하다. 정수를 리틀엔디안의 패킷으로 바꾸는 함수 등 시스템 해킹에 특히나 자주 쓰이는 함수들이 있다. 이런 편리한 함수들을 모아서 파이썬 라이브러리로 만들어 둔 것이 pwntool이다. 이것을 사용하게 된다면 훨신 편리하게 해킹을 진행할 수 있을 것이다. 

 

 

pwntools에 관한 문서이다. 읽어보면 좋은 정보를 얻을 수 있을 것이다. 

https://docs.pwntools.com/en/stable/

 

pwntools — pwntools 4.7.0 documentation

© Copyright 2016, Gallopsled et al. Revision 67b28491.

docs.pwntools.com

 

설치 방법

pwntools은 github에서 공유하고 있다. 

https://github.com/Gallopsled/pwntools

 

GitHub - Gallopsled/pwntools: CTF framework and exploit development library

CTF framework and exploit development library. Contribute to Gallopsled/pwntools development by creating an account on GitHub.

github.com

 

apt-get update
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

위의 코드를 입력해서 설치를 진행해준다. 

 

설치가 완료되었으면 python을 실행시킨 후 모듈을 불러준다.

 

pwntools 사용법

 

1. process & remote

process는 로컬 바이너리를 대상으로 익스플로잇을 할때, remote는 원격 서버를 대상으로 익스플로잇을 할 때 사용한다. process는 익스플로잇을 테스트할 때, remote는 실제로 실행할 때 사용한다. 

 

from pwn import *
p = process('./test') #로컬의 test에 익스플로잇 실행
p = remote('example.com', 31331) #example.com의 31331 포트에서 익스플로잇 수행

 

2. send

send는 데이터를 프로세스에 전송하기 위해 사용한다. 

p = process('./test')

p.send('data') : 데이터를 입력한다.

p.sendline('data') : 데이터에 '\n'을 추가해서 입력한다.

p.sendafter('output', 'data'): output 내용이 출력되면 data를 입력

p.sendlineafter('output', 'data) : output 내용이 출력된다면 data + '\n'을 입력

 

3. recv

recv는 프로세스에서 데이터를 받기 위해 사용합니다,. 

p.recv(n) :n byte 만큼 데이터를 받습니다. 만약 n byte보다 짧은 데이터를 받아도 오류가 나지 않습니다.

p.recvn(n) : n byte만큼 데이터를 받습니다. 만약 n byte보다 짧은 데이터를 받으면 오류가 발생합니다 .

p.recvline() : 데이터를 개행 문자를 만날 때까지 받습니다.

p.recvuntil('data') : 'data'가 출력될 때까지 데이터를 받습니다. 

p.recvall() : 프로세스가 종료될 때까지 데이터를 받습니다. 

+) 데이터는 받으면 변수에 저장을 해주어야 합니다. ex) date = recv(1024)

 

4. packing & unpacking

어떠한 값을 리틀 엔디언의 바이트 배열로 변경하거나 역의 과정을 거쳐야합니다. 이때 사용할 수 있는 함수입니다. 

>>> from pwn import *

>>> a = "ABCDEFGH"
>>> print(hex(u64(a))) 
0x4847464544434241
>>> print((p64(0x4847464544434241)))
b'ABCDEFGH'

p는 packing u는 unpacking을 의미한다. 그리고 u와 p 뒤에 붙는 수는 바이트를 의미하며, 64는 8자리 문자열을 32는 4자리 문자열을 의미한다. 

 

5. interactive

셸을 획득했거나, 익스플로잇의 특정 상황에 직접 입력을 주면서 출력을 확인하고 싶을 때 사용하는 함수이다. 호출하면 터미널로 프로세스에 데이터를 입력할 수 있다. 

 

6. ELF 

익스플로잇에 사용되는 각종 정보가 삽입되어 있다. 

 

7. context.log

디버그의 편의를 돕기 위한 로깅 기능이다. 로그 레벨을 context.log_level 변수로 조절할 수 있다.

from pwn import *
context.log_level = 'error' # 에러만 출력
context.log_level = 'debug' # 대상 프로세스와 익스플로잇간에 오가는 모든 데이터를 화면에 출력
context.log_level = 'info'  # 비교적 중요한 정보들만 출력

 

8. shellcraft

쉘 코드를 쉽게 꺼내 쓸 수 있게 해준다. 

from pwn import *
context.arch = 'amd64' # 대상 아키텍처 x86-64
code = shellcraft.sh() # 셸을 실행하는 셸 코드 
print(code)

※ context.arch: 아키텍쳐 정보를 프로그래머가 지정할 때 사용하는 것이다. amd64, i386, arm 등으로 지정할 수 있다.

 

9. asm 

어셈블 기능을 실행시켜 줍니다. 이때도 아키텍쳐 정보를 미리 지정해야합니다.  

'Linux' 카테고리의 다른 글

[Linux] 3. 셸을 능숙하게 다루는 방법  (0) 2022.08.10
[Linux] 2. 셸이란 무엇인가?  (0) 2022.08.10
[Linux] 1장. 리눅스 설치하기  (0) 2022.08.09
[Tool] pwndbg 설치 & 사용법  (0) 2022.02.07
[Tool] DBG(디버거) 사용법  (0) 2022.02.07

BELATED ARTICLES

more