题目描述:菜鸡学逆向学得头皮发麻,终于它拿到了一段源代码
C源代码

编译完后,开始分析代码
第一个判断条件
1 2 3 4 5
| int main(int argc, char *argv[]) { if (argc != 4) { printf("what?\n"); exit(1); }
|
判读输入的参数是否满足4个,文件名本身也算一个所以输入文件名加三个参数即可,程序就会继续执行
CMD:文件名 1 2 3
第二个判断条件
1 2 3 4 5
| unsigned int first = atoi(argv[1]); if (first != 0xcafe) { printf("you are wrong, sorry.\n"); exit(2); }
|
判断第一个参数是否等于0xcafe转化为十进制等于51966,等于程序就继续执行
atoi函数是将字符串转化为数字
CMD:文件名 51966 2 3
第三个判断条件
1 2 3 4 5
| unsigned int second = atoi(argv[2]); if (second % 5 == 3 || second % 17 != 8) { printf("ha, you won't get it!\n"); exit(3); }
|
当参数对5取余等于3,并且对17取余不等于8时就会退出程序
编写代码,25,42,59,76都能满足条件
1 2 3 4 5 6 7
| i = 0 while(i<100): if i%5==3 or i%17!=8: pass else: print i i = i+1
|

CMD:文件名 51966 25 3
第三个参数
strcmp函数比较两个字符串如果相等,返回值就是0,为0就不会进入if条件中的代码
CMD:文件名 51966 25 h4cky0u
1 2 3 4
| if (strcmp("h4cky0u", argv[3])) { printf("so close, dude!\n"); exit(4); }
|
最终结果

方法二:
直接把三个参数的值固定,带入到hash函数中直接运算出结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <stdio.h> #include <string.h>
int main() {
int first = 0xcafe; int second = 25; char *argv = "h4cky0u"; unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv) - 1615810207; printf("Get your key: "); printf("%x\n", hash); return 0; }
|
输出结果:
Get your key: c0ffe