Tag Archive

#misc

이 태그가 포함된 글을 최신순으로 모아봤어요.

52
posts
BLOG2026-08-22
[🥉 Bronze 4] 반투명 덧칠은 지우개가 아니다 — DreamHack QR Code 풀이
blog

[🥉 Bronze 4] 반투명 덧칠은 지우개가 아니다 — DreamHack QR Code 풀이

QR 코드 위에 검은 낙서가 덮여 있다. 그런데 픽셀값이 열 종류밖에 없고 255, 63, 16, 4, 1 이라는 등비 사슬을 이룬다. 알파 75% 검정을 겹칠 때마다 밑의 밝기가 1/4 씩만 남은 흔적이다. "픽셀값이 0보다 크면 흰 모듈" 한 줄로 29x29 격자를 되살리고, 재인코딩본과 841칸 전수 대조까지 했다.
#dreamhack#ctf#misc+5
 
BLOG2026-08-21
[🥈 Silver 2] 상자를 16칸으로 줄인 대가 — DreamHack Nice forest picture 풀이
blog

[🥈 Silver 2] 상자를 16칸으로 줄인 대가 — DreamHack Nice forest picture 풀이

RC4 를 그대로 옮겨 놓고 S 박스만 256칸에서 16칸으로 줄인 스트림 암호다. 원소가 0에서 15 뿐이라 출력도 니블 하나여서 평문의 상위 절반이 암호문에 그대로 남고, 출력이 S 두 칸의 XOR 이라 한 칸만 가정하면 나머지가 줄줄이 강제된다. PNG 시그니처 16바이트를 겹쳐 초기 순열을 0.7초에 되찾고 4.3MB 를 통째로 복호했다.
#dreamhack#ctf#crypto+6
 
BLOG2026-08-20
[🥉 Bronze 2] 신음소리 13글자로 짠 프로그램에서 Base45 플래그 꺼내기 — DreamHack 어 형이야 풀이
blog

[🥉 Bronze 2] 신음소리 13글자로 짠 프로그램에서 Base45 플래그 꺼내기 — DreamHack 어 형이야 풀이

배포본은 확장자가 .bro 인 22KB 짜리 텍스트 하나다. 등장하는 글자가 마침표까지 합쳐 열세 종류뿐이라 난해한 프로그래밍 언어 "혀엉..." 소스라는 게 금방 드러난다. 명세대로 인터프리터를 짜서 돌리면 영문 안내문이 나오고, 그 안에 따옴표로 묶인 26글자가 하나 박혀 있다. 문제 설명이 말한 "45살" 은 시저 45가 아니라 Base45 였다.
#dreamhack#ctf#misc+7
 
BLOG2026-08-19
[🥈 Silver 4] php.ini 한 줄로 SQL Injection 이 막히던 시절 — DreamHack [CodeEngn] Malware L04 풀이
blog

[🥈 Silver 4] php.ini 한 줄로 SQL Injection 이 막히던 시절 — DreamHack [CodeEngn] Malware L04 풀이

배포 파일이 아예 없고 두 줄짜리 질문만 있다. "APM 사이트가 SQL Injection 공격을 받는 중인데 PHP 설정파일에서 어떤 옵션을 켜야 안전한가." 답은 알겠는데 근거가 얇아서, 그 옵션이 실제로 동작하는 마지막 세대인 Debian 6 (Apache 2.2 / PHP 5.3.3 / MySQL 5.1) 을 도커로 세워 Off/On 을 대조했다. 두 종류의 인젝션이 실제로 막히고, 그럼에도 숫자 파라미터와 GBK 우회는 그대로 통과한다.
#dreamhack#ctf#misc+7
 
BLOG2026-08-19
[🥉 Bronze 2] 난해한 언어 엄랭 읽어내기 — DreamHack 엄... 풀이
blog

[🥉 Bronze 2] 난해한 언어 엄랭 읽어내기 — DreamHack 엄... 풀이

배포본은 온점과 반점, 그리고 "어" "엄" "식" 만으로 채워진 .umm 파일 한 개다. 문제 설명은 GitHub 링크 하나뿐. 엄랭(umjunsik-lang) v2 문법을 확정하고 디스어셈블러와 인터프리터를 직접 짜서 51줄을 해석했다. 공백이 곱하기라는 것과, 마지막 카운트다운 루프가 장식이 아니라 플래그의 일부라는 것이 관문이었다.
#dreamhack#ctf#misc+4
 
