• XCTF-open-source


    下载附件拿到源码。

    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char *argv[]) {
        if (argc != 4) {
        	printf("what?
    ");
        	exit(1);
        }
    
        unsigned int first = atoi(argv[1]);
        if (first != 0xcafe) {
        	printf("you are wrong, sorry.
    ");
        	exit(2);
        }
        
        unsigned int second = atoi(argv[2]);
        if (second % 5 == 3 || second % 17 != 8) {
        	printf("ha, you won't get it!
    ");
        	exit(3);
        }
    
        if (strcmp("h4cky0u", argv[3])) {
        	printf("so close, dude!
    ");
        	exit(4);
        }
    
        printf("Brr wrrr grr
    ");
    
        unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;
    
        printf("Get your key: ");
        printf("%x
    ", hash);
        return 0;
    }
    

    这是段C语言的源码。拿到变量hash的值就是flag。一共四个if条件。
    第一个if:argc为表示传参的个数,这里判断是不是四个参数

    if (argc != 4) {
        	printf("what?
    ");
        	exit(1);
        }
    

    第二个if:atoi函数把字符串转成整型(int型)。oxcafe转成整型为:

    unsigned int first = atoi(argv[1]);
        if (first != 0xcafe) {
        	printf("you are wrong, sorry.
    ");
        	exit(2);
        }
    

    第三个if:||运算符只要前一部分成立就不会看后一部分,满足条件会输出“"ha, you won't get it!”,我们让second=25,不满足这个if条件。

    unsigned int second = atoi(argv[2]);
        if (second % 5 == 3 || second % 17 != 8) {
        	printf("ha, you won't get it!
    ");
        	exit(3);
        }
    

    第四个if:strcmp会根据 ASCII 编码依次比较 str1 和 str2 的每一个字符,直到出现不到的字符,或者到达字符串末尾(遇见)
    如果返回值 < 0,则表示 str1 小于 str2。
    如果返回值 > 0,则表示 str2 小于 str1。
    如果返回值 = 0,则表示 str1 等于 str2。
    让argv[3]='h4cky0u',则if判断为假,不进入if后的运算。

    if (strcmp("h4cky0u", argv[3])) {
        	printf("so close, dude!
    ");
        	exit(4);
        }
    

    最后求hash的值:
    first =0xcafe,
    second=25
    strlen(argv[3])=7

    unsigned int hash = 0xcafe * 31337 + (25% 17) * 11 + 7 - 1615810207;
    

    最后以16进制输出

     printf("%x
    ", hash);
    

    用python写解题脚本:

    a = int('0xcafe',16)   #把16进制的0xcafe转成int型
    hash = a * 31337 + (25% 17) * 11 + 7 - 1615810207;
    print(hex(hash))
    

    得到0xc0ffee,flag为c0ffee

  • 相关阅读:
    register_shutdown_function
    字节转换
    考虑 PHP 5.0~5.6 各版本兼容性的 cURL 文件上传
    linux--svn checkout
    linux命令
    linux---mysql忘记密码
    array_merge函数的注意事项
    逻辑卷使用记录笔记
    系统设计时关于性能问题处理的几点心得
    SSH防暴力破解脚本
  • 原文地址:https://www.cnblogs.com/HelloCTF/p/13111874.html
Copyright © 2020-2023  润新知