불펌

예술적인 C코드

newtype 2003. 9. 9. 09:44
예술적인 C코드

The International Obfuscated C Code Contest라는 대회에서 Best Layout상을 받은
Don Yang님의 코드가 정말 예술이더군요! 보고는 감탄 할 수밖에 없었습니다.

실제 코드는 다음과 같습니다.
[CODE]
                    
                     #define/**/X 
                  char*d="X0[!4cM,!" 
               "4cK`*!4cJc(!4cHg&!4c$j" 
             "8f'!&~]9e)!'|:d+!)rAc-!*m*" 
           ":d/!4c(b4e0!1r2e2!/t0e4!-y-c6!" 
          "+|,c6!)f$b(h*c6!(d'b(i)d5!(b*a'`&c" 
          ")c5!'b+`&b'c)c4!&b-_$c'd*c3!&a.h'd+" 
         "d1!%a/g'e+e0!%b-g(d.d/!&c*h'd1d-!(d%g)" 
        "d4d+!*l,d7d)!,h-d;c'!.b0c>d%!A`Dc$![7)35E" 
       "!'1cA,,!2kE`*!-s@d(!(k(f//g&!)f.e5'f(!+a+)" 
       "f%2g*!?f5f,!=f-*e/!<d6e1!9e0'f3!6f)-g5!4d*b" 
       "+e6!0f%k)d7!+~^'c7!)z/d-+!'n%a0(d5!%c1a+/d4" 
       "!2)c9e2!9b;e1!8b>e/!     7cAd-!5fAe+!7fBe(!" 
      "8hBd&!:iAd$![7S,Q0!1     bF 7!1b?'_6!1c,8b4" 
      "!2b*a,*d3!2n4f2!${4    f.      '!%y4e5!&f%" 
     "d-^-d7!4c+b)d9!4c-a    'd        :!/i('`&d" 
     ";!+l'a+d<!)l*b(d=!'   m-        a  &d>!&d'" 
    "`0_&c?!$dAc@!$cBc@!$   b         <    ^&d$`" 
    ":!$d9_&l++^$!%f3a'    n1        _       $ !&" 
   "f/c(o/_%!(f+c)q*c     %!         *       f &d+" 
   "f$s&!-n,d)n(!0i-     c-         k)       !  3d" 
   "/b0h*!H`7a,![7*     i]          5        4   71" 
  "[=ohr&o*t*q*`*d      *v         *r         ;  02" 
  "7*~=h./}tcrsth      &t          :          r   9b" 
 "].,b-725-.t--//      #r         [           <   t8-" 
 "752793?  <.~;b      ].t--+r     /           #    53" 
 "7-r[/9~X  .v90      <6/<.v;-52/={            k   goh" 
 "./}q;   u  vto     hr  `.i*$engt$            $    ,b" 
 ";$/     =t ;v;     6     =`it.`;7=`          :    ,b-" 
 "725    = / o`.    .d       ;b]`--[/+       55/     }o" 
 "`.d   :   - ?5    /           }o`.'     v/i]q      - " 
 "-[;   5  2  =`  it            .        o;53-       . " 
 "v96   <7 /      =o            :            d        =o" 
 "--/i  ]q--      [;           h.            /        = " 
 "i]q--[  ;v      9h           ./            <        - " 
 "52={cj   u      c&`          i   t       . o        ; " 
 "?4=o:d=         o--          /  i        ]q         - " 
 "-[;54={  cj     uc&          i]q          -          -" 
 "[;76=i]q[;6     =vsr        u.i           /          ={" 
 "=),BihY_gha     ,)\0        "             ,          o [ 
  3217];int i,   r,w,f        ,              b        ,x , 
  p;n(){return   r  <X        X               X       X  X 
  768?d[X(143+   X  r++       +               *d      )  % 
   768]:r>2659   ?  59:       (                x      =  d 
   [(r++-768)%   X  947      +             768]       ) ? 
   x^(p?6:0):(p  =   34      X            X           X ) 
   ;}s(){for(x=  n   ();     (           x^           ( p 
  ?6:0))==32;x=  n    ()     )   ;return x            ; } 
  void/**/main X      ()     {           r           =  p 
  =0;w=sprintf  (X     X     X         X X           X o 
  ,"char*d=");  for          (    f=1;f <            * d 
  +143;)if(33-(  b=d         [      f++ X           ]  ) 
  ){if(b<93){if   X(!        p          )             o 
   [w++]=34;for    X(i       =         35             + 
    (p?0:1);i<b;    i++      )         o 
    [w++]=s();o[     w++               ] 
     =p?s():34;}     else              X 
       {for(i=92;     i<b;            i 
        ++)o[w++]=     32;}           } 
             else o     [w++          ] 
                         =10;o        [ 
                           w]=0      ; 
                            puts(o);} 