BLOG2026-08-19
[🥉 Bronze 1] 31줄 발췌본이 base64 인코더라는 걸 증명하기 — DreamHack [CodeEngn] Malware L05 풀이
blog

[🥉 Bronze 1] 31줄 발췌본이 base64 인코더라는 걸 증명하기 — DreamHack [CodeEngn] Malware L05 풀이

악성코드 소스 31줄만 주고 "무엇을 하는 함수인가"를 묻는다. 표준 알파벳 64자와 6비트 마스크가 보이니 base64 같은데, 눈으로 찍는 대신 가려진 두 줄을 채워 컴파일하고 입력 304종을 표준과 바이트 단위로 맞춰 봤다. 덤으로 이 구현이 3의 배수 아닌 길이에서 터지고 76열 규격도 어긴다는 것까지 실측했다.
#dreamhack#ctf#misc+6
 
BLOG2026-08-19
[🥉 Bronze 1] 헤더에 박히는 두 바이트 — DreamHack [CodeEngn] Malware L03 풀이
blog

[🥉 Bronze 1] 헤더에 박히는 두 바이트 — DreamHack [CodeEngn] Malware L03 풀이

악성코드 소스 10줄을 던져 주고 "무엇을 하는 함수인가"만 묻는다. 모양은 인터넷 체크섬인데, 모양만 보고 답을 찍기엔 근거가 얇다. 그래서 배포본을 한 글자도 안 고치고 컴파일해 tcpdump 로 잡은 진짜 패킷의 체크섬 자리 12곳과 맞춰 봤다. 전부 일치했고, 덤으로 이 발췌본이 규격에서 어긋나는 자리 세 군데가 나왔다.
#dreamhack#ctf#misc+6
 
BLOG2026-08-17
[🥈 Silver 3] 프리젠터를 70번 누르면 모스부호가 된다 — DreamHack My Nervous PPT 풀이
blog

[🥈 Silver 3] 프리젠터를 70번 누르면 모스부호가 된다 — DreamHack My Nervous PPT 풀이

발표 전 긴장해서 프리젠터를 눌러댔다는 이야기와 함께 USBPcap 캡쳐 하나만 주어진다. 310개 패킷 중 실제 데이터는 무선 프리젠터가 올린 8바이트 HID 키보드 리포트 140개뿐이고, 거기 등장하는 키는 UpArrow와 DownArrow 둘뿐이다. 두 종류 신호에 눌림 간격으로 만들어진 글자 경계까지 있으니 모스부호다. 간격 히스토그램으로 19덩어리를 자르고 복호하면 플래그가 나온다.
#dreamhack#ctf#misc+6
 
BLOG2026-08-07
[🥈 Silver 3] strncmp 는 8바이트를 다 보지 않는다 — DreamHack Broken Password 풀이
blog

[🥈 Silver 3] strncmp 는 8바이트를 다 보지 않는다 — DreamHack Broken Password 풀이

/dev/urandom 으로 만든 8바이트 비밀번호를 strncmp 로 검사한다. 그런데 strncmp 는 NUL 을 만나면 거기서 멈추고 같다고 답한다. 첫 바이트가 0x00 으로 나오는 1/256 만 노리면 개행 한 글자로 통과한다. 더 그럴싸해 보이는 임의 주소 쓰기 경로는 주소 유출이 없어 쓸 수 없는 미끼였다.
#dreamhack#ctf#misc+6
 
BLOG2026-08-07
[🥉 Bronze 1] IPv6 로 들어가서 IPv4 로 도착하기 — DreamHack Where-is-localhost 풀이
blog

[🥉 Bronze 1] IPv6 로 들어가서 IPv4 로 도착하기 — DreamHack Where-is-localhost 풀이

입력은 반드시 IPv6 여야 하고, 도착한 요청의 출발지는 반드시 IPv4 루프백이어야 한다. 서로 배타적으로 보이는 두 조건을 `::ffff:127.0.0.1` 하나가 동시에 만족시킨다. 파이썬 ipaddress 에게는 version 6 이고 리눅스 커널에게는 127.0.0.1 이기 때문이다. tcpdump 로 루프백에 흐르는 패킷이 실제로 IPv4 라는 것까지 확인했다.
#dreamhack#ctf#web+6
 
BLOG2026-08-06
[🌱 새싹] 개인키를 통째로 주는 문제 — DreamHack Just read flag 풀이
blog

