
자동화된 포맷 문자열 취약점 분석 도구로, %s 또는 %p 지정자를 통해 스택, PIE, 카나리 누수를 발견하고 플래그 검색 기능을 제공합니다.
.d8888b. 888 888 888 8888888888 .d8888b.
d88P Y88b 888 888 888 888 d88P Y88b
888 888 888 888 888 888 Y88b.
888 888 888 888 8888888 "Y888b.
888 88888 888 888 888 888 "Y88b.
888 888 888 888 888 888 "888
Y88b d88P 888 Y88b. .d88P 888 Y88b d88P
"Y8888P88 88888888 "Y88888P" 888 "Y8888P"
By: DiegoAltF4
GLUFS는 포맷 문자열 취약점을 사용하여 누출(leaks)을 찾는 지루한 과정을 자동화합니다. 스택 누출, PIE 누출 및 카나리 누출을 찾을 수 있으며, 각 경우 누출을 제공하는 페이로드를 표시합니다. 또한, 누출에서 'flag' 문자열을 검색할 수 있는 모드가 포함되어 있습니다. 이 모드에서는 %s 또는 %p 지정자를 사용할 수 있습니다.
| 매개변수 | 정보 |
|---|---|
| -b | 이 옵션을 선택하여 공격할 바이너리를 지정합니다. |
| -max | 최대 테스트 값을 지정합니다. 범위: (min, max). 기본값: 40 |
| -min | 최소 테스트 값을 지정합니다. 범위: (min, max). 기본값: 1 |
| -ip | 원격 서버의 IP를 지정합니다. |
| -port | 원격 서버의 포트를 지정합니다. |
| -flag | 검색할 플래그의 시작 문자열을 지정합니다. |
| -arch | 아키텍처(32 또는 64)를 설정합니다. |
| --s | %p 대신 %s를 사용합니다. |
| --canary | 카나리 누출이 있는 위치를 찾습니다. |
| --leaks | 발견된 모든 누출을 출력합니다. |
| --pie | PIE 누출이 있는 위치를 찾습니다. |
| --stack | 스택 누출이 있는 위치를 찾습니다. |
| --v | 상세 모드를 설정합니다. |
이 예제에서는 GLUFS를 사용하여 PIE 및 카나리 누출을 얻습니다.
예제로 사용할 바이너리는 TryHackMe 룸 pwn101의 챌린지 7에 해당하는 것입니다. TryHackMe 룸 pwn101.
-b 옵션을 사용하여 바이너리를 지정하고, -min 옵션으로 반복의 시작 값을, -max로 반복의 종료 값을 지정합니다. 또한 카나리와 PIE에 대한 정보를 얻고자 합니다.
./glufs.py -b ./pwn107.pwn107 -min 5 -max 15 --pie --canary

이 예제에서는 GLUFS를 사용하여 플래그를 얻습니다.
해결할 챌린지는 247CTF 플랫폼의 Confused environment read입니다.
이 예제에서는 바이너리를 사용하지 않습니다. IP와 포트만 있습니다. 따라서 -ip 옵션으로 주소를, -port로 포트를, -flag로 찾을 플래그의 시작을 지정합니다. 또한 바이너리가 없으므로 아키텍처를 지정해야 하며, 이 경우 x86-64(-arch 64)입니다. 또한 -min으로 반복 시작을, -max로 반복 종료를 지정합니다. 또한 -s 옵션을 사용하여 %p 대신 %s를 사용합니다.
./glufs.py -ip 3bcbadabd1a7e914.247ctf.com -port 50387 -flag 247CTF -arch 64 -min 1 -max 200 --s

이 예제에서는 GLUFS를 사용하여 플래그를 얻습니다.
해결할 챌린지는 PicoCTF 플랫폼의 flag leak입니다.
이 예제에서는 -ip 옵션으로 서버 주소를, -port로 서버 포트를, -b로 바이너리를, -flag로 플래그의 시작을 지정하고, 마지막으로 -min과 -max로 반복의 시작과 끝을 지정합니다. --s 옵션을 지정하지 않으면 기본적으로 %p 형식이 사용됩니다.
./glufs.py -ip saturn.picoctf.net -port 50563 -b ./vuln -flag picoCTF -min 20 -max 200

git clone https://github.com/Diego-AltF4/GLUFS.git
cd GLUFS/
pip3 install -r requirements.txt
chmod +x ./glufs.py
코드를 수정하여 바이너리/챌린지에 맞게 조정하는 것이 매우 중요합니다. 이를 위해 코드에는 두 개의 구분된 섹션이 있으며, 포맷 문자열 누출을 얻고 페이로드를 보낼 시기를 구성하기 위해 변경해야 합니다.
예시: 위에서 설명한 picoCTF 챌린지의 경우 다음 구성이 사용됩니다:
#######################################################################
# This is the part that you must modify to fit your binary. #
#######################################################################
p.sendlineafter(b'>>', payload)
p.recvuntil(b'-')
leak = p.recv().strip(b'\n')
#print(leak) ## For debugging errors
#######################################################################