open-source
打开源码

分析可知29行在计算flag
29行代码就是利用argv[1]、argv[2]、argv[3]的数据计算
argv[1]
unsigned int first = atoi(argv[1]);
if (first != 0xcafe) {
printf("you are wrong, sorry.\n");
exit(2);
}
如果不等于0xcafe就会退出,所以argv[1]=0xcafe
argv[2]
unsigned int second = atoi(argv[2]);
if (second % 5 == 3 || second % 17 != 8) {
printf("ha, you won't get it!\n");
exit(3);
}
如果满足if条件就会退出,所以要找不满足的第一个数,argv[2]=25
argv[3]
if (strcmp("h4cky0u", argv[3])) {
printf("so close, dude!\n");
exit(4);
}
如果strcmp里面的数据相等返回0,所以argv[3]=h4cky0u
综上,写出解密代码
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int first=0xcafe;
int second=25;
argv[3]="h4cky0u";
printf("Brr wrrr grr\n");
unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;
printf("Get your key: ");
printf("%x\n", hash);
return 0;
}


浙公网安备 33010602011771号