Hacking & Security/System Hacking

DreamHack : Stage3 - pwntools

희디 2022. 2. 6. 01:49

파이썬과 파이프(|)를 이용한 익스플로잇

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

익스플로잇이 조금만 복잡해져도 위와 같은 방식은 사용하기 어렵다. 

그래서 해커들은 펄, 파이썬, C언어 등으로 익스플로잇 스크립트 또는 바이너리를 제작하여 사용하였다. 

 

Figure2는 socket모듈을 사용한 초기 파이썬 익스플로잇 스크립트의 예이다. 

파이썬으로 여러개의 익스플로잇 스크립트를 작성하다 보면, 자주 사용하게 되는 함수들이 있다. 

1) 패킹 함수(정수를 리틀 엔디언의 바이트 배열로 바꿈)

2) 언패킹 함수(패킹 함수의 역)

get_shell( ) 함수의 주소를 리틀 엔디언을 적용하여 변환할 수 있다. 

 

하지만 이러한 함수들을 반복적으로 구현하는 것은 비효율적. 

=> 파이썬 모듈 pwntools 탄생

익스플로잇 스크립트 

<pwntools 설치>

 

python3도 같이 깔아주었다. 

 

<pwntools API>

process 함수

 : 익스플로잇을 로컬 바이너리를 대상으로 할 때 사용하는 함수

 : 익스플로잇을 테스트 & 디버깅

 

remote 함수

 : 원격 서버를 대상으로 할 때 사용하는 함수 

 : 대상 서버를 실제로 공격

send 함수 

 : 데이터를 프로세스에 전송하기 위해 사용됨. 

recv

 : 프로세스에서 데이터를 받기 위해 사용됨. 

 

** recv( ) VS recvn( ) ** 

recv() recvn()
최대 n 바이트 받는 것으로, 그 만큼을 받지 못해도 에러발생은 안된다.  정확히 n바이트의 데이터를 못 받으면 계속 기다린다. 

 

# packing & unpacking 

 

엔디언(Endianness)은 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻하며, 바이트를 배열하는 방법을 특히 바이트 순서(Byte order)라고 한다. 기존의 바이트 배열의 역순을 리틀 엔디언이라고 한다. 

(하위 바이트 연산할 때 쓰이면 좋음) 

 

pwntools에 어떤 값을 리틀 엔디언의 바이트 배열로 변경하거나 역의 과정을 거쳐야 하는 함수들이 있다. 

 

# interactive 

 

셸을 획득했거나 익스플로잇의 특정 상황에 직접 입력을 주면서 출력을 확인하고 싶을 때 사용하는 함수이다. 

호출 후 터미널로 프로세스에 데이터를 입력하고 프로세스의 출력을 확인할 수 있다. 

 

# ELF 

 ELF 헤더에는 익스플로잇에 사용될 수 있는 각종 정보가 기록되어 있다. 

 

# context.log 

pwntools에 있는 디버그의 편의를 돕는 로깅 기능이 있다. 

로그 레벨은 context.log_level 변수로 조절할 수 있다. 

 

# context.arch 

 pwntools는 셸코드를 생성하거나 코드를 어셈블, 디스어셈블하는 기능 등을 가지고 있는데 이들은 공격 대상의 아키텍처에 영향을 받는다. 

아키텍처 정보를 프로그래머가 지정할 수 있게 하며, 이 값에 따라 몇몇 함수들의 동작이 달라진다. 

 

# shellcraft 

pwntools에는 자주 사용되는 셸 코드들이 저장되어 있어서, 공격에 필요한 셸 코드를 쉽게 꺼내 쓸 수 있게 해준다. 매우 편리한 기능이지만 정적으로 생성된 셸 코드는 셸 코드가 실행될 때의 메모리 상태를 반영하지 못한다. 또한, 프로그램에 따라 입력할 수 있는 셸 코드의 길이나, 구성 가능한 문자의 종류에 제한이 있을 수 있는데, 이런 조건들도 반영하기 어렵다. 따라서 제약 조건이 존재하는 상황에서는 직접 셸 코드를 작성하는 것이 좋다.

https://docs.pwntools.com/en/stable/shellcraft/amd64.html

 

pwnlib.shellcraft.amd64 — Shellcode for AMD64 — pwntools 4.7.0 documentation

Parameters: key (int,str) – XOR key either as a 8-byte integer, If a string, length must be a power of two, and not longer than 8 bytes. Alternately, may be a register. address (int) – Address of the data (e.g. 0xdead0000, ‘esp’) count (int) – Nu

docs.pwntools.com

여기에 셸코드가 많으니 참고하자. 

 

# asm 

: 어셈블리 코드를 기계어로 어셈블