题目:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc != 4) {
printf("what?\n");
exit(1);
}
unsigned int first = atoi(argv[1]);
if (first != 0xcaffe) {
printf("sorry, you are wrong.\n");
exit(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 (strcmp("tboxcloud", argv[3])) {
printf("so close, dude!\n");
exit(4);
}
printf("Brr wrr grr\n");
unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;
printf("Get your key: ");
printf("%x\n", hash);
return 0;
}
题解:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
if (argc == 4) {//修改条件
printf("what?\n");
exit(1);
}
unsigned int first = atoi(argv[1]);
first = 0xcaffe;//直接赋值
if (first != 0xcaffe) {
printf("sorry, you are wrong.\n");
exit(2);
}
unsigned int second = atoi(argv[2]);
second=25;//0到1000爆破一下符合条件的,一般来说是最小的,实在不行整体爆破
//爆破代码:
// for(i=1;i<1000;i++)
// if(i % 5 != 3 && i % 17 == 8)
// cout<<i<<endl;
if (second % 5 == 3 || second % 17 != 8) {
printf("ha, you won't get it!\n");
exit(3);
}
if (strcmp("tboxcloud","tboxcloud")) {//直接修改,如果不一样就退出了,那就直接让他一样
printf("so close, dude!\n");
exit(4);
}
printf("Brr wrr grr\n");
unsigned int hash = first * 31337 + (second % 17) * 11 + strlen("tboxcloud") -1615810207;
//直接吧strlen里面的替换掉就可以了
printf("Get your key: ");
printf("%x\n", hash);
cout<<"flag{"<<hash<<"}";//把外面的表识加上
return 0;
}