攻防世界逆向入門題之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語言内部會進行進制轉換,一開始我用了十六進制轉文本:
現在想想都羞愧~
應該用進制轉換工具才對:
是以到此所有參數都解出來了,第一個是51966,第二個是42,第三個是h4cky0u.
在kali虛拟機中編譯,指令行接受參數執行即可:
gcc 1.c
./1.c 51966 42 h4cky0u
後來看别人做法還發現了其他解法,第一個是直接修改源碼,其實也對,源碼在手當然是充分利用源碼的優勢才對,直接把hash輸出語句替換成
即可,反正C語言内部會自己轉換,記得把第二個0xcafe處的判斷語句用注釋掉即可。