[🌱 새싹] 개인키를 통째로 주는 문제 — DreamHack Just read flag 풀이

문제가 주는 건 OpenSSH 개인키 파일 하나와 "ssh with id: dream" 한 줄이 전부다. 붙어서 flag 를 읽으면 끝이지만, 그 사이에 걸리는 게 셋 있다. 배포 zip 이 키를 0644 로 저장해서 ssh 가 키를 무시하고, 플래그 파일은 root 소유인데 그룹 비트로 열리고, 파일 끝이 개행이 아니라 CR 이라 터미널에서 플래그가 프롬프트에 덮여 사라진다. 키 컨테이너를 직접 파싱해 서버 authorized_keys 와 대조하는 것까지 해 본다.
#dreamhack#ctf#misc+5
 
BLOG2026-08-03
[🥈 Silver 2] 셸이 권한을 떨구기 전에 그 조건을 지워 버린다 — DreamHack Path Finder 풀이
blog

[🥈 Silver 2] 셸이 권한을 떨구기 전에 그 조건을 지워 버린다 — DreamHack Path Finder 풀이

setgid 바이너리가 system("clear") 를 부른다. 절대경로가 아니니 PATH 를 앞에서부터 훑고, 내가 심어 둔 clear 가 문제 그룹 권한으로 돈다. 그런데 setgid 비트만으로는 이게 통하지 않는다. dash 가 시작하면서 빌려온 권한을 스스로 내려놓기 때문이다. 그 방어를 무력화하는 게 바로 앞줄의 setresgid 한 줄이었다.
#dreamhack#ctf#misc+8
 
BLOG2026-07-29
[🥉 Bronze 3] 값을 묻지 말고 지시문을 되풀이시킨다 — DreamHack baby-ai 풀이
blog

[🥉 Bronze 3] 값을 묻지 말고 지시문을 되풀이시킨다 — DreamHack baby-ai 풀이

웹 서버 안에서 0.5B 짜리 로컬 모델을 돌리는 챗봇 문제. 플래그는 시스템 프롬프트 첫 줄에 그대로 박혀 있고, 입력에 admin·flag·pass·secret·private 이 들어가면 모델까지 가지도 못한다. 그런데 그 블랙리스트는 질문만 본다. 비밀을 묻는 대신 지시문을 그대로 되풀이하게 시키면 한 줄에 다 나온다. 키릴 문자 한 글자로 부분문자열 검사 자체를 빗나가게 하는 두 번째 경로도 같이 다룬다.
#dreamhack#ctf#web+8
 
BLOG2026-07-28
[🥈 Silver 4] setuid 바이너리가 스스로 안전장치를 끄는 순간 — DreamHack file-special-bit 풀이
blog

[🥈 Silver 4] setuid 바이너리가 스스로 안전장치를 끄는 순간 — DreamHack file-special-bit 풀이

dream 소유의 setuid 바이너리가 argv[1] 을 그대로 "cat %s" 에 끼워 system() 으로 넘긴다. 보통은 sh 가 실행 즉시 euid 를 ruid 로 되돌려 이런 주입이 무력해지는데, 이 문제는 system() 직전에 setreuid(geteuid(), geteuid()) 로 real uid 까지 올려 버려서 sh 가 떨어뜨릴 권한을 남기지 않는다. 같은 코드에서 그 한 줄만 뺀 대조군을 만들어 차이를 직접 찍었고, filename 버퍼가 10바이트라 전체 경로가 잘리는 것도 gdb 로 확인했다.
#dreamhack#ctf#misc+7
 
BLOG2026-07-21
[🥈 Silver 4] 지시문을 곧이곧대로 읽으면 끝나는 문제 — DreamHack 정ㅋ벅ㅋ 풀이
blog

[🥈 Silver 4] 지시문을 곧이곧대로 읽으면 끝나는 문제 — DreamHack 정ㅋ벅ㅋ 풀이

파일도 서버도 없이 딱 두 줄짜리 설명만 던져주는 트롤 문제. 밈 이름을 넣어보고, 백준 1237의 정답을 넣어보고 다 틀린 뒤에야, 설명 문장 자체를 글자 그대로 따르는 게 정답이라는 걸 알았다. 백준 1237 "정ㅋ벅ㅋ"의 오마주이자, 결국 답은 지시문 안에 통째로 들어 있었다.
#dreamhack#ctf#misc+2
 
BLOG2026-07-20
[🥉 Bronze 4] "로봇 인증"이 오히려 로봇에게 판을 깔아줬다 — DreamHack Robot Only 풀이
blog

