• 【攻防世界】open-source


    知识点:锻炼分析代码的能力

    难度系数: 3.0

    题目来源: HackYou CTF

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

    源程序整到最下面吧,太长了

    方法1.开始分析:

    1. 必须满足输入4个参数(文件名本身也算一个参数)即: 文件名.exe(参数0) 参数1 参数2 参数3
     if (argc != 4) { 
            printf("what?
    ");
            exit(1);
        }
    

    点击并拖拽以移动

    2. 第二个参数等于 0xcafe 即:51966

    其中atoi函数,是把字符串转为数字,如atoi("123")就是数字123

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

    点击并拖拽以移动

    3.第三个参数对5取余不能等于3,且对17取余等于8,发现自然数25就可以

      unsigned int second = atoi(argv[2]);
        if (second % 5 == 3 || second % 17 != 8) {
        	printf("ha, you won't get it!
    "); //参数对5取余不能等于3,且对17取余等于8
        	exit(3);
        }
    

    点击并拖拽以移动

    4.第四个参数是:h4cky0u

       if (strcmp("h4cky0u", argv[3])) {
        	printf("so close, dude!
    ");     //第四个参数是"h4cky0u"
        	exit(4);
        }
    

    点击并拖拽以移动

    最后:命令行运行a.exe 51966 25 h4cky0u

    得到flag : Get your key: c0ffee

    方法2:直接改程序本身--》让程序直接输出flag:

    把恶心的判断句子以及参数都去掉!

    img点击并拖拽以移动img点击并拖拽以移动

    因为4个条件判断句都给了我们如下的答案提示,不用去算了,直接把三个参数的值改到程序上去

    first = 0xcafe , (second%17)= 8 ,strlen(argv[3]) = strlen("h4cky0u")

    #include <stdio.h>
    #include <string.h>
    
    int main() {
    	
        unsigned int hash = 0xcafe * 31337 + 8 * 11 + strlen("h4cky0u") - 1615810207;
        
    	printf("Get your key: ");
        
    	printf("%x
    ", hash);
        
    	return 0;
    }
    

    点击并拖拽以移动

    源代码及简单分析:

    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char *argv[]) {
        if (argc != 4) {             //要求1,输入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!
    "); //参数对5取余不能等于3,且对17取余等于8
        	exit(3);
        }
    
        if (strcmp("h4cky0u", argv[3])) {
        	printf("so close, dude!
    ");     //第四个参数是"h4cky0u"
        	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;
    }
    

    点击并拖拽以移动

  • 相关阅读:
    面试题--基础
    面试题---flask
    vue---07 支付和订单
    企业真题
    vue --06 购物车的实现
    Three.js 开发机房(四)
    Three.js 开发机房(三)
    Three.js 开发机房(二)
    Three.js 开发机房(一)
    Three.js 前言
  • 原文地址:https://www.cnblogs.com/h3zh1/p/12549090.html
Copyright © 2020-2023  润新知