tags:

views:

569

answers:

3

The following obfuscated C code prints the words to the "12 days of Xmas".

I was trying to puzzle out how it works. I'm basically completely lost. What is the significance of the three untyped arguments to main in the initial call, the series of characters after the first return, the negative numeric arguments to the calls to main? Eek!

I'm mostly doing this thinking maybe I'll learn some interesting corners of the C language, so replies in that vein are the most welcome.

#include <stdio.h>
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);}
+1  A: 

Some Unix systems do not only pass the argument count and the arguments to main, but also a vector to the environment (see http://en.wikipedia.org/wiki/Main_function_(programming)). I am pretty sure that is what this obfuscated example did expect.

I don't think that you can learn to much from such obfuscated code. It was probably a contestant to the obfuscated c contest.

lothar
A: 

I'm not going to attempt to figure this out, but try reformatting the code to look somewhat normal. That might help. I believe the long string is essentially a compressed form of the song.

Zifre
+9  A: 

Someone's already gone and reversed this: http://research.microsoft.com/en-us/um/people/tball/papers/xmasgift/. Just read through that. It'll explain how it all works.

Patrick
A couple of chars from that opening line, web search, Wikipedia, and I ended up at the same article. +1
gbarry
@gbarry: Same approach led me to http://udel.edu/~mm/xmas/
Daniel LeCheminant