[🥉 Bronze 4] "로봇 인증"이 오히려 로봇에게 판을 깔아줬다 — DreamHack Robot Only 풀이

숫자 하나를 3초 안에 그대로 되받아 타이핑하면 "로봇 인증"이 완료된다. 그 숫자는 Python random 모듈의 원시 출력 6개를 이어붙여 고정된 상수로 XOR한 값이라, 우리가 화면에서 읽는 순간 그 6개 숫자를 그대로 역산할 수 있다. 그리고 이 인증은 실패해도 몇 번이든 다시 시도할 수 있다 — 104번만 반복하면 Mersenne Twister의 내부 상태를 완전히 복원하는 데 필요한 624개의 연속된 원시값을 전부 모을 수 있다는 뜻이다. 그 뒤로는 서버가 뽑을 도박 게임의 정답을 베팅하기도 전에 알 수 있게 된다.
#dreamhack#ctf#misc+5
 
BLOG2026-07-20
[🌱 Sprout] 문제 만든 사람이 엔디언을 깜빡했다 — DreamHack littlevsbig 풀이
blog

[🌱 Sprout] 문제 만든 사람이 엔디언을 깜빡했다 — DreamHack littlevsbig 풀이

소스에는 int_arr[0] == 0x64726d68, int_arr[1] == 0x636b3a29라는 비교식이 그대로 노출돼 있다. 16진수를 사람 눈으로 그대로 읽으면 "drmhck:)" — "dreamhack :)"을 줄인 문자열처럼 보인다. 그런데 그 문자열을 그대로 입력하면 프로그램은 거부한다. x86은 little-endian이라 4바이트 정수를 메모리에 거꾸로 저장하기 때문에, 실제로 입력해야 하는 바이트열은 각 4바이트 워드 단위로 뒤집힌 "hmrd):kc"다. GDB로 스택 위 바이트를 직접 찍어 그 반전을 눈으로 확인했다.
#dreamhack#ctf#misc+3
 
BLOG2026-07-20
[🥉 Bronze 1] 정답은 예시 안에 있었다 — DreamHack [CodeEngn] Malware L01 풀이
blog

[🥉 Bronze 1] 정답은 예시 안에 있었다 — DreamHack [CodeEngn] Malware L01 풀이

악성코드 소스 코드 조각 하나만 던져주고 "이것의 공격방법은 무엇인가"를 묻는 문제. 코드를 뜯어보면 SYN 플래그를 고정하고 출발지 IP를 매 패킷 랜덤으로 바꾸며 ACK 없이 영원히 쏘는, 교과서적인 SYN Flood다. 더 정확한 용어로 답을 냈다가 두 번 오답을 먹고 나서야, 문제가 준 예시 문구 자체가 정답이었다는 걸 깨달았다.
#dreamhack#ctf#misc+3
 
BLOG2026-07-20
[🥉 Bronze 1] LSB엔 없다, 주파수에 있다 — DreamHack Audio Steganography 풀이
blog

[🥉 Bronze 1] LSB엔 없다, 주파수에 있다 — DreamHack Audio Steganography 풀이

6초짜리 WAV 파일 하나가 전부인 포렌식 문제. 오디오 스테가노그래피라고 하면 반사적으로 LSB(최하위 비트)부터 뽑아보게 되는데, 그렇게 나온 결과는 그냥 잡음이다. "이상한 소리가 나요"라는 문제 설명을 다시 읽고 스펙트로그램을 찍어보면, 주파수 영역에 flag 문자열이 글자 모양 그대로 그려져 있다. 데이터를 비트에 숨긴 게 아니라 진폭을 붓 삼아 그림을 그린, Aphex Twin류 스펙트로그램 아트다.
#dreamhack#ctf#forensics+4
 
BLOG2026-07-20
[🥉 Bronze 2] .img라 쓰고 gzip이라 읽는다 — DreamHack smart_device 풀이
blog

[🥉 Bronze 2] .img라 쓰고 gzip이라 읽는다 — DreamHack smart_device 풀이

IoT 기기의 펌웨어 파일 하나만 던져주고 "API 키를 뽑아내라"는 문제. 확장자는 .img지만 첫 세 바이트(1f 8b 08)를 보면 실제로는 gzip이다. binwalk를 돌려보려 했더니 환경의 capstone 버전 충돌로 죽어버려서, gunzip과 tar로 같은 과정을 수동으로 재현했다. 풀린 tar 안 임베디드 루트 파일시스템의 설정 파일에 API 키가 평문으로 그대로 박혀 있었다.
#dreamhack#ctf#misc+3
 
