Wednesday, July 25, 2012

Obfuscated C Code Contest

http://www.ioccc.org/

The international obfuscated c code contest (ioccc) went away for a few years.  But now it's back.  My earliest/fondest memories of learning programming are exchanging bits of C code from IOCC entries with friends as we'd try and stump each other.  Maybe that's why I love programming in perl so much, a language more timid engineers consider unreadable and difficult to maintain.  My retort typically being that unorganized code in any language is difficult to maintain.  I even hesitate to use the words "poorly written" because I think that any code which accomplishes it's primary goals in a stable manner is well written in my book, regardless of how pretty it is.  Although, I now consider perl a guilty pleasure that I'm trying to quit.  I still fall back into it while data munging and can move mountains in moments with it.  There's something deeply satisfying about accomplishing a task in 30 minutes that a colleague has been manually working through for days/weeks or had given up attempting.

The code below isn't pretty, but it illustrates a point I plan to make in a latter blog post.  Automated code scans don't protect against an insider threat.  General purpose languages which are essential to making anything allow unlimited obfuscated representations of functionality.  It's trivial to hide true functionality by obfuscating code.

Compile and run it... the output is all 12 verses of "The 12 Days of Christmas".
http://www.ioccc.org/years.html#1988
phillipps


main(t,_,a )
char
*
a;
{
return!

0<t?
t<3?

main(-79,-13,a+
main(-87,1-_,
main(-86, 0, a+1 )


+a)):

1,
t<_?
main( t+1, _, a )
:3,

main ( -94, -27+t, a )
&&t == 2 ?_
<13 ?

main ( 2, _+1, "%s %d %d\n" )

:9:16:
t<0?
t<-72?
main( _, t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:
t<-50?
_==*a ?
putchar(31[a]):

main(-65,_,a+1)
:
main((*a == '/') + t, _, a + 1 )
:

0<t?

main ( 2, 2 , "%s")
:*a=='/'||

main(0,

main(-61,*a, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry")

,a+1);}