CTF란 무엇인가?
CTF(Capture The Flag)는 사이버 보안 분야에서 진행되는 경쟁형 해킹 대회 형식이다. 참가자들은 다양한 보안 과제를 해결하여 숨겨진 '플래그(flag)' 값을 찾아내는 방식으로 점수를 획득하며, 최종적으로 가장 많은 점수를 얻은 팀이나 개인이 우승하게 된다.
이러한 대회는 암호학, 웹 보안, 역공학, 바이너리 익스플로잇, 포렌식 등 다양한 보안 기술을 요구한다. 실제 보안 전문가와 취업을 준비하는 사람들에게 실전 경험과 기술 스택 확장을 위한 중요한 플랫폼으로 자리 잡고 있다.
CTF 문제 해결 프로세스
1. 대회 규칙 및 문제 유형 파악
대회에 참여하기 전 반드시 공지된 규칙을 확인해야 한다. 특히 점수 산정 방식, 제출 방법, 시간 제한 등을 꼼꼼히 살펴보아야 한다. 일반적인 문제 유형은 다음과 같다:
- 웹 보안: SQL 인젝션, XSS, 파일 업로드 취약점 등의 웹 애플리케이션 취약점을 분석하고 공격하는 문제
- 암호학: 암호화 알고리즘을 분석하거나 특정 암호를 복호화하는 문제
- 역공학(RE): 제공된 실행 파일이나 앱을 분석해 내부 로직을 이해하고 플래그를 추출하는 문제
- PWN: 바이너리 프로그램의 버퍼 오버플로우나 포맷 스트링 버그 등을 이용해 권한을 탈취하는 문제
- Miscellaneous(MISC): 네트워크 패킷 분석, 스테가노그래피, 포렌식 등 기타 다양한 문제
2. 필수 도구 및 개발 환경 구성
문제 유형에 따라 필요한 도구들을 사전에 설치하고 설정해두는 것이 중요하다:
- Wireshark: MISC 문제 중 네트워크 트래픽 분석에 필수적인 도구로, 패킷 캡처 및 분석 기능 제공
- Burp Suite: 웹 취약점 테스트용 프록시 도구로 요청 가로채기, 자동 스캐닝 등 가능
- IDA Pro / Ghidra: 바이너리 코드를 분석해 어셈블리 코드나 소스 구조를 파악할 수 있는 역공학 도구
- GDB / PEDA: PWN 문제에서 프로그램 디버깅 및 메모리 상태 분석에 사용됨
- Python 및 라이브러리: 자동화 스크립트 작성에 매우 유용하며,
hashlib,pwntools,scapy,pyshark등의 모듈 활용 가능
3. 문제 분석 단계
문제를 받으면 첫 번째로 해야 할 일은 전체적인 구조를 파악하는 것이다. 예를 들어 웹 문제라면 해당 사이트의 기능, 입력 폼, URL 구조 등을 살펴보고, 파일이 주어졌다면 파일 형식과 내용을 분석한다.
4. 공략 계획 수립
각 문제 유형별로 접근 방법은 다르다:
웹 보안 문제
- SQL 인젝션:
' OR 1=1--같은 페이로드를 통해 로그인 우회 시도 - XSS:
<script>alert(1)</script>등을 입력해 클라이언트 사이드 스크립트 실행 여부 확인
암호학 문제
- 해시 크래킹: 주어진 MD5 또는 SHA 해시를 레인보우 테이블 혹은 사전 공격으로 복원
- RSA 공격: 공개키와 암호문만 주어졌을 때, 모듈러스를 소인수분해해 개인키를 복원
역공학 문제
- 실행 파일 분석: IDA Pro 등을 사용해 함수 호출 흐름, 조건 분기 등을 분석
- APK 분석: Apktool로 apk 파일을 디컴파일하여 소스 코드 및 리소스 확인
PWN 문제
- 버퍼 오버플로우: 입력 길이를 늘려 리턴 주소를 덮어씌우고 쉘코드 주소로 점프
- ROP(Return Oriented Programming): 가젯(gadget)들을 연결해 원하는 동작 수행
5. 실제 문제 해결
계획한 전략대로 도구와 스크립트를 활용해 문제를 해결한다. 이 과정에서는 반복적인 테스트와 수정 작업이 필요하며, 특히 PWN 문제에서는 정확한 오프셋 계산과 메모리 주소 조절이 중요하다.
6. 플래그 제출
성공적으로 문제를 해결하면 플래그 문자열이 나타난다. 일반적으로 flag{...} 또는 CTF{...} 형태로 되어 있으며, 이를 지정된 플랫폼에 제출하면 점수를 획득할 수 있다.
예제 코드
(1) Python을 이용한 MD5 해시 크래킹 (암호학 문제 예시)
import hashlib
def find_password(target_hash, wordlist):
for candidate in wordlist:
hashed = hashlib.md5(candidate.encode()).hexdigest()
if hashed == target_hash:
return candidate
return None
# 예제 해시 값
md5_value = "5d41402abc4b2a76b9719d911017c592"
dictionary = ["hello", "world", "test", "admin"]
result = find_password(md5_value, dictionary)
if result:
print(f"Found password: {result}")
else:
print("Password not found")
(2) PyShark를 활용한 FTP 로그인 정보 추출 (MISC 네트워크 분석 예시)
import pyshark
def extract_ftp_credentials(pcap_path):
packets = pyshark.FileCapture(pcap_path)
credentials = []
for pkt in packets:
try:
if hasattr(pkt, 'ftp'):
if 'USER' in str(pkt.ftp.get_field_value('request_command')):
username = pkt.ftp.get_field_value('request_arg')
elif 'PASS' in str(pkt.ftp.get_field_value('request_command')):
password = pkt.ftp.get_field_value('request_arg')
credentials.append((username, password))
except AttributeError:
continue
return credentials
# PCAP 파일 경로
traffic_file = 'sample.pcap'
creds = extract_ftp_credentials(traffic_file)
for user, passwd in creds:
print(f"[+] FTP Login Detected - Username: {user}, Password: {passwd}")
(3) 간단한 스택 오버플로우 익스플로잇 예시 (PWN 문제)
# 주의: 실제 환경에서는 ASLR, Canary, NX Bit 등의 보호 메커니즘이 활성화되어 있을 수 있음
from pwn import *
# vulnerable_program 실행 후 payload 전송
binary = process('./vuln_binary')
# 버퍼 크기 및 리턴 주소 위치 계산
buffer_size = 76
shellcode_addr = 0x0804a060 # 임의의 쉘코드 주소 (실제로는 leak 필요)
# Payload 생성
exploit = b"A" * buffer_size
exploit += p32(shellcode_addr) # EIP overwrite
# 전송
binary.sendline(exploit)
binary.interactive()
위의 설명과 예제 코드를 통해 CTF의 기본 개념과 문제 해결 과정을 이해할 수 있다. 실제 대회에서는 다양한 난이도와 새로운 기법들이 등장하므로 지속적인 학습과 연습이 필요하다.