天天看點

攻防世界逆向入門題之open-source

攻防世界逆向入門題之open-source

繼續開啟全棧夢想之逆向之旅~

這題是攻防世界逆向入門題的open-source

攻防世界逆向入門題之open-source

下載下傳附件得到源碼:

#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) {//第一個參數的十六進制為0xcafe
    	printf("you are wrong, sorry.\n");
    	exit(2);
    }

    unsigned int second = atoi(argv[2]);
    if (second % 5 == 3 || second % 17 != 8) {//第二個參數滿足條件我口算有42
    	printf("ha, you won't get it!\n");
    	exit(3);
    }

    if (strcmp("h4cky0u", argv[3])) {//第三個參數直接就是h4cky0u
    	printf("so close, dude!\n");
    	exit(4);
    }

    printf("Brr wrrr grr\n");

    unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;//這裡的結果hash與前面輸入參數有關,鄙人不才,曾一度想修改源碼不輸入參數直接輸出這句話,當然,沒有參數的這句話就會報錯。

    printf("Get your key: ");
    printf("%x\n", hash);
    return 0;
}
           

一開始第二個條件停了會,畢竟做題經驗太少了,atoi傳回的是字元串的整形,0xcafe是十六進制,整形和十六進制比較C語言内部會進行進制轉換,一開始我用了十六進制轉文本:

攻防世界逆向入門題之open-source

現在想想都羞愧~

應該用進制轉換工具才對:

攻防世界逆向入門題之open-source

是以到此所有參數都解出來了,第一個是51966,第二個是42,第三個是h4cky0u.

在kali虛拟機中編譯,指令行接受參數執行即可:

gcc 1.c
./1.c 51966 42 h4cky0u
           

後來看别人做法還發現了其他解法,第一個是直接修改源碼,其實也對,源碼在手當然是充分利用源碼的優勢才對,直接把hash輸出語句替換成

即可,反正C語言内部會自己轉換,記得把第二個0xcafe處的判斷語句用注釋掉即可。