Advertisement
badeip

brainfuck interpreter (md5 collision demonstration)

Nov 25th, 2011
5,393
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.64 KB | None | 0 0
  1. // by petter wahlman, www.twitter.com/badeip
  2. // inspired by smashthestack.org, IO level 11 by bla
  3. //
  4. // save http://pastebin.com/tFVjLun8 as md5_is_broken.b64
  5. // save http://pastebin.com/aUr844Di as md5_is_secure.b64
  6. // compile this program:
  7. // gcc brainfuck.c -o brainfuck
  8. //
  9. // verify that the md5's are identical:
  10. // base64 -d md5_is_broken.b64 | md5sum -
  11. //     06f5044af1ad9ddb61e533e59549b829
  12. //
  13. // base64 -d md5_is_broken.b64 | md5sum -
  14. //     06f5044af1ad9ddb61e533e59549b829
  15. //
  16. // notice the different output when interpreted:
  17. //
  18. // base64 -d md5_is_broken.b64 | ./brainfuck
  19. // decoded: 'md5 is broken'
  20. //
  21. // base64 -d md5_is_secure.b64 | ./brainfuck
  22. // decoded: 'md5_is_secure'
  23.  
  24.  
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <unistd.h>
  28. #include <fcntl.h>
  29. #include <sys/types.h>
  30.  
  31. #define MAX_NESTING 100
  32. int bf(char *prog, char *result, int maxlen)
  33. {
  34.     int output_len = 0;
  35.     char tape[4001];
  36.     int edi=0, eip=0;
  37.     unsigned long endless_loop_protection = 100000;
  38.     int loopstart[MAX_NESTING + 1], depth = 0, state;
  39.  
  40.     memset(tape, 0, sizeof(tape));
  41.     while(eip < strlen(prog) && --endless_loop_protection) {
  42.         switch(prog[eip]) {
  43.             case '<':
  44.                 if(edi) --edi;
  45.                 break;
  46.             case '>':
  47.                 if(edi<4000) ++edi;
  48.                 break;
  49.             case '+':
  50.                 ++tape[edi];
  51.                 break;
  52.             case '-':
  53.                 --tape[edi];
  54.                 break;
  55.             case '.':
  56.                 if (output_len < maxlen) result[output_len++] = tape[edi];
  57.                 break;
  58.             case ',':
  59.                 break;
  60.             case '[':
  61.                 state=1;
  62.                 if(!tape[edi])
  63.                     while (state && ++eip < strlen(prog))
  64.                         if (prog[eip] ==']') --state;
  65.                         else if (prog[eip] == '[') ++state;
  66.                         else;
  67.                 else if (depth < MAX_NESTING)
  68.                     loopstart[++depth] = eip;
  69.                 break;
  70.             case ']':
  71.                 if(depth)
  72.                     if(tape[edi] == 0)
  73.                         --depth;
  74.                     else
  75.                         eip = loopstart[depth];
  76.                 break;
  77.         }
  78.         ++eip;
  79.     }
  80.  
  81.     result[output_len]=0;
  82.     return output_len;
  83. }
  84.  
  85.  
  86. int main(int argc, char **argv, char **env)
  87. {
  88.     char input[4096];
  89.     char output[4096];
  90.  
  91.     memset(input, 0, sizeof(input));
  92.     fread(input, sizeof(input) -1, 1, stdin);
  93.  
  94.     bf(input, output, sizeof(output)-1);
  95.  
  96.     printf("decoded: '%s'\n", output);
  97.  
  98.     return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement