Obfuscated C Code Contest Begins
slashdot-me writes "The International Obfuscated C Code Contest (IOCCC) has begun. See the rules at the IOCCC homepage. The contest runs from Feb. 1 to March 31. " As always, the results will be only readable by Martians.
Just send in some of the code from the Linux kernel... Oh wait, they didn't say "Wall of C Code"...
if (post.first()) { printf "FIRST POST!" }
COBOL is just too verbose a language to obfuscate in the way you can obfuscate C. This does have its virtues, though - most of the programmers that I know who use both languages would prefer to debug 20 year old COBOL than 8 year old C.
No, no, no, you're missing the point. The parentheses are *part of* the code!
Daniel
Hurry up and jump on the individualist bandwagon!
Isn't "Obfuscated FORTRAN" redundant?
*muttering something about silly F77 column positions that descended from punch cards*
Actually, a lot of them are useful programs, either original ones or re-implementations of standard utilities, but with absolutely horrifying things done in the code. Ideally, the obfuscations are not just there for puzzle value, but actually serve to optimize performance.
I wish I could come up with some stuff like this -- I have a few programs that I've written normally, but with some moderately funky techniques, that I've been thinking I might be able to obfuscatify into reasonable entries, but I'm unlikely to get them ready in time. One of these years...
David Gould
David Gould
main(i){putchar(340056100>>(i-1)*5&31|!!(i<6)<< 6)&&main(++i);}
Maybe that's a way to de-obfuscate programs. Just tell the compiler to assemble them, and the resulting assembler might be easier to understand than the source code. It would probably help to compile for a fairly simple RISC chip (eg ARM, MIPS) that has an easy-to-understand instruction set.
Better still, create a new target processor for gcc that is a simple stack machine or something. Then you could compile your code to this. I think the JVM fits this description, so you could use something which compiles C to Java bytecode, and then use a Java decompiler to spit out Java source. I have no idea if this would be more readable, but it could hardly be any worse...
-- Ed Avis ed@membled.com
Why would anyone want to add newlines, tabs or whitespace?
Have you seen the previous entries? A great example is the pi program from 1988 (westley.c). Without whitespace the whole charm of the program would be lost.
Creative indentions can often make a program much sweeter in its source code appearance.
Sorry, one begin was missing :) Here is the patch.
10a11
>begin
--
#define begin {
/* slash_posted returns a 1 if a new slashdot
#define end }
#define say if
#define yell printf
#define otherwise else
#define play_q3 exit
#define katz 1
#define @ ;
article has been posted */
ac_poster_screams()
begin
say(slash_posted)
begin
yell("FIRST POST!")@
play_q3@
end
otherwise
begin
yell("Bill Gates Naked and Petrified!")@
slash_posted = katz;
ac_poster_screams()@
end
end
That's the final version.. now the patch..
3c3
#define say if
5c5,7
#define otherwise else
> #define play_q3 exit
> #define katz 1
14a17
> play_q3@
18a22,23
> slash_posted = katz;
> ac_poster_screams()@
--
logan
18 yrs old, uncommented, looks like heiroglyphics to me now :) Hmmm, something about a 'stack'.
Agent 32
try { do() || do_not(); } catch (JediException err) { yoda(err); }
It doesn't compile on my system (gcc version 2.95.2, glibc2) but you might want to check Illiads entry for this contest.
Download gated code from ftp.merit.net. And try to read it. It was not written by me so I cannot submit it but I would indeed suggest the gated-people to submit it in the contest. Especially the BGP part.
The problem here is that we have to cope with it for at least a few more months until zebra matures completely...
Baker's Law: Misery no longer loves company. Nowadays it insists on it
http://www.sigsegv.cx/
Actually, that one isn't a "correct" quine, because printf takes variable arguments, and thus requires a prototype to be strictly correct.
It's hard to do a short quine which is also strictly-conforming.
My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
1. It can't be strictly conforming code, it assumes ASCII. ;-)
;)
2. It's 5 lines, which is pretty long for "short" code.
3. Even if you think you can assume ASCII, you *CANNOT* have literal newlines in strings.
Try "-ansi -pedantic -Wall". It won't warn about the ASCII thing, but it'll catch the string with newlines.
I generally find you need something equivalent to
char b='\\',q='"',s='\'',n='\n';
to be able to reproduce all the stuff you end up needing.
My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
Actually, no. If it's time critical, it should *NOT* be in assembly, in all probability, because the chances are that the compiler will outsmart you or the chip will change.
:)
Assembly is like saying "Moore's Law doesn't apply to me".
Take your pick: Hand-optimized Pentium assembly, or EGCS code tuned for the Pentium II.
My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
Also incorrect.
MAIN RETURNS INT YOU SIMPERING FOOLS!
:)
(No, really, it does. "void main" is Just Plain Wrong.)
My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
>being itself an ascii pig comprised of >pig-latin'ed code.
"comprising" or "composed of".
My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
Very clever, I like it.
My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
Get current. Modern games are mostly C++. Ick. But it's not assembly, because it doesn't matter.
Look at kernel code. Lots of it. Across a number of OS's and platforms.
Assembly is *rare*, and for good reasons.
My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
I saw one once that, IIRC, consisted of a string declaration and a printf statement which used said string as the formatting string and the argument to be substituted for the %s. Maybe 30-40 characters.
Weblogging Considered Harmful:
Slashdotted already... Get yours while they're hot at google
Speaking of DOS batch files, anyone play the old Microprose game XCom. A friend of mine pointed out that the whole game was tied together by the loop in ufo.bat. The world view would run until a ground mission, the exe would shut down leaving a temp file. The next thing in the batch loop would be the ground combat exe which would pick up the temp file, when ground combat was over it dropped a temp file and exited the batch loop started the world map which pickedup the temp file and contiuned.
Very scary.
I can never remember which was which of APL and PL/1 but whichever I'm thinking of would be absolutely perfect for this. Obscure symbols, an obsession with making the code as small as possible and a general belief that it's easier to reimplement than try and understand someone else's code.
You can see why not many people use it any more...
Greg
Greg
(Inside a nuclear plant)
Aaaarrrggh! Run! The canary has mutated!
There are several kinds of obfuscation. The ones you generally see in IOCCC's, e.g. using one-letter variable names, formatting in bizarre ways, making abstruse use of CPP, and so on, are IMHO far less interesting than true algorithmic obfuscation.
Some obfuscation is easy to produce algorithmically. For example, it is easy to have a program that will parse a C listing, replace variable names by things like O0O0Ooo, make white space come out in strange ways, and so on. Or, compile the program using gcc -O6, take the assembler output, and decompile it in an obvious way.
Much more interesting, I find, is the more ``algorithmic'' kind of obfuscation, where identifiers are not deliberately unclear, but where the overall pattern of execution is difficult to follow. Take the following Scheme example, and try to understand how it works: then you will see what I mean:
(((lambda (foo) (newline) foo)
(call-with-current-continuation (lambda (bar) bar)))
((lambda (foo) (write-char #\*) foo)
(call-with-current-continuation (lambda (bar) bar))))
There are programming languages where nearly every program is obfuscated (in both ways I descibed!), and it is very difficult to write one which is not. One such language I invented is Unlambda.
The code in question (I assume) is this lovely slashdotted ditty over here in case anyone wants a look-see.
My favorite still has to be this one which translates the imput into pig latin while being itself an ascii pig comprised of pig-latin'ed code. I'd inline it, but slashdot munges the extra spacing.
"If one is really a superior person, the fact is likely to leak out without too much assistance" -- John Andrew Holmes
Apart from some programs requiring white space in order to work (especially in printed strings), Sometimes it makes it prettier (This or This, you might need to view the source, as some browsers may reformat this on their rendered views).
Hey, if I wrote maintainable code, they'd be able to hire someone to replace me.
The cake is a pie
DOS Batch files!! they kicked!
:)
:) ... the calendar: 2800 lines... I've written three patches for it since, and its now over 5000 lines long.
:)
; }return(0);}
I wrote the word game of boggle in batch (6500 lines), and a batch script that randomly replied to questions. Random number generation in Batch was about 200 lines.
Just a couple of weeks ago I wrote a calendar for a PS/2 in batch as we have a macintosh functioning as a clock, and a formerly abandonned ps/2 on the windowsill in our club office
I even wrote a TSR manager in batch which allowed me, to the best of the programme's abilities, to load and unload TSRs, complete with a menu.
All you need? getkey.com: B4 00 CD 16 B4 4C CD 21
(ok ok so i have too much free time...had.....have)
#include <signal.h> \ #include <stdlib.h> \ int main(void){signal(ABRT,SIGIGN);while(1){abort(-1)
OFTC: By the community, for the community
main(t,_,a)char *a;{return!0 main(-86,0,a+1)+a)):1,t main(2,_+1,"%s %d %d\n"):9:16:t "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#
q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}
){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;
}'+}##(!!/")
Nice and christmasy. Disclaimer: I used a perl script to escape it. Here's the perl script escaped to itself :-) #!/usr/bin/perl -p
#
# code2html - convert code to html for posting to slashdot
#
# tchrist@perl.com
# Sunday, December 19th, 1999
BEGIN { print "\n" }# and the spirit of awk...
# first kill all the tabs
1 while s{ \t + }
{ " " x (length($&)*8 - length($`)%8) }ex;
# then the four standard naughty bits
s/&/&/g;# must remember to do this one first!
s/ s/>/>/g;# don't close too early
s/"/"/g;# only in embedded tags, i guess
# make lines break where they should
s/^\s*$/
/ || s/$/ ...shall be with us always
/;
# make sure spaces aren't squishticated so we
# can do indentation and properly align comments
s/( {2,})/'' x length($1)/ge;
END { print "\n" }#
---
--
Internet Explorer (n): Another bug -- that is, a feature that can't be turned off -- in Windows.
You should told him that
[BS MODE ON]
'The [platform] C compiler limits the number of possible outstanding user-iterated conditionals to 32, unless you use a double-stage switch conditional, in which case you can stretch the number of allowed outstanding conditionals to 64. Remember, you're using a monolithic 32 bit compiler generating octal, okay? I think you can get around it by custom compiling GCC for [platform], but you have to hand-edit the sub-parser source. Just do a egrep in the appropriate source directory and change all of the 32s to 64s, and then go through again to change all of the 64s to 128'
I used that on a family member that thought one huge 200 line case statement was the way to handle a command line interface efficiently. After I actually caught him peeking at GCC, I just wrote him a 20 line interpreter using a tree.
.sig: Now legally binding!
Having been a first-year programming student once, I know the crap that can get turned out. I think every CS instructor should submit at least one example of their students work, if only to show the professional obfuscators how well it can be done through plain amateurish ignorance. I seem to remember one classmate that wrote 800 lines of code, sans comments, to perform the simple action of reversing the order of a char array and inverting capitalization.. She didn't survive the class, and ended up in a Marketing degree..
.sig: Now legally binding!
Maybe old COBOL programmers too!
The - Completely Obfuscated COBOL Code Contest
Hmm... or maybe thats too obfusctated.
The Tick - "Spoon!"
"Bah!" - Dogbert
They are trying to trick Micros~1 into open sourcing Windows 2000. This would be the first award that they could truly win on merit.
One of my most fund memories when I was learning program was flipping through a book full of obfuscated c contest winners (I forget the name of the book). The interesting thing about the book is about half contest entrees, and the rest we're tips on how to write good C.
,x=x=^; x*u*y*t!!==x%dh^h=7;x!t
Many people will argue that this contest is a bad thing(tm), but I think without seeing totally unreadable code it's harder to appreciate truly beautiful code.
My all time favorite was a program that solved the 8 queens problem in the while condition of a for loop.
It looked *something* like this..
for(i=zx=
f+d^q*df*&g==m&c-=44(x=5%b;
g=&g=*b!b%t^l=h&g!g^==0;x++)
;
I love the semicolon on it's own line
this is my sig.
This is kinda off-topic, but I remember hearing about a contest to write the shortest self-duplicating C program (i.e. something that would spit out an exact copy of its own code). Someone submitted an empty file once, which is kind clever. But does anyone know of the next shortest?
Dear Mr. Moderator
Please notice that that was msg #23, posted at 16:19 UTC and the only one comment under that thread that said something similar was posted at 16:18 UTC, so we couldn't see each other.
Take a bit more care next time.
Oh yeah, so where's the obfuscated Intercal code contest?
Oh, maybe we should drop that...
#define begin {
#define end }
#define if say
#define yell printf
#define else otherwise
#define @ ;
/* slash_posted returns a 1 if a new slashdot
article has been posted */
ac_poster_screams()
say(slash_posted)
begin
yell("FIRST POST!")@
end
otherwise
begin
yell("Bill Gates Naked and Petrified!")@
end
end
--
No need! It already comes that way!!
I can code that in three APL glyphs!
-- What you do today will cost you a day of your life.
Since www.ioccc.org seems to be unreachable at the moment (at least for me), you can amuse yourself by looking at previous winning entries
:)
Have fun
The net will not be what we demand, but what we make it. Build it well.
By the way, I just tried it under gcc (I haven't tried it in a long time), and unfortunately it doesn't appear to work anymore. :(
Anyone want to take a crack at debugging it? :)
For you young 'uns, tiny basic took line numbers. The following should work:
10 for i = 0 to 10
20 print i
30 next i
run
I think it also has a full expression evaluator built in, so you can do some "let j = i * 10" type thing also.
--
10 print "In reality I'm an obfuscated version of msvcrt.dll"
20 goto 10
Never underestimate the relief of true separation of Religion and State.
Perhaps the same website should have an "old timer's league" as well.
I can see it now "The Grande Olde Obfuscated FORTRAN Code Contest"
-ShelbyCobra
Living life in the right side of the s-plane
I don't have the time, but an obviscated css-auth formated in the shape of the DVD logo would be neat. You could print it on t-shirts and the like without people realizing what they are looking at.
The Martian entry, due to be received by the Mars Lander and beamed back to Earth in time for this year's contest, was disqualified on account of being too obscure, causing the main on-board computer to explode.
It's a small world and it smells funny; I'd buy another if it wasn't for the money; Take back what I paid (SoM)
5th line after the #defines is
(!Q(s,"\"")){U("",'#');U("=",'!');}d=B;while(*F=*s ){*s=='"'&&j
after that it should compile with a few warnings
reminder to use uppercase, most of the computers that ran this stuff didn't have working shift keys
- MbM
- MbM
And yes, we're late. Sorry! It takes some coordination getting things set up.
We've already got a number of entries. Remember, you can enter as often as you like.
Many will enter! Some will win! Some will elicit reactions of abject terror!
My blog: http://www.seebs.net/log/ --- My iPhone/iPad app: http://www.seebs.net/seebsfrac/
Here's the core of an email I just sent as an update to the unmaintainable code document.
y (pSuccImpact))
// Act 1.2.4.6.4.11.7 recompute firing degrees, given different predecessors
// (this is identical to Act 1.2.4.6.3.13)
// Then propagate I2, given that its firing degrees may have changed
// No other predecessors, so depropagate I2 also (recursion)
// Act 1.2.4.6.4.11.10 Then kill impact I2
But my experience is so awful I must share the agony with as many as possible. So here you are - another way to write unmaintainable code...
(cue creepy music)
--------------------------------------
When implementing a very complicated algorithm, use the classic software engineering principles of doing a sound design before beginning coding. Write an extremely detailed design document that describes each step in a very complicated algorithm. The more detailed this document is, the better.
In fact, the design doc should break the algorithm down into a hierarchy of structured steps, described in a hierarchy of auto-numbered individual paragraphs in the document. Use headings at least 5 deep. Make sure that that when you are done, you have broken the structure down so completely that there are over 500 such auto-numbered paragraphs. For example, one paragraph might be: (this is a real example)
1.2.4.6.3.13 - Display all impacts for activity where selected mitigations can apply
(short pseudocode omitted).
THEN... (and this is the kicker) when you write the code, for each of these paragraphs you write a corresponding global function named:
Act1_2_4_6_3_13()
Do not document these functions. After all, that's what the design document is for! HAHAHAHAHAHA!
Since the design doc is auto-numbered, it will be extremely difficult to keep it up to date with changes in the code (because the function names, of course, are static, not auto-numbered.) This isn't a problem for you because you will not try to keep the document up to date. In fact, do everything you can to destroy all traces of the document.
Those who come after you should only be able to find one or two contradictory, early drafts of the design document hidden on some dusty shelving in the back room near the dead 286 computers.
---------------------------
Here's a real-life typical code snippet produced using this diabolical method:
if (pProject->GetSecImpactStore()->ConnectedToPrimar
{
wPrevFD= pSuccImpact->GetFD();
wPrevECD= pSuccImpact->GetECD();
wPrevEUCD= pSuccImpact->GetEUCD();
Act1_2_4_6_3_13(pSuccImpact, pProject->GetSecImpactStore());
Act1_2_4_6_4(pSuccImpact, wPrevFD, wPrevECD, wPrevEUCD, pInfEng, pProject, pSecRules);
}
else
{
if (!pStack->IsMember(pSuccImpact))
{
Act1_2_4_6_4_11( pInfEng, pProject, pSuccImpact, pSecRules, pStack );
Act1_2_4_6_4_11_10( pInfEng, pProject, pSuccImpact, pProject->GetSecImpactStore() );
}
}
This goes on for thousands of lines.
--------------------------------------
Thank you for sharing my pain.
Torrey Hoffman (Azog)
Torrey Hoffman (Azog)
"HTML needs a rant tag" - Alan Cox
I'm more interested in the obfuscated-justice contest they're having over at the Superior Court of the State of California County of Santa Clara. I keep trying to compile their efforts, but all I get is "error: INJUSTICE". Maybe I'm using the wrong Constitution? Does anyone have a totalitarian-state constitution I can link against? Maybe the old CCCP constitution?
"If one is really a superior person, the fact is likely to leak out without too much assistance" -- John Andrew Holmes
Here's a site for some pointers:
:)
http://mindprod.com/unmain.html
Quite intriguing if you ask me
In full:
Behold! A tiny BASIC interpreter that fits on one 24x80 screen:
#define O(b,f,u,s,c,a)b(){int o=f();switch(*p++){X u:_ o s b();X c:_ o a b();default:p--;_ o;}} ;break;casei le(l){while(!(s=m[l]))l++;if} d=B;while(*F=*s){*s=='"'& ;&j* B){X'E':l=-1P [*d]=S():(*(q=Q(B,"TH"))=0,ps (B+6):(p=B+5,printf("%d\n",S, "\n")=0,G()))X 0:default:G()
;}_ 0;}G(){l=atoi(B);m[l]&&free(m[l]);(p=Q(B," "))?strcpy(m[l]=malloc(strlen(p, <,'>',>)O(K,V,'$',<=,'!', >=)] ;}
#define t(e,d,_,C)X e:f=fopen(B+d,_);C;fclose(f)
#define U(y,z)while(p=Q(s,y))*p++=z,*p=' '
#define N for(i=0;i<11*R;i++)m[i]&&
#define I "%d %s\n",i,m[i]
#define X
#define _ return
#define R 999
typedef char*A;int*C,E[R],L[R],M[R],P[R],l,i,j;char B[R],F[2];A m[12*R],malloc
(),p,q,x,y,z,s,d,f,fopen();A Q(s,o)A s,o;{for(x=s;*x;x++){for(y=x,z=o;*z&&*y==
*z;y++)z++;if(z>o&&!*z)_ x;}_ 0;}main(){m[11*R]="E";while(puts("OK"),gets(B)
)switch(*B){X'R':C=E;l=1;for(i=0;i<R;P[i++]=0);wh
(!Q(s,"\"")){U("<>",'#');U("<=",'$');U(">=",'!');
++;if(j&1||!Q(" \t",F))*d++=*s;s++;}*d--=j=0;if(B[1]!='=')switch(
X'R':B[2]!='M'&&(l=*--C)X'I':B[1]=='N'?gets(p=B),
=B+2,S()&&(p=q+4,l=S()-1))X'P':B[5]=='"'?*d=0,put
()))X'G':p=B+4,B[2]=='S'&&(*C++=l,p++),l=S()-1 X'F':*(q=Q(B,"TO"))=0;p=B+5;P[i
=B[3]]=S();p=q+2;M[i]=S();L[i]=l X'N':++P[*d]<=M[*d]&&(l=L[*d]);}else p=B+2,P[
*B]=S();l++;}X'L':N printf(I)X'N':N free(m[i]),m[i]=0 X'B':_ 0 t('S',5,"w",N
fprintf(f,I))t('O',4,"r",while(fgets(B,R,f))(*Q(B
)),p+1):(m[l]=0,0);}O(S,J,'=',==,'#',!=)O(J,K,'<'
O(V,W,'+',+,'-',-)O(W,Y,'*',*,'/',/)Y(){int o;_*p=='-'?p++,-Y():*p>='0'&&*p<=
'9'?strtol(p,&p,0):*p=='('?p++,o=S(),p++,o:P[*p++
I hope that translated right... Slashdot "Plain Old Text" option is a little broken, so I had to do some HTML translation. Oh well, it gives you the flavor of the IOCCC, anyway.
--