1P by GN⁺ 2일전 | ★ favorite | 댓글 1개
  • 올해 IOCCC28은 4년 만에 재개되어 전 세계 개발자들의 난이도 높은 C 코드 작품이 대거 출품됨
  • 웹사이트 및 인프라 재구축, mkiocccentry 툴킷 도입, 제출 시스템 개선 등으로 운영 효율이 크게 향상됨
  • 심사 과정이 과거보다 더욱 복잡하고 까다로워졌으나, 심사 기간이 통상 대비 크게 단축됨
  • 코드 사이즈 규정이 완화되었지만, 작고 품질 높은 작품이 다수 선정되어 미래 콘테스트 규정 변화는 제한적일 전망임
  • 흥미롭고 독창적인 우승작들과 난독화 테크닉, 실험적인 가상머신·에뮬레이터 등이 소개되어 C 프로그래밍 수준 향상에 기여함

IOCCC28 개요 및 개최 배경

  • 2024년 열린 제28회 International Obfuscated C Code Contest(IOCCC28)는 4년의 공백기를 거쳐 세계 각국의 개발자들이 참여한 창의적이고 난해한 C 코드 경연
  • 이 기간 동안 6,168회 이상의 커밋으로 공식 IOCCC 웹사이트가 "Great Fork Merge"라는 이름하에 대규모로 리빌딩되었음
  • 운영 측면에서 mkiocccentry 툴킷, 신규 등록 절차, 제출 서버 도입 등 다양한 혁신이 적용되어, 심사효율과 코드 공개 속도가 개선됨
  • 2025년 3월 5일부터 2025년 6월 5일까지 작품 접수를 받았고, 심사는 불과 "33일" 만에 종료되어, 경연 종료 후 약 2시간 내로 소스코드가 모두 공개됨

출품작 및 선정 트렌드

  • 올해 IOCCC28은 참가작 수와 퀄리티가 크게 상승함에 따라 심사 난이도도 증가하였고, 역대 최다인 23개의 우승작을 배출함
  • “4년의 휴식기 덕분에 더 나은 출품작이 나오기도 했지만, 전체적으로 참가자들이 난독화와 C 프로그래밍 실력에서 눈에 띄는 발전을 이루었음”
  • 새로운 코드 크기 제한(약 21% 증가)이 적용되었지만, 우승작의 절반 이상이 전체 제한의 2/3 미만, 10개는 1/2 미만 사이즈로 제출되어 효율성과 품질을 모두 보여줌
  • 이로 인해 향후 10년간 코드 사이즈 규정의 변화는 거의 없을 것으로 예상됨

심사 규정 및 향후 계획

  • IOCCC 규정과 가이드라인은 추후 더욱 혁신적이고 직관적으로 개정할 예정이며, IOCCC Judges는 2025년 12월로 예정된 IOCCC29 준비를 진행 예정임
  • GitHub IOCCC winner 저장소와 mkiocccentry toolkit 저장소에 대한 Pull Request 기반의 보완 패치도 계획함

우승작 소개 및 하이라이트

  • 다양한 주제의 우승작들이 선정되었으며, 다음과 같은 주요 작품 및 특징이 있음

    • ChatIOCCC: Meta의 LLaMA 2 기반 오픈소스 대형 언어모델을 세계 최소화된 LLM 추론 엔진으로 구현, 재미있는 챗봇 기능 제공
    • Eh: UTF-8 엑센트가 적용된 에디터로 ed(1)보다 더 실용적인 난독화 코드 구현
    • 135바이트 One-liner: 입력된 16진수 값을 기반으로 다양한 출력을 수행하는 극단적으로 짧은 난독화 코드
    • C-전처리기 아트: 수천~수십만 번 전처리기를 실행해 이미지 렌더링을 구현, 스크립트 실행 시간이 매우 길고 독특한 경험 제공
    • Z₃ 가상머신: Z-머신의 세 번째 버전을 참조한 가상머신 구현, 소스코드 해석을 게임처럼 즐길 수 있음
    • C64 에뮬레이터 포함 가상환경: 포크봄, 파일 삭제 등 유해한 시나리오도 안전하게 실험 가능한 가상머신, C64까지 탑재
    • Intel 4004 칩 에뮬레이션: 1971년 출시된 세계 최초 상업용 마이크로프로세서 회로를 C 코드로 게이트 단위까지 흉내내는 예술적 재현
    • 다국어 퍼즐: 최소한 세 가지 언어(C, 영어, 기타)에 친숙한 사람들을 위한 참신한 난독화

경연 참가자 및 향후 권고사항

  • 기존 우승작과 유사한 난독화는 가산점이 낮으며, 독창성과 완성도가 심사의 주요 기준임
  • 수상하지 못한 참가자들에게는 개선 후 재도전 또는 다양한 접근법의 시도를 권장함
  • 비우승작의 별도 공개 역시 환영함

입상작 컴파일 및 실행 안내

  • 일부 C 컴파일러 호환 이슈가 있을 수 있으니 최신 clang 또는 gcc 사용을 권장함
  • FAQ 및 공식 문서를 통해 문제 해결 및 수정사항 제출 방법 안내함

