DNS TXT 레코드만으로 DOOM 엔진과 자산을 저장하고 메모리에서 조립해 실행한 실험을 소개합니다.
[email protected]:~$cat ./posts/doom-over-dns.md
Adam Rice — 2026-03-21
제 CTF 챌린지 중 하나를 건드려 본 적이 있다면, 아마 어떤 패턴을 눈치챘을 겁니다. 저는 TXT DNS 레코드 안에 페이로드를 숨기는 걸 정말 좋아합니다. 악성 코드를 TXT 레코드에 넣어 두고, 임플란트가 실행 시점에 그 레코드를 조회하게 하면, 갑자기 페이로드가 grandmas-cookie-recipes.com을 해석하는 바로 그 인프라를 통해 전달되게 됩니다. 설정은 터무니없이 쉬운 데다, 포렌식으로 잡아내기는 의외로 꽤 성가십니다. 대체 누가 TXT 레코드의 과거 내용을 플래그하겠습니까?
저는 늘 이 기법이 셸코드 스테이징보다 더 멀리 갈 수 있다고 생각했습니다. TXT 레코드는 검증이 없는 임의 텍스트 필드일 뿐입니다. 페이로드를 저장할 수 있다면, _파일_도 저장할 수 있습니다. 파일을 저장할 수 있다면, _프로그램_도 저장할 수 있습니다. 그리고 프로그램을 저장할 수 있다면… 아마 DOOM도 실행할 수 있겠죠.
정말 아무것도 모르는 사람을 위해 설명하자면, DNS는 도메인 이름을 IP 주소로 바꿔 주는 시스템입니다. google.com을 입력하면 DNS가 브라우저에게 어디로 가야 하는지 알려 줍니다. 인터넷에서 가장 오래된 프로토콜 중 하나이고, 아주 깊고 철저하게 지루합니다.
하지만 DNS는 TXT 레코드도 지원합니다. 원래는 이메일 인증 같은 용도로 쓰라고 만든 작은 텍스트 필드입니다. 여기서 중요한 단어는 “원래는”입니다. 실제로는 그 안에 뭘 넣는지 아무도 검증하지 않습니다. 연애편지를 써도 되고, 레시피를 써도 되고, 이 경우처럼 base64로 인코딩한 바이너리 데이터를 넣어도 됩니다.
각 TXT 레코드는 대략 2,000자 정도의 텍스트를 담을 수 있습니다. 단일 DNS 존은 수천 개의 레코드를 지원할 수 있습니다. 공용 DNS는 전 세계에 분산되어 있고, 전 세계 엣지 노드에 캐시되며, 인터넷 연결만 있으면 누구나 조회할 수 있습니다. 어떻게든 좋게 봐 주면, 이건 무료 전 세계 서버리스 키-값 저장소입니다.
당연히, 저는 여기에 제 영화 컬렉션을 저장해 보고 싶었습니다.
개념 증명은 놀라울 정도로 쉬웠습니다. 파일을 하나 가져와 Base64로 인코딩하고, 청크로 나눈 뒤, 각 청크를 TXT 레코드로 올리면 됩니다. 그리고 재조립 스크립트가 다시 합칠 수 있도록 메타데이터 레코드 하나를 추가하면 끝입니다.
오리 사진으로 테스트해 봤는데 완벽하게 작동했습니다. 오리를 올렸고, 오리는 동일한 해시값으로 다시 내려왔습니다. 이제 DNS는 파일 서버입니다. 요즘 애들 말로 하자면… Skibidi.
하지만 오리 JPEG는 재미없고, 1GB짜리 MP4는 수백 개의 도메인에 걸쳐 대략 670,000개의 TXT 레코드가 필요합니다. 이건 제 Shrek에 대한 야망을 감당할 만큼 확장 가능하지 않았습니다.
더 작고, 압축 가능하고, 이게 얼마나 말도 안 되는지 실제로 보여 줄 무언가가 필요했습니다.
“애초에 그렇게 하라고 설계되지 않은 물건으로 뭔가를 할 수 있는가?”의 보편적 기준은 예나 지금이나 앞으로도 언제나 DOOM입니다. 온도조절기도 DOOM을 돌리고, 임신 테스트기도 DOOM을 돌리고, 저는 DNS가 DOOM을 돌리게 만들고 싶었습니다.
아이디어는 게임 엔진 전체와 자산을 DNS TXT 레코드에서 가져오고, 모든 것을 메모리에 적재한 뒤 실행하는 것입니다. 다운로드도 없고, 설치도 없고, 디스크에 파일을 쓰지도 않습니다. 제 목표는 공용 DNS 쿼리만으로 게임 전체를 메모리에 올리는 것이었습니다.
이걸 조사하면서, Windows에서 메모리로 리플렉션 로드할 수 있는 언어로 작성된 DOOM 포트를 써야 한다는 걸 알았습니다. 이런 용도로는 C#이 위협 행위자들에게 자주 쓰인다는 것도 알고 있었지만, 저는 C#을 모르고 DOOM 소스를 직접 다시 쓸 생각도 없었기 때문에, 거기서부터 찾아보기 시작했습니다.
그렇게 managed-doom을 찾았습니다. 원본 DOOM 엔진을 순수 C#으로 포팅한 프로젝트입니다. 관리형 .NET 어셈블리는 메모리 안의 원시 바이트에서 직접 로드할 수 있으므로, 파일시스템에 실제 파일이 존재할 필요가 없습니다. 이론상으로는, 게임의 컴파일된 코드를 DNS에서 가져와 디스크를 전혀 건드리지 않고 실행할 수 있다는 뜻이었습니다.
(이론상으로는요.)
C#을 몰라서 Claude가 했습니다managed-doom이 메모리에서 실행되려면 몇 가지 패치가 필요했습니다. 원래는 파일 경로(C:\Path\to\Game.dll)를 사용해 디스크에서 게임 데이터를 읽을 것으로 기대하고 있었기 때문에, 대신 메모리 스트림을 받도록 바꿔야 했습니다. 또 네이티브 실행 파일로 컴파일되었는데, 이건 리플렉션으로 로드할 수 없어서 그것도 바꿔야 했습니다. 창 처리를 위한 라이브러리 역시 네이티브 DLL이었고, Windows가 이걸 로드하려면 반드시 디스크에 파일로 존재해야 했기 때문에, 이것도 완전히 뜯어내고 직접 Win32 API를 호출하는 방식으로 대체해야 했습니다.
이 부분의 대부분은 Claude와 함께 작업했고, 까다로운 부분들(전부 다였습니다)을 놓고 여러 번 주고받았습니다. 그 결과, 네이티브 의존성이 전혀 없이 MemoryStream에서 DOOM을 실행할 수 있는 순수 관리형 .NET 어셈블리 세트가 만들어졌습니다. 자세한 피범벅 디테일은 repo에 있습니다.
또 DNS 레코드 수를 줄이기 위해 오디오도 완전히 잘라내기로 했습니다. 그래서 안타깝게도 DOOM은 무음으로 실행되지만, 악마들은 아마 신경 쓰지 않을 겁니다.
압축을 적용하면 DOOM은 단일 CloudFlare Pro DNS 존 안에 넉넉하게 들어갑니다. WAD 파일은 4MB에서 1.7MB로 줄고, DLL 번들은 4.4MB에서 1.2MB로 줄어듭니다. 총합으로는 단일 DNS 존에 약 1,966개의 TXT 레코드가 필요했습니다. 업로드에는 CloudFlare API를 사용해 약 15분이 걸렸습니다.
플레이어 스크립트는 독립 실행형 PowerShell 약 250줄 정도입니다. 약 2,000개의 DNS 쿼리를 모두 10초에서 20초 사이에 해석하고, 모든 것을 메모리에서 재조립하고, 리플렉션으로 어셈블리를 로드한 다음, 디스크에 아무것도 쓰지 않고 게임을 실행합니다.
이번 프로젝트를 위해 월 20달러짜리 CloudFlare Pro 도메인에 돈을 쓰기로 한 이유는, 제가 이미 저주받은 컴퓨팅 프로젝트들 때문에 그들의 무료 티어를 충분히 남용하고 있기도 했고, 다른 방식으로 하려면 도메인 10개를 사고 싶지는 않았기 때문입니다.
그리고 실제로 됩니다. DOOM은 DNS 레코드에 저장되고, 거기서 실행되며, 실제로 돌아갑니다.

