天天看點

攻防世界 - reverse - open-source

A、程式分析

unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;      

擷取 first 、second 、 strlen(argv[3]) 值進行計算即可

B、資料擷取

  1、

unsigned int first = atoi(argv[1]);
    if (first != 0xcafe) {
    	printf("you are wrong, sorry.\n");
    	exit(2);
    }
      

  first = 0xcafe

 2、

unsigned int second = atoi(argv[2]);
    if (second % 5 == 3 || second % 17 != 8) {
    	printf("ha, you won't get it!\n");
    	exit(3);
    }      

     second % 5 != 3 && second%17 ==8

3、

if (strcmp("h4cky0u", argv[3])) {
    	printf("so close, dude!\n");
    	exit(4);
    }
      

 strlen(argv[3]) ==  strlen("h4cky0u")

C、代碼

#include <stdio.h>

#include <string.h>

int main(int argc, char *argv[]) {

    unsigned int second =0;

    unsigned int i=0;

    while(1)

    {

        if(i%5!=3 && i%17 ==8)

        {

            second = i;

            break;

        }

        i++;

    }

    printf("Brr wrrr grr\n");

    unsigned int hash = 0xcafe * 31337 + (second % 17) * 11 + strlen("h4cky0u") - 1615810207;

    printf("Get your key: ");

    printf("%x\n", hash);

    return 0;

}