[/CODE]
코드 자체가 예술이죠? 사람얼굴입니다. 그냥 이것이야 만들어주는 프로그램 사용하면 되지 않겠느냐? 싶기도 하겠지만... 문제는 지금부터입니다.
컴파일해서 실행해 보도록 합시다.

첫번째 실행
실행했더니 다음과 같은 결과가 나타납니다.
[CODE]
[spbear@www art]$ gcc dhyang.c 
dhyang.c: In function `main': 
dhyang.c:50: warning: return type of `main' is not `int' 
[spbear@www art]$ ./a.out 
char*d=")35E!'1cA,,!""2kE`*!-s@d(!(k(f//g&!)f.e5'f(!+a+)f%2g*!?f5f,!=f-*e/!<d" 
"6e1!9e0'f3!6f)-g"       "5!4d*b+e6!0f%k)d7!+~^'c7!)z/d-+!'n%a0(d5!""%c1a+/d4" 
"!2)c9e2!9b;e1!8b"       ">e/!7cAd-!5fAe+!7fBe(!8hBd&!:iAd$![7S,Q"    "0!1bF7" 
"!1b?'_6!1c,8b4!2"       "b*a,*d3!2n4f2!${4f.'!%y4e5!&f%d-^-d7!4"       "c+b)" 
"d9!4c-a'd:!/i('`"       "&d;!+l'a+d<!)l*b(d=!'m-a&d>!&d'`0_&c"           "?!" 
"$dAc@!$cBc@!$b<^"       ""              "&d$`:!$d9_&l++^$!%f3"          "a'n" 
"1_"                                   "$!&f/c(o/_%!(f+c)q*c%"         "!*f&d" 
"+f$"                                "s&!-n,d)n(!0i-c-k)!3d/"        "b0h*!H`" 
"7a,!["                      "7X0[!4cM,!4cK`*!4cJc(!4cHg&!4"       "c$j8f'!&~" 
"]9e)!'"                 "|:d+!)""rAc-!*m*:d/!4c(b4e0!1r"        "2e2!/t0e4!-" 
"y-c6!+|,c6!)f$b("       "h*c6"      "!(d'b(i)d5!(b*a'"         "`&c)c5!'b+`&" 
"b'c)c4!&b-_$c"                      "'d*c3!&a.h'd+d"         "1!%a/g'e+e0!%b" 
"-g(d.d/!&c*"                        "h'd1d-!(d%g)"         "d4d+!*l,d7d)!,h-" 
"d;c'!.b0c"                             ">d%!A`Dc$"       "![7*i]5471[=ohr&o*" 
"t*q*`*d"                                "*v*r;027"       "*~=h./}tcrsth&t:r9" 
"b].,b"          ""      "-725"            "-.t--/"       "/#r[<t8-752793?<.~" 
";b]."        "t--"      "+r/#"             "537-r"        "[/9~X.v90<6/<.v;-" 
"52/="      "{kgoh."     "/}q"    ";u"       "vtohr"       "`.i*$engt$$,b;$/=" 
"t;v"      ";6=`it."    "`;"      "7=`"       ":,b-7"       "25=/o`..d;b]`--[" 
"/+"      "55/}o`.d:"   ""       "-?5"        "/}o`.'"       "v/i]q--[;52=`it" 
".o"     ";53-.v96<7"            "/=o"        ":d=o--/"        "i]q--[;h./=i]" 
"q"     "--[;v9h./<-"           "52="         "{cjuc&`"         "it.o;?4=o:d=" 
"o"      "--/i]q--["           ";54="        "{cjuc&i]q-"        "-[;76=i]q[;" 
"6="       "vsru.i"            "/={"        "=),BihY_gha,)"        "",o[3217]; 
int i,        r,w           ,f,b,p,        t=641,x;n(){return         r<t?d[(* 
d+143+(r                ++))%t]:r>        +1341?59:(x=d[(r++-t)        %351+t] 
)?x^(p?6:0            ):(p=+34);}        main(){w=sprintf(o,"char"       "*d=" 
);r=p=0;for(      f=1;f<*d+143;)       if((b=d[f++])-33){if(b<+93){        if( 
!p)o[w++]=34;for(i=35+(p?0:1);i    <b;i++)o[w++]=n();o[w++]=p?n():+34       ;} 
else for(i=92;i<b;i++)o[w++]=32;}else o[w++]=10;o[w]=0;puts(o);};/*Don_Yang*/; 
[spbear@www art]$ 
[/CODE]