위에서 말했듯 DNS는 엄청나게 지루해서, 이걸 번쩍번쩍하고 신나고 섹시한 해커 방식으로 보여 주기가 어렵습니다. 여기 레코드 몇 개의 샘플이 있습니다. DOOM을 실행하기 위해 이런 것들이 약 2,000개 만들어졌다는 점을 기억해 두세요.

메타데이터 레코드는 이런 식으로 생겼습니다. 플레이어 스크립트는 이것들을 읽어 재조립을 위해 몇 개의 레코드를 순회해야 하는지, 손상 여부를 확인할 해시값은 무엇인지, 추가 존(도메인)이 있는지를 파악합니다.

플레이어 스크립트의 일부로 디스크에 기록되는 파일은 없고, 아무것도 설치되지 않으며, 추가 의존성도 필요하지 않습니다. 필요한 건 약 2,000개의 TXT 레코드와, Resolve-DNSName 그리고 약간의 감으로 그것들을 다시 맞춰 붙일 줄 아는 250줄짜리 PowerShell 스크립트뿐입니다.
DNS는 거의 45년이 되었고, 원래는 호스트 이름을 IP 주소에 매핑하도록 설계되었습니다. 파일 저장 시스템이 아닙니다. 파일 저장 시스템으로 설계된 적도 없습니다. IETF에서 RFC 1035를 쓸 때, 그 누구도 이걸 파일 저장 시스템으로 쓰는 걸 생각하지 않았습니다.
그런데도 우리는 지금 여기 있습니다. 인터넷에서 가장 지루한 프로토콜이, 조용히, 가장 남용하기 쉬운 것 중 하나이기도 한 것입니다.
저는 이 프로젝트를 어머니께 이렇게 설명했습니다. 전화번호부를 들고, 각 페이지의 전화번호들로 Tom Cruise 주연의 1986년 아카데미 수상 액션 영화 Top Gun을 플립북 애니메이션처럼 재생하는 것과 같아요.
이 프로젝트의 전체 소스는 GitHub에서 볼 수 있습니다.
~$whoami
Adam Rice
저 같은 사람에게 Crazy Frog는 그냥 개구리일 뿐입니다.
~$cat ~/.links
DNS 레코드만으로 셰어웨어 DOOM을 저장하고 실행하기.