這道題目的檔案給我們的是乙個壓縮包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我們的name是,並且我們的正確序列號你是知道的,所以我們就可以用乙個爆破來將正確的name計算出來了。//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是。好了,程式的主體就分析到這裡了。其他的自己去弄就行了。
好了,這道題目到這裡結束了。
第二屆戰神杯線上程式設計挑戰賽月賽第一題 回文數
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 等等,類似這樣的分解無窮無盡。我們增加乙個約束條件...