화면에 보는 바와 같이 일본어로 "A KU"라고 나타나는군요.
그런데 좀 더 자세히 봅시다. 어라? 이것도 소스코드네요? 이걸 한번 컴파일 해볼까요?

두번째 실행

[CODE] [spbear@www art]$ ./a.out > output1.c [spbear@www art]$ gcc output1.c [spbear@www art]$ ./a.out char*d="S,Q0!1bF7!1b?'_""6!1c,8b4!2b*a,*d3""!2n4f2!${4f.'!%y4e5!&f%d-^-d7!4c+" "b)d""9!4c-a'd:!/i(" "'`&d;!+l'a+d<!)l*b(d=!'m-a&d>""!&d'`0_&""c?!$dAc@" "!$cBc@!$b<^&d$" "`:!$d9_&l++^$!%f3a'n1_$!&f/c(o/_%" "!(f+c)" "q*c%!*f&d" "+f$s&!-n,d)n(!0i-c-k)!3d/b0h" "*!H`" "7a,!" "[7X0" "[!4cM,!4cK`""*!4cJc(!4cH" "g&" "!4c$j" "8f'!&~]9e)" "!'|:d+!)rAc-!*m*:""d/!" "4c(b" "4e0!1r2" "e2!/t0e""4!-y-" "c""6!+|,c6!)f$b(h" "*c6!(d" "'b(i)d5!(b*a'`&c)c5!'b+`&b'" "c)c4!&b-_$c'd*c3!" "&a.h'd+d" "1!%a/g'e+e0!%b-g(d.d/!&c*" "h'd1d-!(d""%g)d4d" "+!*l,d7d)!," "h-d;c'!.b0c>d%!A`Dc$![7)" "35E!'1cA,,!2kE`*!-" "s@d(!(k(f//g&" "!)f.e5'f(!+a+)f%2g*!?" "f5f,!=f-*e/!""<d6" "e1!9e0'f3!6f)-g" "5!4d*b+e6!0f%k)d7!" "+~^'c""7!)z/d-+!" "'n%a0(d5!%c1a+/d4" "!2)c9e2!9b;e1!8b" ">e/!7c" "Ad-!5fA" "e+!7fBe(!8hBd&!:iA" "d$![7*i]5471" "[" "=ohr&" "o*t*q*`*d*v*r;027*~" "=h./}tc" "rst" "h&t:r9b].,b-725-.t-" "-//#r" "[<t8-752793" "?<.~;b].t""--+r/#5" "37-" "r" "[/9~X.v90<6/""<.v;" "-52/={kgoh./}q;uv" "t" "ohr`.i*$engt$" "$,b;$/=""t;v;6=`it.`" ";7=`:,b-725=/o`." ".d;b]`--[/+55/""}o`.d" ":-?5/}o`.'v/i]q--[;52" "=`it.o;53-.v96" "<7/=o:d=o--/i]q--[;h." "/=i]q--[;v9h./<-52={cju" "c&`it.o;?4=o:" "d=o--/i]q--[;54={cju" "c&i]q--[;76=i]q[;6=vsru.i/" "={=),BihY_g" "ha,)",o[3217];int i, r,w,f,b,p,t=641,x;n(){return r< t?d[(*d+143 +(r++))%t]:r>+1341? 59:(x=d[(r++-t)%351+t])?x^(p?6: 0):(p=+34 );}main(){w=sprintf(o ,"char""*d=");r=p=0;for(f=1;f<*d +143;) if((b=d[f++])-33){if(b <+93){if(!p)o[w++]=34;for(i=35+( p?0: 1);i<b;i++)o[w++]=n();o[ w++]=p?n():+34;}else for(i=92;i <b ;i++)o[w++]=32;}else o[w++]=10;o[w]=0;puts(o);};/*Don_Yang*/;;;;;;;;;;;;;;;;;; [spbear@www art]$ [/CODE]

이번에는 일본어로 "SO KU"라고 나오는 군요! 허허... 이것도 그런데 또 C 코드지요? 다시한번 컴파일 해봅시다.