BLOG2026-07-20
[🥉 Bronze 1] 위성이 보낸 오디오 속 flag를 힐베르트 변환으로 복조한다 — DreamHack 산타 할아버지도 힘들어요 풀이
blog

[🥉 Bronze 1] 위성이 보낸 오디오 속 flag를 힐베르트 변환으로 복조한다 — DreamHack 산타 할아버지도 힘들어요 풀이

제공되는 건 이상한 8비트 WAV 파일 두 개뿐이다. 스펙트로그램을 찍어봐도 단조로운 톤 하나만 보일 뿐 아무 정보도 없어 보인다. 문제 설명 속 "NOAA 15"라는 이름이 결정적인 힌트였다 — 기상위성이 실시간으로 지구 사진을 내려보내는 아날로그 방송 규격 APT(Automatic Picture Transmission)의 오디오였다. 2400Hz 서브캐리어를 힐베르트 변환으로 AM 복조하고 4160word/line 픽셀 클럭에 맞춰 리샘플링하면, 한반도와 일본 해안선이 그대로 찍힌 위성사진 위에 flag가 그려져 있다.
#dreamhack#ctf#misc+5
 
BLOG2026-07-19
[🥈 Bronze 2] 함수 주소일까, 호출 지점일까 — DreamHack [CodeEngn] Malware L08 풀이
blog

[🥈 Bronze 2] 함수 주소일까, 호출 지점일까 — DreamHack [CodeEngn] Malware L08 풀이

다른 악성코드를 실행해 추가 감염을 일으키는 함수의 주소를 찾으라는 문제. 그래프 전체가 ShellExecuteExA로 대상 파일을 실행하는 하나의 함수인데, 그 함수 자체의 시작 주소를 냈다가 오답을 받았다. 함수 안에 ShellExecuteExA 호출이 두 곳이라는 걸 알고도 어느 쪽인지 헷갈렸는데, 결국 "함수의 주소"가 가리키는 건 실행 API를 호출하는 그 지점이었다.
#dreamhack#ctf#reversing+5
 
BLOG2026-07-19
[🥉 Bronze 3] 뮤텍스가 두 개인 악성코드에서 Thread Mutex 골라내기 — DreamHack [CodeEngn] Malware L06 풀이
blog

[🥉 Bronze 3] 뮤텍스가 두 개인 악성코드에서 Thread Mutex 골라내기 — DreamHack [CodeEngn] Malware L06 풀이

같은 악성코드(bagla downloader) 그래프를 다루는 CodeEngn 시리즈의 또 다른 문제. 이번엔 뮤텍스가 두 개 나온다 — 프로그램 시작 시 만드는 프로세스 단일실행 가드용, 그리고 CreateThread 직후 만드는 두 번째 뮤텍스. 문제가 묻는 "Thread Mutex"는 스레드 생성과 바로 붙어 있는 후자다.
#dreamhack#ctf#reversing+5
 
BLOG2026-07-19
[🥉 Bronze 4] IDA 그래프 한 장으로 끝내는 악성코드 재접속 주기 — DreamHack [CodeEngn] Malware L07 풀이
blog

[🥉 Bronze 4] IDA 그래프 한 장으로 끝내는 악성코드 재접속 주기 — DreamHack [CodeEngn] Malware L07 풀이

실행 파일 대신 IDA 그래프 캡쳐 한 장(07.pdf)만 주어진다. 악성코드가 C2 서버 접속에 실패했을 때 몇 ms 간격으로 재시도하는지를 묻는데, 그래프 안의 재시도 루프를 따라가면 `push 96000h` → `call ds:Sleep`가 답이다. 16진수 0x96000을 10진수로 환산한 614400이 flag가 된다.
#dreamhack#ctf#reversing+5
 
BLOG2026-07-17
[🥉 Bronze 4] 심볼 없는 STM32F4 펌웨어에서 진짜 키 찾기 — DreamHack Please Discover my Discovery key 풀이
blog

[🥉 Bronze 4] 심볼 없는 STM32F4 펌웨어에서 진짜 키 찾기 — DreamHack Please Discover my Discovery key 풀이

