Advertisement
IamLupo

BBAD Challange

Oct 21st, 2015
419
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.30 KB | None | 0 0
  1. /*
  2. Made by IamLupo!
  3.  
  4. Challange: https://backdoor.sdslabs.co/challenges/BBAD
  5.  
  6. key < 12000
  7.  
  8. Secret message:
  9. 2933070^67
  10. 3232427352382723^3475
  11. 33^8923
  12. 1752173996578580830630^3617
  13. 47^1205
  14. 1334324742249840763104115177915406053196992583180688299430^5620
  15. */
  16.  
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include <string.h>
  20.  
  21. #include "gmp.h"
  22.  
  23. int prime[] = {
  24.     2,   3,   5,   7,   11,  13,  17,  19,  23,  29,
  25.     31,  37,  41,  43,  47,  53,  59,  61,  67,  71,
  26.     73,  79,  83,  89,  97,  101, 103, 107, 109, 113,
  27.     127, 131, 137, 139, 149, 151, 157, 163, 167, 173,
  28.     179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
  29.     233, 239, 241, 251, 257, 263, 269, 271, 277, 281,
  30.     283, 293,
  31.     307, 311, 313, 317, 331, 337, 347, 349, 353, 359,
  32.     367, 373, 379, 383, 389, 397, 401, 409, 419, 421,
  33.     431, 433, 439, 443, 449, 457, 461, 463, 467, 479,
  34.     487, 491, 499
  35. };
  36.  
  37. char keyboard[] = {
  38.     '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
  39.     'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p',
  40.     'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z',
  41.     'x', 'c', 'v', 'b', 'n', 'm', 'Q', 'W', 'E', 'R',
  42.     'T', 'Y', 'U', 'I', 'O', 'P', 'A', 'S', 'D', 'F',
  43.     'G', 'H', 'J', 'K', 'L', 'Z', 'X', 'C', 'V', 'B',
  44.     'N', 'M', '?'
  45. };
  46.  
  47. /* Crypt Data */
  48. struct crypt_data {
  49.     int* list;          // list with prime numbers
  50.     int list_len;
  51.    
  52.     mpz_t a;
  53.     mpz_t key;
  54.     mpz_t x;
  55.     mpz_t y;
  56.    
  57.     //Analise
  58.     int min_char;
  59.     int max_char;
  60. };
  61.  
  62. void cryptDataInit(struct crypt_data* cdata) {
  63.     mpz_init(cdata->a);
  64.     mpz_init(cdata->key);
  65.     mpz_init(cdata->x);
  66.     mpz_init(cdata->y);
  67. }
  68.  
  69. void cryptDataClear(struct crypt_data* cdata) {
  70.     mpz_clear(cdata->a);
  71.     mpz_clear(cdata->key);
  72.     mpz_clear(cdata->x);
  73.     mpz_clear(cdata->y);
  74. }
  75.  
  76. /* Function */
  77. int findPrimePos(int input) {
  78.     int i;
  79.    
  80.     for(i = 0; i < 62; i++) {
  81.         if(prime[i] == input)
  82.             return i;
  83.     }
  84.    
  85.     return 63;
  86. }
  87.  
  88. /* Draw */
  89. void drawCipherText(struct crypt_data* cdata) {
  90.     mpz_out_str(stdout, 10, cdata->x);
  91.     printf("^");
  92.     mpz_out_str(stdout, 10, cdata->y);
  93.     printf("\n");
  94. }
  95.  
  96. void drawList(struct crypt_data* cdata) {
  97.     int i;
  98.    
  99.     printf("{");
  100.     for(i = 0; i < cdata->list_len; i++) {
  101.         if(i == 0)
  102.             printf(" %d", cdata->list[i]);
  103.         else
  104.             printf(", %d", cdata->list[i]);
  105.     }
  106.     printf(" }\n");
  107. }
  108.  
  109. void drawConvertedList(struct crypt_data* cdata) {
  110.     int i;
  111.     char* text = malloc((cdata->list_len + 1) * sizeof(char));
  112.    
  113.     for(i = 0; i < cdata->list_len; i++) {
  114.         text[i] = keyboard[findPrimePos(cdata->list[i])];
  115.     }
  116.    
  117.     text[cdata->list_len] = '\0';
  118.    
  119.     printf("%s", text);
  120. }
  121.  
  122. void drawInfo(struct crypt_data* cdata) {
  123.     printf("list = ");
  124.     drawList(cdata);
  125.    
  126.     printf("\na = ");
  127.     mpz_out_str(stdout, 10, cdata->a);
  128.    
  129.     printf("\nkey = ");
  130.     mpz_out_str(stdout, 10, cdata->key);
  131.    
  132.     printf("\nCryptText = ");
  133.     drawCipherText(cdata);
  134.    
  135.     printf("min = %d\n", cdata->min_char);
  136.     printf("max = %d\n", cdata->max_char);
  137. }
  138.  
  139. /* Calculate */
  140. void calcAnalise(struct crypt_data* cdata) {
  141.     mpz_t e, f, temp;
  142.     int i;              // charters
  143.    
  144.     //Init
  145.     mpz_init(e);
  146.     mpz_init(f);
  147.     mpz_init(temp);
  148.    
  149.     /* Maximum charters */
  150.     i = 1;
  151.    
  152.     mpz_mul_ui(e, cdata->x, 12000);
  153.     mpz_set_ui(f, 2);
  154.    
  155.     while(mpz_cmp(e, f) > 0) {
  156.         i++;
  157.        
  158.         mpz_set_ui(temp, 2);
  159.         mpz_pow_ui(temp, temp, i);
  160.         mpz_mul(f, f, temp);
  161.     }
  162.    
  163.     cdata->max_char = i;
  164.    
  165.     /* Minimum charters */
  166.     i = 1;
  167.    
  168.     mpz_add_ui(e, cdata->y, 1);         // (y + 1) is lowest key it can be
  169.     mpz_mul(e, cdata->x, e);       
  170.     mpz_set_ui(f, 293);                 // highest prime known
  171.    
  172.     while(mpz_cmp(e, f) > 0) {
  173.         i++;
  174.        
  175.         mpz_set_ui(temp, 293);
  176.         mpz_pow_ui(temp, temp, i);
  177.         mpz_mul(f, f, temp);
  178.     }
  179.    
  180.     cdata->min_char = i - 1;
  181.    
  182.     //Clear
  183.     mpz_clear(e);
  184.     mpz_clear(f);
  185.     mpz_clear(temp);
  186. }
  187.  
  188. /* Bruteforcer */
  189. int bruteforce(struct crypt_data* cdata, mpz_t progress_a, int level) {
  190.     if(level <= 0) {
  191.         return 0;
  192.     }
  193.    
  194.     int i;
  195.     mpz_t a, b, c;
  196.    
  197.     //Init
  198.     mpz_init(a);
  199.     mpz_init(b);
  200.     mpz_init(c);
  201.    
  202.     for(i = 0; i < 62; i++) {
  203.         mpz_set(a, progress_a);
  204.        
  205.         mpz_set_ui(b, prime[i]);
  206.         mpz_pow_ui(b, b, level);
  207.         mpz_mod(c, a, b);
  208.        
  209.         if(mpz_cmp_ui(c, 0) == 0) {
  210.             mpz_div(c, a, b);
  211.             if(mpz_cmp_ui(c, 1) == 0 || bruteforce(cdata, c, level - 1) == 1) {
  212.                 //printf("prime[%d] = %d\n", level, prime[i]);
  213.                
  214.                 cdata->list[level - 1] = prime[i];
  215.                
  216.                 mpz_clear(a);
  217.                 mpz_clear(b);
  218.                 mpz_clear(c);
  219.                 return 1;
  220.             }
  221.         }
  222.     }
  223.    
  224.     mpz_clear(a);
  225.     mpz_clear(b);
  226.     mpz_clear(c);
  227.     return 0;
  228. }
  229.  
  230. /* Encrypt & Decrypt */
  231. void decrypt(char* str_x, char* str_y, struct crypt_data* cdata) {
  232.     int i, j;
  233.     mpz_t temp, progress_a;
  234.    
  235.     //Init
  236.     mpz_init(temp);
  237.     mpz_init(progress_a);
  238.    
  239.     mpz_set_str(cdata->x, str_x, 10);
  240.     mpz_set_str(cdata->y, str_y, 10);
  241.    
  242.     calcAnalise(cdata);
  243.     cdata->list = malloc(cdata->max_char * sizeof(*(cdata->list)));
  244.    
  245.     for(i = mpz_get_ui(cdata->y) + 1; i < 12000; i++) {
  246.        
  247.         mpz_mul_ui(temp, cdata->x, i);
  248.         mpz_add(cdata->a, temp, cdata->y);      //a = y + (key * x)
  249.         mpz_set(progress_a, cdata->a);
  250.        
  251.         for(j = cdata->min_char; j < cdata->max_char; j++) {
  252.             if(bruteforce(cdata, progress_a, j) == 1) {
  253.                 cdata->list_len = j;
  254.                
  255.                 //End Loops
  256.                 i = 12000;
  257.                 j = cdata->max_char;
  258.             }
  259.             else
  260.             {
  261.                 cdata->list_len = 0;
  262.             }
  263.         }
  264.     }
  265.    
  266.     //Clear
  267.     mpz_clear(temp);
  268. }
  269.  
  270. void encrypt(char* input, int int_key, struct crypt_data* cdata) {
  271.     int i, j;
  272.     mpz_t temp;
  273.    
  274.     //Init
  275.     mpz_init(temp);
  276.    
  277.     mpz_set_ui(cdata->key, int_key);
  278.     cdata->list_len = strlen(input);
  279.     cdata->list = malloc(cdata->list_len * sizeof(*(cdata->list)));
  280.    
  281.     for(i = 0; i < cdata->list_len; i++) {
  282.         for(j = 0; j < 62; j++) {
  283.             if(input[i] == keyboard[j])
  284.                 cdata->list[i] = prime[j];
  285.         }
  286.     }
  287.    
  288.     mpz_set_ui(cdata->a, cdata->list[0]);
  289.     for(i = 1; i < cdata->list_len; i++) {
  290.         mpz_set_ui(temp, cdata->list[i]);
  291.        
  292.         //a *= list[i] ^ ( i + 1 )
  293.         mpz_pow_ui(temp, temp, i + 1);
  294.         mpz_mul(cdata->a, cdata->a, temp);
  295.     }
  296.    
  297.     //y = a % key
  298.     mpz_mod(cdata->y, cdata->a, cdata->key);
  299.    
  300.     //x = (a - y) / key
  301.     mpz_sub(temp, cdata->a, cdata->y);
  302.     mpz_div(cdata->x, temp, cdata->key);
  303.    
  304.     //Clear
  305.     mpz_clear(temp);
  306. }
  307.  
  308. /*
  309.     Found:
  310.         'V'                 5           55^2
  311.         'V'                 13          21^4
  312.         'V'                 45          6^7
  313.         'HJ'                13          1067796^11
  314.         'abcd'              1           150479977324775996363^0
  315.         'abcd'              13          11575382871136615104^11
  316.         'VAcD4'             22          56237954319988116321523858^13
  317.         'VKMAP VAcD4'       5           54306932426718011115164597401855430^1 247446999007947711814704977^4
  318. */
  319. void test() {
  320.     struct crypt_data cdata;
  321.    
  322.     //Init
  323.     cryptDataInit(&cdata);
  324.    
  325.     printf("Found:\n");
  326.    
  327.     /* ----------------------- */
  328.     encrypt("V", 5, &cdata);
  329.     printf("    ");
  330.     drawCipherText(&cdata);
  331.     /* ----------------------- */
  332.     encrypt("V", 13, &cdata);
  333.     printf("    ");
  334.     drawCipherText(&cdata);
  335.     /* ----------------------- */
  336.     encrypt("V", 45, &cdata);
  337.     printf("    ");
  338.     drawCipherText(&cdata);
  339.     /* ----------------------- */
  340.     encrypt("HJ", 13, &cdata);
  341.     printf("    ");
  342.     drawCipherText(&cdata);
  343.     /* ----------------------- */
  344.     encrypt("abcd", 1, &cdata);
  345.     printf("    ");
  346.     drawCipherText(&cdata);
  347.     /* ----------------------- */
  348.     encrypt("abcd", 13, &cdata);
  349.     printf("    ");
  350.     drawCipherText(&cdata);
  351.     /* ----------------------- */
  352.     encrypt("VAcD4", 22, &cdata);
  353.     printf("    ");
  354.     drawCipherText(&cdata);
  355.     /* ----------------------- */
  356.     encrypt("VKMAP", 5, &cdata);
  357.     printf("    ");
  358.     drawCipherText(&cdata);
  359.     encrypt("VAcD4", 5, &cdata);
  360.     printf("    ");
  361.     drawCipherText(&cdata);
  362.     /* ----------------------- */
  363.    
  364.     //Clear
  365.     cryptDataClear(&cdata);
  366. }
  367.  
  368. /*
  369.     CipherText:
  370.         2933070^67
  371.         3232427352382723^3475
  372.         33^8923
  373.         1752173996578580830630^3617
  374.         47^1205
  375.         1334324742249840763104115177915406053196992583180688299430^5620
  376. */
  377. void crack() {
  378.     struct crypt_data cdata;
  379.    
  380.     //Init
  381.     cryptDataInit(&cdata);
  382.    
  383.     decrypt("2933070", "67", &cdata);
  384.     drawConvertedList(&cdata);
  385.     printf(" ");
  386.     decrypt("3232427352382723", "3475", &cdata);
  387.     drawConvertedList(&cdata);
  388.     printf(" ");
  389.     decrypt("33", "8923", &cdata);
  390.     drawConvertedList(&cdata);
  391.     printf(" ");
  392.     decrypt("1752173996578580830630", "3617", &cdata);
  393.     drawConvertedList(&cdata);
  394.     printf(" ");
  395.     decrypt("47", "1205", &cdata);
  396.     drawConvertedList(&cdata);
  397.     printf(" ");
  398.     decrypt("1334324742249840763104115177915406053196992583180688299430", "5620", &cdata);
  399.     drawConvertedList(&cdata);
  400.     printf("\n");
  401.    
  402.     //Clear
  403.     cryptDataClear(&cdata);
  404. }
  405.  
  406. int main(int argc, char *argv[]) {
  407.     //test();
  408.     crack();
  409.    
  410.     return 0;
  411. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement