Hacktaeon2026
title: “[CTF] HackTheon Sejong 2026 문제 풀이” date: 2026-04-25 22:30:00 +0900 categories: [CTF/Wargame] tags: [Web, SQLi, Write-up, Hacking] —
이번 포스팅에서는 헥테온-초급 부문에 참가하여 푼 문제의 write-up을 다룹니다.
웹 해킹의 기초 중 하나인 SQL Injection을 활용해 인증을 우회하고, 관리자 계정에 숨겨진 플래그(Flag)를 획득하는 과정을 정리해 보겠습니다.
🚩 Challenge Goal
제공된 소스 코드를 분석하여 데이터베이스 내 admin 계정의 secret 컬럼에 저장된 플래그를 탈취하는 것이 목표입니다.
🔍 환경 분석
1. 데이터베이스 구조 (init.sql)
데이터베이스 초기화 파일을 통해 테이블 구조와 우리가 찾아야 할 목표를 확인했습니다.
1
2
3
4
5
6
7
8
9
10
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
password TEXT NOT NULL,
role TEXT NOT NULL,
secret TEXT
);
INSERT INTO users (username, password, role, secret)
VALUES ('admin', '...', 'admin', 'FLAG{...}');
- Target:
users테이블의username이 ‘admin’인 행의secret값. - Environment: SQLite 엔진 사용.
2. 소스 코드 분석 (app.py)
로그인 로직을 담당하는 index() 함수에서 사용자 입력값이 처리되는 방식을 살펴보았습니다.
1
2
3
4
5
6
7
8
9
10
11
12
@app.route("/", methods=["GET", "POST"])
def index():
# ... (생략) ...
if request.method == "POST":
username = request.form.get("username", "")
password = request.form.get("password", "")
# 취약점이 발생하는 지점
query = (
"SELECT username, role, secret FROM users "
f"WHERE username = '{username}' AND password = '{password}'"
)
- Vulnerability: f-string을 사용하여 사용자의 입력을 쿼리문에 그대로 삽입하고 있습니다.
- Risk: 사용자가 입력하는 특수문자(따옴표, 주석 기호 등)가 SQL 실행 구조를 변조할 수 있습니다.
💡 공격 설계 (Exploitation)
관리자의 비밀번호를 모르더라도, SQL의 주석 처리(Comment) 기능을 이용하면 인증 로직을 우회할 수 있습니다.
1. 페이로드(Payload) 작성
- Username:
admin' -- - Password: (임의의 값 입력)
2. 작동 원리
위 페이로드가 입력되면 서버에서 다음과 같은 쿼리가 완성됩니다.
1
SELECT username, role, secret FROM users WHERE username = 'admin' --' AND password = '...'
admin'에 의해username조건절이 닫힙니다.--기호가 SQLite에서 그 뒤의 모든 쿼리(비밀번호 체크 부분)를 주석으로 처리하여 무시하게 만듭니다.- 결과적으로 DB는
username이 ‘admin’인 데이터만 찾아 반환하게 됩니다.
🚩 결과 확인
준비한 페이로드를 로그인 폼에 입력한 결과, 성공적으로 관리자 권한을 획득하여 플래그 페이지로 리다이렉트되었습니다.
📝 마치며
이 문제는 SQL Injection의 가장 전형적인 형태인 인증 우회(Authentication Bypass)를 다루고 있습니다.
보안 사고를 방지하기 위해서는 f-string이나 문자열 더하기 방식 대신, 파라미터화된 쿼리(Parameterized Query)를 사용하는 것이 필수적임을 다시 한번 느꼈습니다. 이번 실습을 바탕으로 다음에는 좀 더 난이도 높은 Blind SQL Injection 문제에도 도전해 보고 싶습니다.
이번 HackTheon 2026 CTF에서 만난 Immutable 문제는 “불변의 값을 어떻게 바꿀 것인가?”라는 주제의 시스템 해킹 문제였습니다. 전공 지식을 활용해 서버의 메모리를 조작하고 플래그를 획득한 과정을 정리해 보고자 합니다.
🚩 문제 분석: 불변의 벽 확인
먼저 제공된 실행 파일의 보호 기법을 확인했습니다. 쟁쟁한 대회답게 모든 보안 옵션이 켜져 있는 ‘풀 옵션’ 상태였습니다.
- 보호 기법: Full RELRO, Canary, NX, PIE Enabled
- 힌트: “How to change the immutable value?”
이름처럼 프로그램 내부에는 수정할 수 없는(Immutable) 상수가 존재했고, 이를 사용자의 입력값으로 변조하여 조건문을 통과하는 것이 핵심이었습니다.
🔍 분석 과정: GDB를 이용한 리버싱
소스 코드가 없는 바이너리였기에 GDB와 ltrace를 활용해 내부 로직을 파헤쳤습니다. PIE가 적용되어 있어 start 명령어로 베이스 주소를 확인한 뒤 브레이크포인트를 설정했습니다.
핵심 로직 파악
- Vulnerability:
scanf("%s", [rbp-0x90])에서 입력 길이 제한이 없어 Stack Buffer Overflow가 발생합니다. - Goal:
cmp eax, 0xdeadbeef명령어가 실행될 때,rbp-0x10위치의 값을0xdeadbeef로 만들어야 합니다.
메모리 거리 계산
GDB 메모리 덤프(x/40gx $rsp)를 통해 입력 시작점과 목표 변수 사이의 거리를 계산했습니다.
- 입력 시작점:
rbp-0x90 - 목표 지점:
rbp-0x10 - 거리:
0x90 - 0x10 = 0x80(128 bytes)
즉, 128바이트의 Dummy 값을 채우면 그 바로 뒤 4바이트를 우리가 원하는 값으로 덮어쓸 수 있습니다.
💡 공격 수행 (Exploitation)
계산된 거리와 리틀 엔디언 방식을 적용하여 파이썬으로 최종 페이로드를 작성했습니다. scanf 이후에도 셸 세션이 끊기지 않도록 cat 명령어를 조합했습니다.
1
2
# 서버 공격용 최종 페이로드
(python3 -c "import sys; sys.stdout.buffer.write(b'A'*128 + b'\xef\xbe\xad\xde\n')"; cat) | nc 3.37.44.62 33201
🚩 결과: 셸 획득 및 플래그 확인
공격 성공 후 서버의 권한을 얻어 ls로 파일 목록을 확인하고 cat flag를 통해 최종 플래그를 획득했습니다.
💡 느낀 점과 향후 계획
처음에는 PIE와 Canary 때문에 당황했지만, 메모리 맵을 확인하고 주소를 계산하며 하나씩 뜯어보니 정답이 보였습니다. 특히 스택 버퍼 오버플로우(Stack Buffer Overflow) 취약점이 실제 메모리 구조에서 어떻게 변수를 변조하는지 직접 확인한 과정이 매우 값진 경험이었습니다.
이번 성공에 안주하지 않고, 앞으로는 더 복잡한 보호 기법을 우회하는 기술들을 공부하여 정보보안 전문가로서의 역량을 키워나가고 싶습니다.
HackTheon 2026 CTF의 리버싱 분야 문제인 Recover It!을 해결했습니다.
랜섬웨어에 의해 플래그가 암호화되었다는 설정이었는데, 문제 힌트에서 “해커가 멍청한 것 같다”는 점을 강조한 것이 문제 해결의 결정적인 열쇠였습니다.
🚩 문제 분석: 해커의 실수 찾기
제공된 파일인 prob는 확장자가 없었지만, 분석 결과 리눅스에서 실행되는 ELF 파일임을 확인할 수 있었습니다.
해커가 암호화에 사용한 로직을 파악하기 위해 Dogbolt와 같은 디컴파일 도구를 활용하여 main 함수를 분석해 보았습니다.
분석 결과
- 입력 길이 체크: 사용자의 입력값이 정확히 64글자인지 확인합니다.
- 암호화 알고리즘: 입력값의 각 바이트를
index + 103값과 XOR(^) 연산합니다. - 비교 대상: 암호화된 결과를 바이너리 내부에 저장된
cmptable데이터와 비교합니다.
단순한 XOR 연산을 사용했다는 점에서 해커가 ‘멍청하다’는 힌트의 의미를 이해할 수 있었습니다. XOR 연산은 같은 값으로 다시 연산하면 원래 데이터로 돌아오는 특성이 있기 때문입니다.
🔍 문제 해결 과정: 데이터 복구
이제 바이너리 내부에 숨겨진 cmptable 데이터와 역연산을 수행할 차례입니다.
1. 데이터 추출
HxD 에디터를 통해 cmptable 주소에 위치한 64바이트의 암호화된 데이터를 확보했습니다.
2. 복구 스크립트 작성
파이썬을 이용해 추출한 데이터를 원문으로 되돌리는 복구 스크립트를 작성했습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 추출한 cmptable 데이터 (64바이트)
encoded_data = [
0x55, 0x5A, 0x0A, 0x59, 0x5F, 0x09, 0x55, 0x5F, 0x56, 0x14, 0x43, 0x4A, 0x43, 0x44, 0x11, 0x14,
0x41, 0x48, 0x4C, 0x1E, 0x42, 0x1A, 0x19, 0x1C, 0x1C, 0xB9, 0xE3, 0xE3, 0xBA, 0xE5, 0xE7, 0xB1,
0xB6, 0xEC, 0xBF, 0xE8, 0xB2, 0xBD, 0xBA, 0xBB, 0xEB, 0xA6, 0xF3, 0xA1, 0xF1, 0xA4, 0xA4, 0xA0,
0xF4, 0xAC, 0xA0, 0xF9, 0xFF, 0xA5, 0xA9, 0xA8, 0xAD, 0x94, 0xC7, 0x97, 0x97, 0x91, 0xC6, 0x95
]
flag_content = ""
for i in range(len(encoded_data)):
# 암호화 시 사용된 i + 103을 다시 XOR 하여 복구
flag_content += chr(encoded_data[i] ^ (i + 103))
print(f"Final Flag: hacktheon2026}")
💡 결과 및 느낀 점
스크립트를 실행하자 암호화되었던 플래그가 선명하게 나타났습니다.
이번 문제는 리버싱의 기초적인 흐름을 익히기에 아주 좋은 문제였습니다. 암호화 알고리즘 자체는 단순했지만, 바이너리 내에서 정확한 데이터를 찾아내고 이를 코드로 옮겨 복구하는 과정이 매우 흥미로웠습니다. 앞으로도 다양한 암호화 기법을 리버싱 관점에서 분석해 보고 싶습니다.
HackTheon 2026 예선 문제 중 AI 분야의 VOICE CLONE 문제를 해결했습니다.
단순히 파일 속 정보를 찾는 것을 넘어, 최근 보안계의 화두인 AI 음성 합성(Deepfake) 기술을 역이용해야 하는 흥미로운 문제였습니다. 정보보안 전공자로서 AI 모델의 메커니즘을 직접 체감해 볼 수 있었던 과정을 정리해 봅니다.
🚩 문제 분석: 목소리를 훔쳐라
문제 설명에는 타겟의 목소리 샘플 5개(sample_001.wav ~ sample_005.wav)가 주어지며, 서버가 요구하는 특정 문장을 해당 목소리로 완벽하게 복제해낼 것을 요구합니다.
- Speaker Similarity (목소리 유사도): 0.8 이상 달성 필요
- Text Similarity (텍스트 일치도): 0.8 이상 달성 필요
처음에는 Whisper 모델을 이용해 샘플에 숨겨진 메시지를 찾으려 했으나, 이는 단순한 목소리 재료일 뿐이었습니다. 핵심은 Zero-Shot Voice Cloning을 통해 새로운 문장을 생성하는 것이었습니다.
🔍 해결 과정: AI와의 사투
서버가 요구하는 타겟 문장은 다음과 같았습니다.
“There are only 10 types of people in this world: those who understand binary, and those who don’t.”
1. 환경 구축 및 도구 선정
처음에는 로컬 환경에서 Coqui TTS 라이브러리로 직접 구축하려 했으나, Python 3.14 버전과의 호환성 문제로 인해 Hugging Face의 오픈소스 모델인 F5-TTS로 선회했습니다.
2. 정밀 튜닝 (Hallucination 제거)
AI가 문장을 생성할 때 문장 앞에 불필요한 추임새(“But”, “And a real…“)를 붙이는 환각 현상이 발생했습니다. 이 군더더기 소리 때문에 Text Similarity 점수가 낮게 나오는 상황이었습니다.
- 오디오 커팅: 생성된 파일의 앞부분을 0.x초 단위로 잘라내어 순수하게 “There…“부터 시작하도록 편집했습니다.
- 축약형 주의: AI가
you are를you're로 발음하지 않도록 텍스트 입력을 세밀하게 조정했습니다.
✅ 최종 결과: Access Granted!
끈질긴 시도 끝에 서버로부터 완벽한 일치도를 인정받았습니다.
- Speaker Similarity: 0.8951 (성공)
- Text Similarity: 1.0000 (성공)
결과 화면에 나타난 플래그(Flag)를 확인했을 때의 성취감은 이전의 삽질(?)을 모두 잊게 해주었습니다.
💡 느낀 점
이번 문제는 AI 모델이 문장을 인식하고 생성하는 미세한 차이(축약형, 환각 현상 등)를 이해해야 풀 수 있는 문제였습니다.
특히 텍스트 일치도 1.0을 받기 위해 오디오를 소수점 단위로 잘라내고 재합성하는 과정은 마치 디지털 포렌식에서 데이터를 정밀 분석하는 과정과 닮아 있어 매우 흥미로웠습니다. 앞으로도 AI와 보안이 결합된 새로운 유형의 문제들에 계속 도전해 보고 싶습니다.





