769바이트짜리 stripped Cortex-M 펌웨어 하나가 전부다. strings 를 걸면 "진짜 키"를 묻는 미끼 문자열들이 우수수 나오는데, 정작 보드가 UART 로 뱉는 값은 판독 불가능한 바이트다. Thumb 코드를 디스어셈블하고 Unicorn 으로 돌려보면 그 바이트가 두 base64 문자열의 XOR 임이 드러나고, 되돌리면 숨은 메시지가 나온다.
#dreamhack#ctf#misc+6
 
BLOG2026-07-15
[🥉 Bronze 2] dream 은 노이즈인데 leet 문장이 숨어있다 — DreamHack Password in the gift box 풀이
blog

[🥉 Bronze 2] dream 은 노이즈인데 leet 문장이 숨어있다 — DreamHack Password in the gift box 풀이

chall.py 는 puzzle 을 "DH{}" 로 XOR 해 dream 을 만든 뒤, 그 안에서 leet 로 쓴 "the" 와 "iskey" 사이의 pw_key 를 뽑아 다시 XOR 한다. 문제는 두 빈칸(LEET_START, LEET_END)을 채우는 것. dream 을 아무리 봐도 th3·15k3y 같은 흔한 leet 는 안 나온다. 멀티문자 leet 치트시트를 곱집합으로 훑어야 "|"}{|=- 와 |$|(&`/ 가 튀어나온다.
#dreamhack#ctf#misc+4
 
BLOG2026-07-15
[🥉 Bronze 1] 밀려버린 BMP 헤더 되살리기 — DreamHack BMP Recovery 풀이
blog

[🥉 Bronze 1] 밀려버린 BMP 헤더 되살리기 — DreamHack BMP Recovery 풀이

헤더가 0으로 밀린 BMP 파일 하나를 준다. 살아남은 biBitCount(24) 하나로 픽셀 크기를 잡고, 행과 다음 행의 픽셀 차이가 최소인 지점으로 진짜 폭을 찾아 헤더를 재구성하면 그림 속 flag가 드러난다. "폭이 조금만 틀려도 이미지가 대각선으로 밀려 노이즈가 된다"는 성질을 역으로 이용한 포렌식 문제다.
#dreamhack#ctf#forensics+4
 
BLOG2026-07-15
[🥉 Bronze 3] 이모지 단일치환을 영어 문맥으로 되짚기 — DreamHack emoji 풀이
blog

[🥉 Bronze 3] 이모지 단일치환을 영어 문맥으로 되짚기 — DreamHack emoji 풀이

플래그가 210자짜리 이모지 열로 바뀌어 있다. 26종의 이모지는 24개 알파벳과 중괄호에 일대일 대응된다. ⓜ️=m 힌트와 DH{ 접두사, 그리고 A·B·P·E·I 처럼 글자 모양을 그대로 담은 이모지를 앵커로 삼으면 절반이 뚫리고, 나머지는 "emoji"의 사전적 정의문이라는 영어 문맥이 강제로 채워 준다.
#dreamhack#ctf#misc+3
 
BLOG2026-07-15
[🥉 Bronze 3] IEND 뒤에 숨긴 암호문, 그리고 키를 역산한 Vigenère — DreamHack hidden_vigenere 풀이
blog

[🥉 Bronze 3] IEND 뒤에 숨긴 암호문, 그리고 키를 역산한 Vigenère — DreamHack hidden_vigenere 풀이

범죄 조직에게서 압수한 PNG는 겉보기엔 평범한 그림이다. 하지만 IEND 청크 뒤에 29바이트짜리 암호문이 꼬리처럼 붙어 있다. 플래그 형식이 bisc2024로 시작한다는 걸 알면, 암호문 앞머리로 Vigenère 키를 역산할 수 있고, 그 키로 전체를 복호하면 플래그가 나온다.
#dreamhack#ctf#misc+3
 
BLOG2026-07-20
[🥉 Bronze 3] 로마자 일본어를 단일치환으로 가린 매칭 퍼즐 — DreamHack Easy Linguistics 풀이
blog

[🥉 Bronze 3] 로마자 일본어를 단일치환으로 가린 매칭 퍼즐 — DreamHack Easy Linguistics 풀이

일본어 명사를 로마자로 적은 뒤 단일치환으로 암호화한 여섯 단어를, 각각의 뜻에 짝짓는 언어학 퍼즐. 두 단어가 공유하는 접미사를 앵커로 삼아 치환표를 세우면 yoasobi·yokaze·yamiyo 같은 원래 단어가 복원된다. 처음엔 글자 두 개가 빈칸으로 남았지만, 나머지 대응을 채우자 마지막 단어까지 tobihi(飛び火, 튀는 불티)라는 진짜 일본어 단어로 딱 떨어졌다. 맞춘 순서가 곧 플래그가 된다.
#dreamhack#ctf#misc+3
 
BLOG2026-07-20
[🥉 Bronze 4] 보이지 않는 방향 표시 문자에 숨긴 플래그 — DreamHack 보이는 게 다가 아니다 풀이
blog

[🥉 Bronze 4] 보이지 않는 방향 표시 문자에 숨긴 플래그 — DreamHack 보이는 게 다가 아니다 풀이

README 한 줄이 전부인 미스크 문제. 글자 사이사이에 눈에 보이지 않는 U+200E(왼쪽에서 오른쪽 마크)가 잔뜩 흩뿌려져 있어, 화면으로는 알 수 없다. 심지어 터미널에 그냥 cat으로 띄워도 육안으로는 멀쩡한 플래그처럼 보인다 — 그대로 복사해서 제출하면 숨은 문자 때문에 오답이 된다. 파일에서 ASCII 문자만 남기면 진짜 플래그가 드러난다.
#dreamhack#ctf#misc+3
 
BLOG2026-08-20
[🥉 Bronze 4] 이름만 다른 같은 파일 두 개 — DreamHack 어 왜 두 번 써지지 풀이
blog

[🥉 Bronze 4] 이름만 다른 같은 파일 두 개 — DreamHack 어 왜 두 번 써지지 풀이

이름이 거의 같은(하나는 확장자 앞에 공백이 하나 더) 텍스트 파일 두 개를 주는 미스크 문제. 두 파일은 바이트 단위로 완전히 동일하고, 그 안에 플래그가 그대로 두 번 적혀 있다. 숨긴 것도 인코딩도 없이 그냥 읽으면 된다. 덧붙여 zip 헤더와 Windows 이름 정규화로 "이 공백이 끝에 붙은 게 아니라 가운데 있다"는 것까지 확인하고, 같은 문제가 드림핵에 두 번 등록돼 있다는 것도 API 로 대조해 봤다.
#dreamhack#ctf#misc+1
 
BLOG2026-07-20
[🥉 Bronze 4] 뒤집힌 문자열 한 줄 — DreamHack Do not fight 풀이
blog

[🥉 Bronze 4] 뒤집힌 문자열 한 줄 — DreamHack Do not fight 풀이

텍스트 파일 하나를 주는 미스크 문제. 내용이 통째로 뒤집혀 있어 rev 한 번이면 플래그가 나온다. 플래그 형식이 DH가 아니라 AF로 시작하고, 문구 자체가 도구(CyberChef)를 쓰라는 농담이다. 문제 설명에 "AI로 리버싱 문제를 돌린다"를 놀리는 커뮤니티 캡처까지 박아놔서, 풀이보다 그 맥락이 더 재밌다.
#dreamhack#ctf#misc+2
 
BLOG2026-07-08
[🥈 Silver 4] 줄 끝 공백에 숨은 플래그 — SNOW 스테가노그래피 (DreamHack Snowing! 풀이)
blog

[🥈 Silver 4] 줄 끝 공백에 숨은 플래그 — SNOW 스테가노그래피 (DreamHack Snowing! 풀이)

flag.txt 에는 미끼 DH{fake_snow} 뒤로 눈에 안 보이는 공백과 탭이 잔뜩 붙어 있다. 문제명 "Snowing!" 이 가리키는 SNOW 화이트스페이스 스테가노그래피다. 바이트/패턴을 시각화해 정체를 확인하고, 곁들여진 Snow.jpeg 가 함정임을 포렌식으로 배제한 뒤, stegsnow -C 로 복호해 Snow 반복 사이의 진짜 플래그를 꺼낸다.
#dreamhack#ctf#forensics+5
 
BLOG2026-07-20
[🥉 Bronze 2] 1초 안에 덧셈 50번 — DreamHack addition-quiz 풀이
blog

[🥉 Bronze 2] 1초 안에 덧셈 50번 — DreamHack addition-quiz 풀이

서버가 alarm(1)로 1초마다 덧셈 문제를 내고 정답을 요구한다. 난수는 srand(time(NULL))이지만 예측할 필요가 없다 — 문제 자체(num1, num2)를 그대로 평문으로 출력해 주기 때문이다. 필요한 건 PRNG 역산이 아니라 recv-계산-send를 50번 반복할 스크립트뿐이다. 로컬 바이너리로 직접 재보면 50라운드 전체가 0.01초 안에 끝나 — 사람에게 허락된 50초의 5000분의 1이다.
#dreamhack#ctf#misc+4
 
BLOG2026-06-27
[🥉 Bronze 2] 지운 줄 알았던 flag — DreamHack blue-whale 풀이
blog

[🥉 Bronze 2] 지운 줄 알았던 flag — DreamHack blue-whale 풀이

Dockerfile이 flag 내용을 '파일 이름'으로 touch 한 뒤 rm * 로 지운다. 컨테이너 안에는 아무것도 안 남지만, 도커 이미지는 레이어(tar)의 더미라 상위 레이어의 삭제는 하위 레이어를 못 지운다. Docker Hub의 공개 이미지를 받아 docker save로 레이어를 까면 touch 단계 레이어에 flag 파일명이 그대로 박혀 있다.
#dreamhack#ctf#misc+6
 
BLOG2026-06-25
[🥉 Bronze 3] flag는 서비스가 아니라 이미지 안에 있었다 — DreamHack Exercise: Docker 풀이
blog

[🥉 Bronze 3] flag는 서비스가 아니라 이미지 안에 있었다 — DreamHack Exercise: Docker 풀이

Dockerfile 하나와 socat으로 노출되는 바이너리가 주어지는 Docker 실습 문제. 서비스에 접속하면 "Hello Beginners!"만 나오고 바이너리는 flag를 출력하지 않는다. 핵심은 Dockerfile이 flag 파일을 이미지 안(/home/chall/flag)으로 ADD 한다는 것 — 같은 Dockerfile로 이미지를 빌드하고 컨테이너를 실행해 그 안의 flag를 그대로 읽는다.
#dreamhack#ctf#misc+4
 
BLOG2026-06-23
[🥉 Bronze 4] ssh 로 서버에 들어가 flag 를 읽는다 — DreamHack Exercise: SSH 풀이
blog

[🥉 Bronze 4] ssh 로 서버에 들어가 flag 를 읽는다 — DreamHack Exercise: SSH 풀이

드림핵 미스크 탭의 SSH 연습 문제. 익스플로잇은 없고, 주어진 계정으로 원격 서버에 ssh 로 접속해 홈에 놓인 flag 파일을 읽으면 끝난다. ssh 가 무엇이고 첫 접속 때 왜 호스트 키를 확인시키는지, root 소유 파일을 어떻게 일반 계정이 읽을 수 있는지(파일 권한), 들어간 셸이 사실 restricted bash 라는 디테일까지 입문자 눈높이로 짚는다.
#dreamhack#ctf#misc+4
 
BLOG2026-06-22
[🥉 Bronze 3] 첨부파일 안에 들어있는 첫 플래그 — DreamHack Wargame Tutorial 풀이
blog

[🥉 Bronze 3] 첨부파일 안에 들어있는 첫 플래그 — DreamHack Wargame Tutorial 풀이

드림핵이 워게임 사용법을 익히라고 만들어 둔 튜토리얼 문제. 첨부파일을 받아 압축을 풀면 flag.txt 안에 플래그가 평문으로 들어 있고, 그 값을 그대로 제출하면 끝난다. 풀이 기술은 없지만, 파일 다운로드 → 압축 해제 → 플래그 확인 → 제출이라는 워게임의 기본 흐름과 flag.txt를 읽을 때 흔히 놓치는 끝의 개행 한 바이트까지 짚어본다.
#dreamhack#ctf#misc+3
 
BLOG2026-06-21
[🥉 Bronze 4] nc로 처음 잡아보는 플래그 — DreamHack Exercise: Welcome-Beginners 풀이
blog

[🥉 Bronze 4] nc로 처음 잡아보는 플래그 — DreamHack Exercise: Welcome-Beginners 풀이

서버에서 도는 프로그램이 ./flag 를 읽어 메모리에 올려두고, 입력한 문자열이 "Dreamhack" 과 정확히 같을 때만 그 플래그를 출력한다. 익스플로잇이랄 게 없고, nc 로 접속해 strcmp 게이트가 원하는 답을 한 줄 넣어주면 끝. 드림핵 워게임의 nc 접속·플래그 회수 흐름을 처음부터 짚어본다.
#dreamhack#ctf#misc+4