세번째 실행
[CODE]
[spbear@www art]$ ./a.out > output2.c 
[spbear@www art]$ gcc output2.c 
[spbear@www art]$ ./a.out 
char*d="X0[!4cM,""!4cK`*!4cJc(!4cHg&!4c$j8f'!&~]9e)!'|:d+!)rAc-""!*m*:d/!4c(b" 
"4e0!1r2e2!/t0"      "e4!-y-c6!+|,c6!)f$b(h*c6!(d'b(i)d5""!(b*a'`&c)c5!'b+`&b" 
"'c)c4!&b-_$c'"      "d*c3!&a.h'd+d1!%a/g'e+e0!%b""-g("   "d.d/!&c*h'd1d-!(d%" 
"g)d4d+!*l,d7d"       ")!,h-d;c""'!.b0c>d%!A`Dc$![7)3"      "5E!'1cA,,!2kE`*!" 
"-s@d(!(k(f//g&"      "!)f.e5"     "'f(!+a+)""f%2g*!"        "?f5f,!=f-*e/!<d" 
"6e1!9e0'f3!6f)"                  "-g5!4d*b+e6!0f%k"          ")d7!+~^'c7!)z/" 
""                               "d-+!'n%a0(d5!%c1"          "a+/d4!2)c9""e2!" 
"9"                             "b;e1!8b>e/!7cAd-"         "!5fAe+!7fBe(!8hBd" 
"&!"          ":"        "iAd$![7S,"  "Q0!1bF7!1"        "b?'_6!1c,8b4!2b*a,*" 
"d3!2n4f2!${4f.'!"       "%y4e5!&"      "f%d-^"        "-d7!4c+b)d9!4c-a'd:!/" 
"i('`&d;!+l'a+d<!"       ")l*b(d=!'"     "m-a"        "&d>!&d'`0_&c?!$dAc@!$c" 
"Bc@!$b<^&d$"             "`:!$""d9_"    "&l"        "++^$!%f3a'n1_$!&f/c(o/_" 
"%!(f+c)"                "q*c"     "%!*f&d+"        "f$s&!-n,d)n(!0i-c-k)!3d/" 
"b0h*!"                "H`7a,!"      "[7*i"        "]5471[=ohr&o*t*q*`*d*v*r;" 
"027"                 "*~=h./}tc"     "rs"        "th&t:r9b].,b-725-.t--//#r[" 
"<t"        "8-7"    "52793?<.~;b]"   ".t"       "--+r/#537-r[/9~X.v90<6/<.v;" 
""        "-52/={kgoh./}q;uvtohr`.i*$eng"       "t$$,b;$/=t;v;6=`it.`;7=`:,b-" 
""       "725=/o`..d;b]`--[/+55/}o`.d:-?"       "5/}o`.'v/i]q--[;52=`it.o;53-" 
""      ".v96<7/=o:d=o--/i]q--[;h"  "./"        ""    "=i]q--[;v9h./<-52={cju" 
""        "c&`it.o;?4=o:d=o--/i]"   "q-"                "-[;54={""cjuc&i]"  "" 
"q"          "--[;76=i]q[;6=v"     "sru"                  ".i/={=),BihY_"   "" 
"gh"          "a,)",o[3217]       ;int i                   ,r,w,f,b,p,t=   641 
,x;n()          {return r       <t?d[(*                     d+143+(r       ++) 
)%t]:r>+          1341        ?59:(x=d[          (r                       ++-t 
)%351+t])?x                  ^(p?6:0):(        p=+34);                  }main( 
){w=sprintf(o,             "char""*d="       );r=p=0;for               (f=1;f< 
*d+143;)if((b=d[f        ++])-33){if(b      <+93){if(!p)o[            w++]=34; 
for(i=35+(p?0:1);i<b;i++)o[w++]=n();o[    w++]=p?n():+34;}else      for(i=92;i 
<b;i++)o[w++]=32;}else o[w++]=10;o[w]=0;puts(o);};/*Don_Yang*/;;;;;;;;;;;;;;;; 
[spbear@www art]$ 
[/CODE]
이번에는 일본어로 "ZAN"이라고 나오는군요. 이것도 다시 컴파일해봅시다.

