2016 12 3 問鼎杯線上賽6 2逆向分析

2022-07-29 02:21:14 字數 3719 閱讀 7289

這道題目的檔案給我們的是乙個壓縮包a2ia8-6-2.rar,解壓之後得到乙個crackme.exe和readme.txt

開啟readme.txt可以看到對我們目標的描述。

從這裡我們知道,這個就是逆向當中很平常的求serial計算演算法(或者更具提示暴力跑?這裡我們分析來逆向演算法),

並且我們也知道了8位name,還有4位不知道,得到name = ""但是我們可以根據序列號來計算出來.

拿到乙個程式之後,首先使用peid來查殼,這道題目沒有殼,先執行一遍(這裡先嘗試使用"")

可以看到這個就是輸入錯誤的時候,程式的反應了。。我們可以看到許多的關鍵字串。

直接將程式用od開啟(我這裡使用的是吾愛破解od(ps:竟然不能f8----0.0))

所以我們就先搜尋關鍵字串了,input name:    input serial:等  sorry等

我們可以看到許多的關鍵字,我們就先從在這幾個關鍵字的地方下斷,然後跟蹤程式執行。(ps:這裡我們有刪掉我之前分析的工程檔案)

我們從0x000b116d那裡開始單步執行,我們會看到程式依次輸出提示訊息,並且我們從將輸入一組name和serial資料進去,這裡我們輸入

name = "" 和中的序列號  serial = 78767-77666-76786-87788-77778-66867-66777-86767-66877-77778-88887

並且我們知道了我們輸入的資料是儲存在那個地方的。name = local16 , serial = local10

下好斷點之後,直接執行,然後程式就會停在我們下的斷點0x000b116d處,從這裡我們就開始單步動態除錯這個程式。

單步完成我們的輸入之後,我們就繼續分析。我們找到第乙個sorry的地方,在od裡右鍵分析**,就可以看到跳轉到錯誤輸出的位址。

繼續分析下去,我們會看到對name字串長度的檢測,等等之類的,但是我們要找的是生成serial的演算法,我們繼續單步分析,在下面看到了乙個關鍵的函式

我們找到了crackme.000b2080這個函式,這個函式執行完之後,就跳轉到系統暫停,然後就退出,所以我們跟進crackme.000b2080去看一下

(在除錯的過程中記錄name的位址),進入這個函式之後,我們單步除錯,慢慢地我們發現這乙個函式之前,傳入了name中的兩個字元作為引數。

我們看到程式傳遞了2個引數給crackme.000b1f30函式,我們跟進去看一下(在跟蹤的時候發現這個就是計算serial的關鍵函---)

發現了一堆位運算和加法運算,運算完之後將結果儲存下來(你可以觀察程式記憶體中的資料變化,最後要返回的時候,我可以看到記憶體中生成了乙個5位數的序列號)

他這裡是分批計算每一位的資料,然後儲存在臨時變數中。最後在總的儲存。

我們可以看到程式已經在儲存生成的資料了。(這裡注意第4和第5位,是儲存在ecx和ebx中的,)

第4和第5位我們可以倒退跟蹤上去找到它的最終表示式。。。在這個函式中,在結合readme.txt,我們發現serial一共有11個5位數,然後我們的name

是12位,並且前後組合生成序列號,總共計算11次之後,生成所有的序列號。所以得到下面的生成函式。

1

//decode(前乙個字元,後乙個字元,儲存結果的整形陣列指標)

2void decode(int forward, int back, int

re);

6 printf("

%c %c

", (char)forward, (char

)back);7//

temp = (forward & 1) + 6;

//forward % 2 + 6;8//

temp1 = (back >> 2 ) & 1;

//back / 4 % 29//

local3為第一位

10//

forward % 2+6+back / 4 % 2

11 local3 = (forward & 1) + 6 + ((back >> 2 ) & 1

);12 result[0] =local3;

13//

local4為第二位

14//

ecx = ((forward >> 3)& 1)+6;

//>> 3 == / 8; & 1 == % 2

15//

eax = (back >> 3) & 1;

16//

forward / 8 % 2 + 6 + back / 8 % 2;

17 local4 = ((forward >> 3)& 1)+6+((back >> 3) & 1

);18 result[1] =local4;

19//

local1為第三位

20//

forward / 2 % 2 + 6 + back / 8 % 2;

21 local1 = ((forward >> 1) & 1)+6 + ((back >> 4) & 1

);22 result[2] =local1;

23//

第4位在ecx即local2中

24 local2 = (back & 1 )+6+((forward>>2)&1

);25 result[3] =local2;

26//

第5位在ebx中

27 local5 = ((back >> 1) & 1)+6+((forward >> 4) & 1

);28 result[4] =local5;

29 printf("

%d%d%d%d%d

", result[0], result[1], result[2], result[3], result[4

]);30

for(i = 0; i < 5; i++)

33//

return result;

34 }

我們的name是,並且我們的正確序列號你是知道的,所以我們就可以用乙個爆破來將正確的name計算出來了。

最後的name是。好了,程式的主體就分析到這裡了。其他的自己去弄就行了。

好了,這道題目到這裡結束了。

第二屆戰神杯線上程式設計挑戰賽月賽第一題 回文數

njzy學習了回文串後聯想到了回文數,他希望統計出乙個區間內的全部回文數。如今給定乙個閉區間 a,b 求這個區間裡有多少個回文數。比方 20,30 僅僅有乙個回文數那就是22.輸入描寫敘述 輸入包括多組測試資料,每組測試資料報括兩個整數a,b,0輸出描寫敘述 對於每組測試資料輸出對應的答案。輸入例子...

河南省藍橋杯第九屆省賽 6 航班時間

題目描述 問題背景 小h前往美國參加了藍橋杯國際賽。小h的女朋友發現小h上午十點出發,上午十二點到達美國,於是感嘆到 現在飛機飛得真快,兩小時就能到美國了 小h對超音速飛行感到十分恐懼。仔細觀察後發現飛機的起降時間都是當地時間。由於北京和美國東部有12小時時差,故飛機總共需要14小時的飛行時間。不久...

第六屆藍橋杯校內選拔賽C C 高職組解題(6)

形如 1 a 的分數稱為單位分數。可以把1分解為若干個互不相同的單位分數之和。例如 1 1 2 1 3 1 9 1 18 1 1 2 1 3 1 10 1 15 1 1 3 1 5 1 7 1 9 1 11 1 15 1 35 1 45 1 231 等等,類似這樣的分解無窮無盡。我們增加乙個約束條件...