【攻防世界】open-source


知識點:鍛煉分析代碼的能力

難度系數: 3.0

題目來源: HackYou CTF

題目描述:菜雞學逆向學得頭皮發麻,終於它拿到了一段源代碼

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

方法1.開始分析:

  1. 必須滿足輸入4個參數(文件名本身也算一個參數)即: 文件名.exe(參數0) 參數1 參數2 參數3
 if (argc != 4) { 
        printf("what?\n");
        exit(1);
    }

點擊並拖拽以移動

\2. 第二個參數等於 0xcafe 即:51966

其中atoi函數,是把字符串轉為數字,如atoi("123")就是數字123

 unsigned int first = atoi(argv[1]);
    if (first != 0xcafe) {      //要求二
    	printf("you are wrong, sorry.\n");
    	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!\n"); //參數對5取余不能等於3,且對17取余等於8
    	exit(3);
    }

點擊並拖拽以移動

4.第四個參數是:h4cky0u

   if (strcmp("h4cky0u", argv[3])) {
    	printf("so close, dude!\n");     //第四個參數是"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\n", hash);
    
	return 0;
}

點擊並拖拽以移動

源代碼及簡單分析:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if (argc != 4) {             //要求1,輸入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"); //參數對5取余不能等於3,且對17取余等於8
    	exit(3);
    }

    if (strcmp("h4cky0u", argv[3])) {
    	printf("so close, dude!\n");     //第四個參數是"h4cky0u"
    	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;
}

點擊並拖拽以移動


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM