目錄
- Yet another crackme (or rather keygenme).
- (1)簡單:通過補丁,打開/關閉所有5個功能,
- (2)中等:生成任意功能開啟/關閉的序列號
Yet another crackme (or rather keygenme).
Executables: Linux x64 Windows x64
It is just to be run with name
and serial number as command line arguments. Valid ones are:
2Z7A7-EK270-TMHR4-BHC71-CEB52-HELL0-HELL0-EONP9
2Z7A7-6I7R9-MZGO9-FDQJ3-JN0Q6-HELL0-HELL0-72KJ9The first serial number has E feature turned off, the second has E
feature turned on. There are two tasks: Easy: by patching, turn on/off
all 5 features. Medium: generate a serial number with arbitrary
features turned on/off. Good luck!
(它只是以名稱和序列號作為命令列引數來運行,有效的有:
2Z7A7-EK270-TMHR4-BHC71-CEB52-HELL0-HELL0-EONP9
2Z7A7-6I7R9-MZGO9-FDQJ3-JN0Q6-HELL0-HELL0-72KJ9
第一個序列號關閉了E功能,第二個序列號打開了E功能,
有兩個任務:
簡單:通過補丁,打開/關閉所有5個功能,
介質:生成任意功能開啟/關閉的序列號,
好運!)
hint:
https://down.52pojie.cn/Tools/Debuggers/x64dbg_2018-04-05.zip
https://stackoverflow.com/questions/5475790/how-to-disassemble-the-main-function-of-a-stripped-application
(1)簡單:通過補丁,打開/關閉所有5個功能,
首先我們輸入2Z7A7-6I7R9-MZGO9-FDQJ3-JN0Q6-HELL0-HELL0-72KJ9查看一下輸出的結果

然后再觀察一下2Z7A7-EK270-TMHR4-BHC71-CEB52-HELL0-HELL0-EONP9輸出結果

發現最后一位會相反,而其他的都會全部相同,如果想要某一個全開,某一個全關的話,肯定不能改跳轉,因為改完跳轉之后兩個結果的ABCD 功能始侄訓保持一樣,所以我們發現在跳轉前有一個and 常數 的操作,并且輸入兩個碼會發現與常數進行AND的資料都不一樣,所以我們可以通過控制and后的常數來進行控制跳轉兩個碼對應的跳轉,
我們發現2Z7A7-6I7R9-MZGO9-FDQJ3-JN0Q6-HELL0-HELL0-72KJ9與常數進行與運算的資料分別為F8、43、EF、5A、CF
而2Z7A7-EK270-TMHR4-BHC71-CEB52-HELL0-HELL0-EONP9是7A、EF、DB、1E、F4
所以我們將第一個常數改為和F8與運算之后為0但是和7A與運算后不為0的資料,可以改為0x40,其他四位同理進行修改
運行到下圖所示的關鍵地方,對資料進行修改

將0x40改成0x2,0x1改成0x20,0x2改成0x10,0x8改成0x4,如下圖所示:

之后進行保存,然后進行運行,結果如下圖所示:

(2)中等:生成任意功能開啟/關閉的序列號
第一步:

是從第一個HELLO開始到第二個HELLO結束做了比較,并且很容易可以發現這里如果輸入別的資料將會報錯說格式錯誤,
所以初步確定格式應該是xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-HELL0-HELL0xxxxxx
第二步:
在IDA里找到如下所示的代碼,發現它的功能是檢測每隔5位是否為“-”符號,即從第六位開始:

所以格式可以進一步確定為
xxxxx-xxxxx-xxxxx-xxxxx-xxxxx-HELL0-HELL0-xxxxx
然后會發現每五位會進行一次處理,處理的大致步驟是:
首先判斷我們輸入的是數字還是大寫字母還是其他,如果輸入其他的話就是非法的字符,會報錯;
如果輸入的是數字的話就減去0x30;
如果輸入的是大寫字母的話就減去0x37,然后所獲得的值分別存入arr[4],arr[3],arr[2],arr[1],arr[0]中;
然后再進行Result=arr[4]+36*(arr[3]+36*(arr[2]+36*(arr[1]+36*arr[0]))))的操作,最后將Result存入到記憶體中去,
存到記憶體中的這一串資料在之后校驗的程序中有重要作用.
假設這段資料的首地址為S
第三步:
我們在IDA中找到如圖所示代碼

這個判斷是S[0]<<24+S[1]<<16+S[2]<<8+S[3]得到的資料和0XBEBAADDE進行比較,這里需要兩個資料相等.所以前五位必須是2Z7A7

發現這里有一個很多判斷條件的if陳述句,但是真正有用的判斷只有v4<1,v3<1,v5<0x7e0,v5>0x834,v4>0xc,v3>0x1f和sub_1400010B0函式,這里的條件應該全部判斷為假,即1<S[6]<0xc,
0x7E0<(S[4]<<8)+S[5]<0x834,
0x1<S[7]<0x1f
且函式sub_1400010B0運算后的資料得等于S[16-23]十六進制組成的資料
經過分析v4是S[6],v3是S[7],v5是S[4]<<8+S[5].
如果這里驗證通過的話,就會執行開啟和關閉功能的代碼:

用S[8]和0x40進行與運算,判斷是否開啟A功能,同理S[9],S[10],S[11],S[12]均會進行這樣的操作.
所以綜合分析后:
11111-22222-33333-44444-55555-HELL0-HELL0-66666
1處必須填入2Z7A7
2處填入的資料必須滿足得到的S[3]=0xBE0x7E0<(S[4]<<8)+S[5]<0x834,
3處填入的資料滿足1<S[6]<0xc,0x1<S[7]<0x1f
4,5處填入的資料就是根據需求對功能進行選擇
在6處填入的資料就需要滿足整串資料的校驗碼符合等于S[16-23]十六進制組成的資料
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260016.html
標籤:其他
上一篇:Api-手機號碼攜號轉網介面詳情
下一篇:2021美賽什么時候出成績?
