open-source

源码分析

#include 
#include 

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 
#include 
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

你可能感兴趣的:(CTF—reverse)