국제 난독화 C코드 공모전
International Obfuscated C Code Contest국제 난독화 C코드 공모전 | |
---|---|
![]() IOCC의 로고 | |
상황 | 활동적인 |
장르. | 코딩 콘테스트 |
시작합니다. | 2018년 12월 26일( |
끝 | 2019년 3월 15일( |
빈도수. | 연간 |
액티브 년수 | 1984-1996, 1998, 2000, 2001, 2004-2006, 2011-2015, 2018-현재 |
취임식 | (1984년 |
설립자 | 랜던 커트 놀, 래리 바셀 |
웹 사이트 | www.ioccc.org |
국제 난독화 C코드 공모전(IOCC)은 가장 창의적인 난독화 C코드를 위한 컴퓨터 프로그래밍 공모전입니다.매년 개최되는 이 행사는 "[C's] 구문 불투명성을 축하하는 것"[1]으로 설명됩니다.2020년에 개최된 제27회 콘테스트의 우승 코드는,[2] 2020년 7월에 공개되었습니다.이전 대회는 1984-1996, 1998, 2000, 2001, 2004-2006, 2011-2015 및 2018-2020년에 개최되었다.
출품작은 심사위원단에 의해 익명으로 평가된다.심판 과정은 경기 지침에[3] 기록되며, 탈락 라운드로 구성된다.전통적으로 각 경기의 총 참가 인원수에 대한 정보는 제공되지 않는다.수상작에는 "C 프리프로세서의 최악의 남용" 또는 "가장 불규칙한 행동"과 같은 카테고리가 부여되며, 그 후 공식 IOCC 웹사이트에 발표됩니다.IOCCC 웹사이트에 발표되는 것은 우승에 대한 보상이라고 합니다.
역사
IOCCC는 National Semiconductor의 Genix 포팅 그룹에서 근무하던 1984년 Landon Curt Noll과 Larry Bassel에 의해 시작되었습니다.콘테스트의 아이디어는 그들이 고쳐야 할 서투른 코드, 특히 ALGOL 68 구문을 에뮬레이트하기 위해 매크로를 사용한 Bourne 쉘과 BSD용 [4]버그 버전에 대한 노트를 서로 비교한 후에 나왔다.대회 자체는 1993년 컴퓨터볼 [5]퀴즈 문제의 주제였다.2006년부터 5년간의 공백 끝에 2011년에 [6]다시 대회가 열렸다.
다른 프로그래밍 경연대회와 비교했을 때, IOCCC는 Dobb'[7]s Journal의 편집자인 Michael Swaine에 의해 "그렇게 심각하지 않다"고 묘사되었다.
규칙.
매년 IOCCC 웹사이트에 대회 규칙이 게시됩니다.모든 자료는 [8]Creative Commons 라이센스 BY-SA 3.0 Unported에 따라 게시됩니다.규칙은 매년 다르며 규칙의 정신을 전달하기 위해 일련의 지침과 함께 게시됩니다.
대회 규칙을 해킹하는 것은 전통이다.- Landon Curt Noll, 2011년[6]
이 규칙은 종종 의도적으로 허점을 가지고 쓰여져 있어서 참가자들이 찾아내어 [3]남용하도록 장려된다.허점을 악용한 출품작들은 내년 대회 규정을 조정할 [3]수 있다.
난독화 도입
참가 신청은 종종 그런(어떤 경우에는"구경거리로", 박사 Dobbs,[9]에 하나의 항목 C에 있는11-bit ALU를 창출하면서 따라 preprocessor[10]) 하도록 만들어지지 않았고 할 일이거나, 훨씬 더 모호한 방법에 찬성하는 C프로그래밍 언어에서 자주 사용되는 구문을 피하는 것은 C전처리 장치를 사용하는 것 같은 이상하거나 이상하다 마술을 고용하고 있다. achieving 같은 것.
ASCII 아트 방식에 따른 이미지, 텍스트 등과 유사한 형식의 소스 코드, 코드를 읽기 어렵게 하기 위한 프리프로세서 정의, 자체 수정 코드 등이 기여되었습니다.몇 년 후, 내년도 규칙 중 일부에 대한 새로운 정의를 요구하는 항목이 제출되었습니다.이것은 큰 영광으로 여겨진다.한 예로 세계에서 가장 짧은 자기 재생 프로그램을 들 수 있다.엔트리는 자체 소스 코드를 출력하도록 설계된 프로그램으로, 소스 코드는 0바이트입니다.프로그램이 실행되었을 때 소스 [11]코드에 해당하는 0바이트를 출력했습니다.
난독화를 극단적으로 진행하기 위해 경쟁자들은 C 표준의 가장자리를 피하거나 컴파일러에서 거의 사용되지 않는 코드 경로 조합을 트리거하는 프로그램을 만들었습니다.그 결과 과거의 엔트리 중 몇 개는 최신 컴파일러로 직접 컴파일되지 않을 수 있으며, 크래시의 원인이 될 수 있습니다.
예
불과 몇 킬로바이트의 코드 크기 제한 내에서 참가자들은 복잡한 작업을 할 수 있었습니다. 즉, 2004년 수상자가 운영 체제를 [12]개발했습니다.
톨레도 나노체스
톨레도 나노체스는 IOCC 5회 우승자인 멕시코 소프트웨어 개발자 오스카 톨레도 구티에레스가 개발한 체스 엔진이다.IOCC 규칙에 따르면 길이는 1255자입니다.저자는 C로 작성된 세계에서 가장 작은 체스 프로그램이라고 주장한다.
톨레도 나노체스와 기타 엔진의 소스 코드를 사용할 [13]수 있습니다.톨레도 나노체스는 톨레도가 제18회 IOCC(최고[14] 게임)에서 입상한 것을 기반으로 하기 때문에 난독화가 [15]심하다.
2014년 2월 2일 저자는 톨레도 나노체스라는 책을 출판했습니다. 코멘트 첨부 소스 코드. 완전한 코멘트 첨부 소스 [16]코드를 포함합니다.
2010년 2월 7일 현재, 이것은 네덜란드 물리학자 H. G. 뮬러의 Micro-Max와 함께 2킬로바이트 미만의 C로 작성된 2개의 체스 엔진 중 하나로 보인다.2014년에는 Micro-Max의 파생 모델인 Super Micro[17] Chess가 총 760자(스페이스 및 줄 바꿈 포함)[18]를 통해 1킬로바이트 장벽을 깼습니다.톨레도의 엔진인 톨레도 피코체스의 더 작은 버전도 있는데, 944개의 공백이 아닌 문자로 구성되어 있다.
소스 코드 발췌
B,i,y,u,b,I[411],*G=I,x=10,z=15,M=1e4;X(w,c,h,e,S,s){인트 t,o,L,E,d,O=e,N=-M*M,K =78-h<< >x,p,*g,n,*m,A,q,r,C,J,a=y?-x:x;y^=8;G++;d=w s& &s>=h& &v 0,0)>M;하다{_ o=I[ p=O]){q=o&z^y _ q< >7){A=q--&2?8:4;C=o-9&z?q["& .$"]:42;하다{r=I[p+=C[l]-64]_!w p ==w){g=q p+a-S?0:I+S _!r&(q A< >3 g) (r+1&z^y)>9& &q A>2){_ m=!(r-2&7))P G[1]=O, K;J=n=o&z;E=I[p-a]&z;t=q E-7?n:(n+=2,6^y);Z n<=>t){L=r?l[r&7]*9-189-h-q:0 _ s)L +=(1-q?l[p/x+5]-l[O/x+5]+l[p%x+6]*-~!q-l[O%x+6]+o/16*8:!!m*9)+(q?0:!(I[p-1]^n)+ !(I[p+1]^n)+l[n&7]*9-386+!!g*99+(A< >2))+!(E^y^9)_ s>h 1< >s&s==h& &L>z d){p[I]=n,O [I]=m?*g=*m,*m=0:g?*g=0:0;L-=X(s>h d?0:p,L-N,h+1,G[1],J=q A>1?0:p,s)_!(h s-1 B -O i-n p-b L<->M))P y^=8,u=J;J=q-1 A< >7 m!s d r o< >z v 0,0)>M;O[I]=o;p[I]=r;m? *m=*g,*g=0:g?*g=9^y:0;}_ L>N){*G=O _ s>1){_ h& &c-L< >0)P L _!h)i=n,B=O,b=p;}N=L;} n+=J (g=I+p,m=p< >O?g-3:g+2,*m< >z m[O-p] I[p+=p-O]);}}}}Z!r&q>2 (p=O,q A>2 o>z& !r&++C*--A));}}}Z++O>98?O=20:e-O);P N+M*M& &N>-K+1924 d?N:0;}주된(){Z++B< >121)*G ++=B/x%x< >2 B%x< >2?7:B/x&4?0:*l++&31;Z B=19){Z B++<99)풋차(B%x?l[B[I] 16]:x)_ x-(B=F)){i=I[B+=(x-F)*x]&z;b=F;b+=(x-F)*x;Z x-(*G=F))i=*G^8^y;}또 다른 v u,5);v u, 1);}}
파이
다음은 1988년도의 엔트리로, 자신의 [19]면적을 보고 pi를 계산합니다.
#정의_-F<00 --F-OO--; 인트 F=00,OO=00;주된(){F_OO();인쇄물(%1.3f\n",4.*-F/OO/OO);}F_OO() { _-_-_-_ _-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_ _-_-_-_ }
(이 엔트리는 K&R C로 기술되어 있습니다.변경하지 않으면 ANSI C에서는 정상적으로 동작하지 않습니다).[20]
비행 시뮬레이터
또 다른 예로는 1998년 IOCC [21]우승자인 다음 비행 시뮬레이터가 있습니다.Calculated Bets: Computers, Gambling, and Mathemical Modeling to Win (2001)[22]에 기재되어 설명되어 있습니다.다음은 예를 제시하겠습니다.
#실패하다 <math.h> #실패하다 < sys / time >h> #실패하다 <X11/Xlib.h> #실패하다 <X11/키심>h> 이중으로 하다 L ,o ,P ,_=dt,T,Z,D=1,d, s[999],E,h= 8,I, J,K,w[999],M,m,O ,n[999],j=33e-3,i= 1E3,r,t, u,v ,W,S= 74.5,l=221,X=7.26, a,B,A=32.2,c, F,H; 인트 N,q, C, y,p,U; 창 z; 차 f[52] ; GC k; 주된(){ 표시*e= XOpen 디스플레이( 0); z=루트 윈도(e,0); 위해서 (XSet 포그라운드(e,k=XCreateGC (e,z,0,0),블랙픽셀(e,0)) ; 스캔(%lf%lf%lf",y +n,w+y, y+s)+1; y ++); XSelect 입력(e,z= XReate Simple Window(e,z,0,0,400,400, 0,0,화이트픽셀(e,0) ),키 누르기 마스크); 위해서(XMap 윈도(e,z); ; T=죄(O)){ 구조 타임밸 G={ 0,dt*1e6} ; K= 왜냐하면(j); N=1e4; M+= H*_; Z=D*K; F+=_*P; r=E*K; W=왜냐하면( O); m=K*W; H=K*T; O+=D*_*F/ K+d/K*E*_; B= 죄(j); a=B*T*D-E*W; XClear 창(e,z); t=T*E+ D*B*W; j+=d*_*D-_*F*E; P=W*E*B-T*D; 위해서 (o+=(I=D*W+E *T*B,E*d/K *B+v+B/K*F*D)*_; p< >y; ){ T=p[s]+i; E=c-p[w]; D=n[p]-L; K=D*m-B*T-H*E; 한다면(p [n]+w[ p]+p[s ]== 0 K < >팹(W=T*r-I*E +D*P) 팹(D=t *D+Z *T-a *E)> K)N=1e4; 또 다른{ q=W/K *4E2+2e2; C= 2E2+4e2/ K *D; N-1E4& & XDrawLine(e ,z,k,N ,U,q,C); N=q; U=C; } ++p; } L+=_* (X*t +P*M+m*l); T=X*X+ l*l+M *M; XDrawString(e,z,k ,20,380,f,17); D=v/l*15; i+=(B *l-M*r -X*Z)*_; 위해서(; XPending (XPending)(e); u *=CS!=N){ 엑스이벤트 z; XNext 이벤트(e ,&z); ++*((N=XLookupKeysym (&z.키,0))-IT부문? N-LT? 업.-N?& E:& J:& u: &h); --*( DN -N? N-DT ?N== RT?&u: & W:&h:&J ); } m=15*F/l; c+=(I=M/ l,l*H +I*M+a*X)*_; H =A*r+v*X-F*l+( E=.1+X*4.9/l,t =T*m/32-I*T/24 )/S; K=F*M+( h* 1e4/l-(T+ E*5*T*E)/3e2 )/S-X*d-B*A; a=2.63 /l*d; X+=( d*l-T/S *(.19*E +a *.64+J/1e3 )-M* v +A* Z)*_; l += K *_; W=d; 스프린트(f, %5d %3d %7d,p =l /1.7,(C=9E3+ O*57.3)%0550,(인트)i); d+=T*(.45-14/l* X-a*130-J* .14)*_/125e2+F*_*v; P=(T*(47 *I-m* 52+E*94 *D-t*.38+u*.21*E) /1e2+W* 179*v)/2312; 선택한다.(p=0,0,0,0,&G); v-=( W*F-T*(.63*m-I*.086+m*E*19-D*25-.11*u )/107e2)*_; D=왜냐하면(o); E=죄(o); } }
이 프로그램을 [21]컴파일하려면 Linux 시스템에서 다음 명령줄이 필요합니다.
cc banks.c -o banks - DIT= XK_Page_Up - DDT= XK_Page_Down \ - DUP= XK_Up - DDN= XK_Down - DLT= XK_Left - DRT= XK_XK_Right - CS = \DT=
바이너리 파일을 실행하려면 (banks
)와 함께 공급되어야 합니다..sc
입력에 [21]의한 풍경 파일:
cat pittsburgh.sc ./filename
아카리
다음은 2011년 Don, [23]Yang의 ASCII 이미지를 다운샘플링한 엔트리입니다.
/* + + + + [ > i > n [ t ] */ #포함하다< >스태디오.h> /*2w0,1m2,]_<n+a m+o>r>=>([0n1'0)1; */인트/**/주된(인트/**/n,차**m){파일*p,*q;인트 A,k,a,r,i/* #undcelfu_dset <rsitcdti_oa.nhs>i/_*/;차*d="P%" "d\n%d\40%d"/**/ "\n%d\n\00wb+",b[1024],y[]="유라라라유루유리*유라지켄****악카리~n***" "/y*u*k/riin <ty(uyr)g, arr[a1r2a82*y2*/u*r{uyu}riOcyurhiyua**rrr+arayra*=" "yuruurwiyuurara'rariayuuruyuuriuyu>rararaaraariyu9uruyuuyu3riyurar_aBrMaProaWy^?" "*]/f"; sproai <dp/f*i*s/<ii(f)a{tpguat<cahfaurhufuf)a;f}'w/jmaa+i'ni'i'i'a;f'a'n'a'tf'a'a'a'tf'a'a'a'a'a'a'a'a'a'a'tf'a'a'/** */"i+k [ > + b + i > + b + + > l [ ]";인트/**/u;위해서(i=0;i< >101;i++)y[i*2]^="~440trvg~dm"G*eoa+%squ#l2" ":(wn)\"1l)v?wM353{/Y;lgcGp'vedlwudvOK cct~[ju {stkjalor(stwvne)]\"gt\"요기류리[ i]^y[i*2+1]^4;/*!*/p=(n>1& &(m[1][0]-'-' m[1][1] !='\0'))?열리다(m[1],y+298):스틴; /*y/riynrt~(^w^),]c+h+a+r+*+*[n>)+{>f+o<(-m)=<2<5<64;}-]-(m+;yry[rm*]/[*] */q=(n< >3!(m[2][0]-'-' m[2][1]))?설치하다 /*]{ }[*/:열리다(m[2],d+14);한다면(!p /* "<*-]<*->y++>u>+r>+u++y>--u---r>+i+++"<;[>-m-.>a---i.++n.>[(w)*/!q/**/) 돌아가다+인쇄물('할 수 있다" "아닙니다.\x20열다.\40%s\40" "" 「용\40%싱\n",m[!p?1:2],!p?/* o=82]5 < + ( + 3 + 1 + & . ( + m + - + 1 )< ) < . 6 > 4 > - + ( > m - & 1 . 9 - 2 - ) - .28 > - w - - m . : > ( [ 28 + ) */"읽다":"실패");위해서 ( a=k=u= 0;y[u]; u=2 +u){y[k++ ]=y[u];}한다면((a=읽다(b,1,1024/* ,mY/R*Y"R*/,p/*U*/)/*R*/ )>/*U{*/ 2& & b/*Y*/[0]/*U*/=='P' & &4==/*"y*r/y)r\} */스캔(b,d,&k,& A,& i, &r)& & ! (k-6& &k -5)& &r==255){u=A;한다면(n>3){/* ] & < 1 < 6 < ? < m . - + 1 > 3 > + + + + + + . - m - ) - ; . u + = + + +1 < 0 <; f < o < ( r ) < ( ( m ( = ) / 8 * / u++;i++;}인쇄 (q, d,k, u >>1,i>>1,r);u = k-5?8:4;k=3;}또 다른 /*]>*/{(u)=/*{ p>>u>t>-]s>++(.yryr*/)+( n+14>17)?8/4:8*5/ 4;}위해서(r=i=0 ; ;){u*=6;u+= (n>3?1:0);한다면 (y[u]&01)플로피 디스크(/* <g-e<t.c>h.a r -(-)8+<1.>;+i.(<)<)+{+i.f>([180*/)1* (r),q);한다면(y[u ]&16)k=A;한다면 (y[u]&2)k--;한다면(i/* ("^w^NAMORI; { I*/}==a/*" )*/){/**/i=a=(u)*11 &255;한다면(1& &0>= (a= 읽다(b,1,1024,p))& & ">i>(w)-;} { /i-f-(-m--M1-0)<{」 [ 8]==59/* */ )브레이크.;i=0;}r=b[i++] ;u+=(/*> *..</<<)<[;]*/+8&* (y+u))?(10- r?4:2):(y[u] &4)?(k?2:4):2;u=y[u/* 49;7i\(w)/;} y}ru\=*ri[,mc]o;n}트리엔투렌( */]-(인트)'`';} fclose( p);k= +fclose( q); /*] <.na/m*o{ri{d;^w^;}}^_^}} " */ 돌아가다 k- -1+ /*\' '-`*/ ( -/*}/ */0x01 ); {;{ }} ; /*^w^*/ ;}
프로그램이 자체 소스를 입력으로 사용하여 실행되는 경우 결과는 다음과 같습니다.
[root@host ~]# . / akari akari.c int *w,m,_namori=sqn' ; #diso < stdio >h>/*;hrddnd4%"*//**/int(y),u,r[128*2/*{y}icuhya*rr*rya=*/];hrd/**{putchar(u);}int/**/main(n'l)?M5{YlcpvdluvKct[jskao m=256{(;(tve"t"oYRYR" */int(w),char**n 음…mr는 경우 m]/*"<>네]y+u>, r>, u+y-u-r+i+")<>m.a.i+n>,()/q*/ =25<,(31&.(m)))64-(m&192)2>, w?m 인:(2+ m"*,/U// R/)/U*&/Y/0/U/=P&=/"*/)\ 및 16?m-13:13+ m);u=+10,{put-s +(yy*+ n1>, 7?/:*/getchar())+for(;(m=/* *>./()/.1;i()){만약(10/*"wNMR,{I/=/". )(**n/*{나는, w.}_}(-*/ *00).}[뿌리 @ 호스트일]#./akariakari.c>./akari.small[뿌리 @ 호스트일]#./akari./akari.small wm_aoi(n)/*ity,,는 경우에는 2*{}char*y=(")M{lpduKtjsa(v""YY""*yuruyuri"), main(및 와 ",U/ R)U* Y0U=)"/\*){pu.이익(y+ 17/* "NR{I=" {/=* = */};***/{;} [root@host ~]# [root@host ~]#./akari.small > ./akari.small > . / akari . main ( { puts ( YU ) 。
참고 항목
주 및 참고 자료
- ^ Palmer, Geoff (November 1, 2004). "Beyond the command line". PC World New Zealand. Archived from the original on February 10, 2013. Retrieved 2013-04-07.
- ^ "Previous IOCCC Winners". IOCCC. 2014. Archived from the original on 2013-12-23. Retrieved 2014-01-08.
- ^ a b c "2015 Guidelines" (plain text). IOCCC. 2015. Retrieved 2015-11-20.
- ^ "FAQ". IOCCC. Retrieved 2011-11-12.
- ^ "상위 Exec이 올바르게 계산되지 않음"캘리포니아 새너제이 머큐리 뉴스입니다.1993년 5월 15일 페이지 1A뉴스뱅크 경유.(설명 필요)
- ^ a b Jackson, Joab (November 15, 2011). "Obfuscated Code Contest Returns". PC World. Retrieved 2013-04-07.
- ^ Swaine, Michael (May 1, 2008). "There Must be Contest". Dr. Dobb's Journal. Retrieved 2013-04-07.
- ^ IOCCC 홈페이지, 바닥글 및 각 힌트.txt 파일
- ^ Spinellis, Diomidis (October 5, 2006). "Code Finessing". Dr. Dobb's Journal. Retrieved 2013-04-07.
- ^ IOCCC 2004 – CPP의 최선의 남용IOCC. 2013-04-08을 취득했습니다.
- ^ "smr.hint" (plain text). IOCCC. 1994. Retrieved 2006-09-16.
- ^ "gavin.hint3" (plain text). IOCCC. 2004. Retrieved 2007-03-01.
- ^ "Toledo Nanochess and Toledo Picochess".
- ^ "Who won the 18th IOCCC".
- ^ "Nanochess partially de-obfuscated version". GitHub. 13 March 2022.
- ^ Toledo Gutiérrez, Oscar (2014). Toledo Nanochess: The commented source code. Lulu. ISBN 978-1-304-86437-6.
- ^ http://smmax.sourceforge.net/
- ^ "Super Micro FIDE 760".
- ^ "westley.c", 제5회 국제 난독화 C코드 공모전 1988, 2013-10-22 Wayback Machine 아카이브 완료.IOCC
- ^ gcc를 사용하여 다음 명령줄을 사용하여 컴파일합니다.
gcc -traditional-cpp -o r r.c
또는gcc -E r.c sed 's/- -/--/g' > r2.c ; gcc -o r2 r2.c
(소스 파일은 다음과 같습니다.r.c
) [original research?]。 - ^ a b c IOCC 비행 시뮬레이터.aerojockey.com 를 참조해 주세요.2013-04-08 취득.
- ^ Skiena, Steven (2001). Calculated Bets: Computers, Gambling, and Mathematical Modeling to Win. The Mathematical Association of America. pp. 152, 153. ISBN 978-0521009621.
- ^ "Index of /2011/akari". www.ioccc.org. Retrieved 2020-09-18.