CTF題解二 逆向 大雜燴(ISCC2017)

將CrackMe.exe拖進IDA進行分析

1.首先看main函數:

這裏寫圖片描述
sub_401210()的返回值應該爲1,所以!sub_401210()爲0,進入else。

2.觀察sub_401210函數:

這裏寫圖片描述

可以看到需要滿足5個if,才能使得返回值爲1。

  • 第一個if:

可以看出v1的長度爲25,v1[4]爲 ‘{‘,v1[8]、v1[10]、v1[15]爲’_’,v1[24]爲’}’

v1應該就是flag了,那麼其前四位應該就是’flag’這四個字母。

到目前爲止,v1爲:flag{XXX_X_XXXX_XXXXXXXX}

通過百度可以查到,wcstok是用來對wchar_t類型的數進行分割的。wcstok(v1, L"{_}")這句話就是表示對v1在’{‘、’_’、’}’這幾個字符處進行分割。

第一次分割,碎片’flag’被遺棄。第二次分割,v4等於XXX。

  • 第二個if:

把6815860轉換爲16進製得到0x680074,0x74對應t,0x68對應h。所以這裏說明v4等於thX

另外v4[4]表示X爲’4’

v5是X,v6是將v5轉換成了int型。

  • 第三個if:

說明v6等於4,

X爲’4’。

v7等於XXXX。

  • 第四個if:

sub_401000(v7)的返回值需要爲1。

v8等於XXXXXXXX。

  • 第五個if:

sub_401800(v8)的返回值需要爲1。

3.觀察sub_401000()函數:

這裏寫圖片描述

如果要返回值爲1,則v6不能等於0

如果v4和”62cc0b4ebb0b57b40778179234246c38”相等,則v6等於1。

62cc0b4ebb0b57b40778179234246c38爲MD5加密後的結果,解密得your。

your應該就是flag中的XXXX了。

4.觀察sub_401180()函數:

這裏寫圖片描述

v1爲輸入,v2爲v1轉化爲多字節之後得到的結果。

v2的每一位異或0x66等於20 3 1 15 21 18 3 20

得到v2的每一位爲:114 101 103 105 115 116 101 114

所以最後八位爲register

異或代碼爲:

int a[9] = { 20,3,1,15,21,18,3,20 };
int count = 0;
int k = 0;
while (k < 8) {
    for (int i = 0; i < 128; i++) {
        int c = i ^ 0x66;
        if (c == a[count]) {
            printf("%c", i);
            count++;
            break;
        }
    }
    k++;
}
5.得到flag:

flag爲:

flag{thx_4_your_register}

其中’x’是猜的
解決了~( ̄▽ ̄~)~

發佈了48 篇原創文章 · 獲贊 13 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章