네번째 실행
[CODE]
[spbear@www art]$ ./a.out > output3.c 
[spbear@www art]$ gcc output3.c 
[spbear@www art]$ ./a.out 
char*d=")35E!'1cA,,!""2kE`*!-s@d(!(k(f//g&!)f.e5'f(!+a+)f%2g*!?f5f,!=f-*e/!<d" 
"6e1!9e0'f3!6f)-g"       "5!4d*b+e6!0f%k)d7!+~^'c7!)z/d-+!'n%a0(d5!""%c1a+/d4" 
"!2)c9e2!9b;e1!8b"       ">e/!7cAd-!5fAe+!7fBe(!8hBd&!:iAd$![7S,Q"    "0!1bF7" 
"!1b?'_6!1c,8b4!2"       "b*a,*d3!2n4f2!${4f.'!%y4e5!&f%d-^-d7!4"       "c+b)" 
"d9!4c-a'd:!/i('`"       "&d;!+l'a+d<!)l*b(d=!'m-a&d>!&d'`0_&c"           "?!" 
"$dAc@!$cBc@!$b<^"       ""              "&d$`:!$d9_&l++^$!%f3"          "a'n" 
"1_"                                   "$!&f/c(o/_%!(f+c)q*c%"         "!*f&d" 
"+f$"                                "s&!-n,d)n(!0i-c-k)!3d/"        "b0h*!H`" 
"7a,!["                      "7X0[!4cM,!4cK`*!4cJc(!4cHg&!4"       "c$j8f'!&~" 
"]9e)!'"                 "|:d+!)""rAc-!*m*:d/!4c(b4e0!1r"        "2e2!/t0e4!-" 
"y-c6!+|,c6!)f$b("       "h*c6"      "!(d'b(i)d5!(b*a'"         "`&c)c5!'b+`&" 
"b'c)c4!&b-_$c"                      "'d*c3!&a.h'd+d"         "1!%a/g'e+e0!%b" 
"-g(d.d/!&c*"                        "h'd1d-!(d%g)"         "d4d+!*l,d7d)!,h-" 
"d;c'!.b0c"                             ">d%!A`Dc$"       "![7*i]5471[=ohr&o*" 
"t*q*`*d"                                "*v*r;027"       "*~=h./}tcrsth&t:r9" 
"b].,b"          ""      "-725"            "-.t--/"       "/#r[<t8-752793?<.~" 
";b]."        "t--"      "+r/#"             "537-r"        "[/9~X.v90<6/<.v;-" 
"52/="      "{kgoh."     "/}q"    ";u"       "vtohr"       "`.i*$engt$$,b;$/=" 
"t;v"      ";6=`it."    "`;"      "7=`"       ":,b-7"       "25=/o`..d;b]`--[" 
"/+"      "55/}o`.d:"   ""       "-?5"        "/}o`.'"       "v/i]q--[;52=`it" 
".o"     ";53-.v96<7"            "/=o"        ":d=o--/"        "i]q--[;h./=i]" 
"q"     "--[;v9h./<-"           "52="         "{cjuc&`"         "it.o;?4=o:d=" 
"o"      "--/i]q--["           ";54="        "{cjuc&i]q-"        "-[;76=i]q[;" 
"6="       "vsru.i"            "/={"        "=),BihY_gha,)"        "",o[3217]; 
int i,        r,w           ,f,b,p,        t=641,x;n(){return         r<t?d[(* 
d+143+(r                ++))%t]:r>        +1341?59:(x=d[(r++-t)        %351+t] 
)?x^(p?6:0            ):(p=+34);}        main(){w=sprintf(o,"char"       "*d=" 
);r=p=0;for(      f=1;f<*d+143;)       if((b=d[f++])-33){if(b<+93){        if( 
!p)o[w++]=34;for(i=35+(p?0:1);i    <b;i++)o[w++]=n();o[w++]=p?n():+34       ;} 
else for(i=92;i<b;i++)o[w++]=32;}else o[w++]=10;o[w]=0;puts(o);};/*Don_Yang*/; 
[spbear@www art]$ 
[/CODE]
다시 "A KU"가 나오네요. 이것이 계속적으로 반복하는 구조를 가집니다. 굉장하지 않습니까? ㅡ.ㅡ 어떻게 이런 발상을 할 수 있는거죠? 허허허...

덧말

나중에 안 사실인데 일본의 애니메이션 바람의 검심에
사이토 하지메가 입에 달고 다니던 말 "악즉참(惡卽斬)"의
일본 발음이 A KU SO KU ZAN 이군요. 그리고 맨 상단의 코드에 나온 얼굴도
사이토 하지메의 얼굴이고요. LSN에서 알려주신 onion님께 감사.. ^_^


링크

The International Obfuscated C Code Contest

http://www.ioccc.org/

일반적으로 프로그래밍할때 따지게 되는게 가독성인데, 그 흐름에 역행하는 이 대회는 그 결과로 산출되는 C코드를 보면 정말이지 코드를 예술의 경지까지 끌어올리고 있음에 혀를 내두를 수 밖에 없다. 한마디로 맛가는 소스코드들! 감상해보자.


[출처]
http://www.oz.or.kr/~spbear/note/wiki/moin.cgi/_bf_b9_bc_fa_c0_fb_c0_ce_20C_c4_da_b5_e5



반응형