源码分析
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc != 4) {
printf("what?\n");
exit(1);
}
unsigned int first = atoi(argv[1]);
if (first != 0xcafe) {
printf("you are wrong, sorry.\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("h4cky0u", argv[3])) {
printf("so close, dude!\n");
exit(4);
}
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;
}
首先,题目给了一段源码,让我们从源码中找出flag,那我们就来看看源码的运行过程
0x01:
if (argc != 4) {
printf("what?\n");
exit(1);
}
这段代码的要求是我们必须传入4个参数,我们分别用参数1,2,3,4来表示4个参数,来分析一下
argc=1,表示只有一程序名称。
argc=2,表示除了程序名外还有一个参数。
argc=3,表示除了程序名外还有两个参数。
argv[0]指向输入的程序路径及名称。
argv[1]指向参数1的字符串。
argv[2]指向参数2的字符串。
现在我们已经了解了源码中所要传入的参数个数以及argv[]代表的含义,那么这里面还有一个函数需要强调一下,就是atoi(),这个函数是表示将字符串转换为整数,所以后面我们才看到了整数之间的运算。
0x02:
unsigned int first = atoi(argv[1]);
if (first != 0xcafe) {
printf("you are wrong, sorry.\n");
exit(2);
}
第二个代码段分析,这段代码意思是说如果first不等于0xcafe就退出程序,那我们肯定不能让它退出,所以这里我们就得到了一个关键点,就是first=0xcafe
0x03:
unsigned int second = atoi(argv[2]);
if (second % 5 == 3 || second % 17 != 8) {
printf("ha, you won't get it!\n");
exit(3);
}
第三段代码,这段代码经过分析发现是数学上的取余运算,同样,想要使程序不退出,那就的不满足它的条件,这里经过运算直接让second=25即可不满足条件,所以从这段代码我们知道了second=25
0x04:
if (strcmp("h4cky0u", argv[3])) {
printf("so close, dude!\n");
exit(4);
}
这段就更简单了,我们直接让argv[3]="h4cky0u"即可。经过以上的分析我们知道了几个参数需要满足的条件,进而推出了参数的值,那我们接着往下看
0x05:
unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;
printf("Get your key: ");
printf("%x\n", hash);
这里直接打印出key,那么我们得让它打印,如何打印呢,就要赋值给未知的参数,那么我们稍微改动一下。
#include <stdio.h>
#include <string.h>
unsigned int hash = 0xcafe * 31337 + 8 * 11 + strlen("h4cky0u") - 1615810207;
printf("Get your key: ");
printf("%x\n", hash);
return 0;
}
我来解释一下,首先first=0xcafe这个没什么问题,这里强调一下0xcafe是十六进制的表示方式,不是字符串。其次,second=25 那么second%17=8,直接赋值给8就行。最后argv[3]=“h4cky0u”,直接替换,然后执行代码,看看输出结果。
输出结果如下:
Get your key: c0ffee
那么到这里我们就喝到coffee了~~
总结
本题考查的就是对源代码的分析,源代码不长,所以有耐心一步步分析即可得到正确flag