2024년 IOCCC28 우승작 다운로드

  • 우승작 전체는 압축 파일(2024.tar.bz2)로 제공하며, 각 작품의 상세 웹페이지와 소스코드, 저자 의견을 참고해 독창적 난독화 테크닉을 학습할 수 있음

(본문 내용에서 바로 접근 가능한 우승작 다운로드 링크와 각 우승작별 상세 설명은 공식 사이트를 참고)

Hacker News 의견
  • 정말 대단함 :)
    이 코드는 현재 달의 위상을 콘솔에 그려줌. 만약 내가 늑대인간이라면 달의 위상을 관찰할 수 있음.
  • 이 코드, donut.c에 대한 오마주 느낌임
    donut.c 참고 링크
  • 이 코드는 1988년에 파이 값을 계산하던 IOCCC 엔트리와도 살짝 비슷한 느낌을 줌
    1988년 파이 계산 코드 참고
  • Compiler Explorer에서 바로 확인 가능함
    Compiler Explorer 바로 가기
  • 이 코드를 컴파일하는 방법은 아래와 같음
cc -Wno-implicit-int -Wno-implicit-function-declaration phase.c && ./a.out
  • 리디자인 때문에 이전 IOCCC 엔트리로 가는 링크들이 모두 깨졌음. 수십 년간 위키피디아 같은 다양한 사이트에 퍼졌던 링크들이 리디렉트 없이 막혀버렸고, 이제 Github에서 엔트리 보려면 자바스크립트 지원 브라우저가 꼭 필요하게 됨
  • JS가 없는 환경에서 접근하려면 git clone으로 저장소를 복제하는 방법을 쓰면 됨
  • 이 엔트리를 보면서 지난 IOCCC 출품작들을 읽어봤는데, 이 이미지 디컴프레션 원라이너는 소스코드의 해시 값을 인자로 받으면 직접 자기 로고 이미지를 출력함. 너무 신기함
  • 이 해시 트릭이 어떻게 동작하는지 궁금했는데, 노트에 설명이 있음. 참고로 노트 내용도 정말 웃김
    "간결함이 난해함보다 중요시되지만, 이 프로그램 역시 IOCCC 특유의 명료성 기준을 여전히 충족함"이라고 적혀있음
  • 정말 놀라운 우연으로, 입력 포맷의 비트 수가 다섯 살짜리 GPU가 한 시간에 할 수 있는 MD5 평가 횟수의 log2와 거의 일치함
  • 이 사람 jq 만든 사람이기도 함
  • 135바이트로 작성됨! 거의 미친 과학자 영역에 가까운 코드임. 완전 믿기 힘든 수준임
  • IOCCC 엔트리 룰이 멋짐. 과거에 어떻게 악용됐는지 명확히 보여주는 매우 구체적인 규정임
Rule 2

Rule 2는 출품작이 Rule 2a와 2b 둘 다 만족해야 함  
iocccsize(1) 툴로 코드가 이 룰을 통과하는지 체크할 수 있음  
prog.c 같은 식으로 파일명을 인자로 넘기면 됨

Rule 2a  
프로그램 소스의 크기는 4993바이트를 넘으면 안 됨

Rule 2b  
iocccsize(1) 툴로 코드 크기를 측정했을 때 출력값이 2503을 넘어선 안 됨

관련해서 좀 더 자세한 내용은 FAQ나 Rule 17을 참고하면 됨
  • 그러면 파일명에 2053바이트의 추가 데이터를 담는 게 허용된다는 말임. 의외로 느슨한 규칙임
  • 4993바이트, 어떻게 이렇게 애매하게 정했는지 궁금해짐
  • underhanded-c.org도 다시 오픈됐으면 좋겠음
  • C를 쓰지 말아야 한다는 좋은 논거가 따로 있을까 싶음. 이게 명확하고도 진지한 결론처럼 느껴짐
  • 어떤 언어로든 이런 난해한 코드를 쓸 수 있음. C가 유난히 잘 어울리긴 하지만 대부분의 IOCCC 엔트리는 여러 언어에도 적용 가능한 트릭을 사용함
  • 내가 가장 좋아하는 IOCCC 출품작 중 하나이자 수상작임
    2005년 persano.c 보기
  • 아마 내가 프로그래머라면, 내 작업이 다른 사람들 눈에는 순수한 의미불명의 암호처럼 보일 것임
  • 이건 정말 멋짐
    2024년 macke 엔트리
    이 프로그램은 최소화된 기능만으로 최신 리눅스 시스템을 통째로 실행하는 에뮬레이터임
  • 작성자임. 이 바이너리가 1.6MB로 최신 리눅스를 구동함. 최대한 크기를 줄이기 위해 별의별 방법을 다 썼음. WebAssembly로도 컴파일돼서 브라우저 안에서도 실행 가능하게 됨
  • 이 엔트리가 좀 많이 혼란스러웠음