這是我做reverse的題解。在咱逆向之路上的mark一下,,水平有限,大牛見笑。
?
題目及題解鏈接:http://pan.baidu.com/s/1gd3k2RL
宗女齊姜
果然是僅僅有50分的難度,OD直接找到了flag.
?
找到殺手
這題用OD做非常麻煩。我改用IDA了。又是秒破
將圖中字符串輸入,程序生成了四張撲克牌圖片。題目讓依據密文判斷。就4個字符串,一個一個試最多4次就出來了,哈哈
?
?
避難母國
這題挺有意思的,總共要經過13次聽取建議,太麻煩,在第一次是Andy后,以后都用改變寄存器狀態的方式跳過剩下的環節。最后程序打印出flag。
?
流亡齊國
用不成OD了,用Reflector得到關鍵函數的源代碼
但是我不會C#啊,找到精通C#的同學得到解密函數,并取得了flag.
?
?
?
?
何去何從
這題貌似簡單。事實上就是簡單,當然做出來了就感覺簡單,事實上有一個陷阱,僅僅要發現了就OK了。
這道題非常有誘惑性,按正常的思路非常快就得到了一個flag-like的家伙。
是vc 6.0的程序,非常easy就找到了main函數
進入后
當中的凝視是所有做完后的凝視。第一遍時非常正常的跳過了當中凝視為“不能調”、“這才是關鍵”的那部分代碼,進入了凝視為“關鍵進入”的函數,
?
?
這個函數首先經過0x13次的循環生成“(3q^;^3lfjq&D7V4Hhd”,然后與輸入的字符串比較。相等則顯示“是這個么”,不等則顯示“錯了”。似乎flag已經找到了,真對不起200分的價值是不是?,但是提交時卻發現不對,難道要對這個字符串做什么變換么?僅僅能回去再細致看看程序了。
又到了這一步,按程序的意思是。jnz是一定會跳的,可是里邊的兩個函數有什么用呢,于是決定進去看看,強制改了跳轉。F8跳過第二個函數后,程序打印出
,于是進去看看。
到了這一步,
再跟進去瞧瞧,
這和之前生成的那個0x13長的偽flag的生成算法是一樣的。執行完后在內存中找到這個字符串“(3q&vf2vw%f7Vj9Ookj”,這個就是FLAG了!
逃離臨淄
?
執行程序如圖
在程序函數中找到了GetWindowTextA函數,下斷點,
在編輯框中隨便輸入點東西后點“注冊”。到斷點
調用兩次這個函數。得到注冊名和注冊碼。存在0x18CD98和0x18CDB8處
在下圖這個函數中會對注冊碼進行變形
進入后
004016C0? /$?8B5424 04???? mov edx,dword ptrss:[esp+0x4]
004016C4? |.?57??????????? push edi
004016C5? |.?8BFA????????? mov edi,edx
004016C7? |.?83C9 FF?????? or ecx,0xFFFFFFFF
004016CA? |.?33C0????????? xor eax,eax
004016CC ?|.?F2:AE???????? repne scas byte ptres:[edi]
004016CE? |.?F7D1????????? not ecx
004016D0? |.?49??????????? dec ecx
004016D1? |.?83F9 1F?????? cmp ecx,0x1F???????????????? 推斷長度是否為0x1f
004016D4? |.? 7406???????? je XCrackMe?004016DC
004016D6? |.?32C0????????? xor al,al
004016D8? |.?5F??????????? pop edi
004016D9? |.? C20800?????? retn 0x8
004016DC? |>?8B4424 0C???? mov eax,dword ptrss:[esp+0xC]
004016E0? |.?53??????????? push ebx
004016E1? |.?56??????????? push esi
004016E2? |.?8BF2????????? mov esi,edx
004016E4? |.?8BC8????????? mov ecx,eax
004016E6? |.?2BF0????????? sub esi,eax
004016E8? |.? BF1F000000?? mov edi,0x1F
004016ED? |>?8A040E??????? /mov al,byte ptrds:[esi+ecx]
004016F0? |.? 3C30???????? |cmp al,0x30
004016F2? |.? 7C17???? ????|jl XCrackMe?
0040170B
004016F4? |.? 3C39???????? |cmp al,0x39
004016F6? |.? 7F13???????? |jg XCrackMe?
0040170B
004016F8? |.?0FBEC0??????? |movsx eax,al
004016FB? |.?83E8 2B?????? |sub eax,0x2B
004016FE? |.? BB0A000000?? |mov ebx,0xA
00401703? |.? 99??????????? |cdq
00401704? |.?F7FB????????? |idiv ebx
00401706? |.?80C2 30?????? |add dl,0x30
00401709? |.? EB34???????? |jmp XCrackMe?0040173F???????? (數字-2B)/ A 取余
0040170B? |>?3C 41???????? |cmp al,0x41
0040170D? |.? 7C17???????? |jl XCrackMe?00401726
0040170F? |.? 3C5A???????? |cmp al,0x5A
00401711? |.? 7F13???????? |jg XCrackMe?00401726
00401713? |.?0FBEC0??????? |movsx eax,al
00401716? |.?83E8 34?????? |sub eax,0x34
00401719? |.? BB1A000000?? |mov ebx,0x1A
0040171E? |.?99??????????? |cdq
0040171F? |.?F7FB????????? |idiv ebx
00401721? |.?80C2 41?????? |add dl,0x41
00401724? |.? EB19???????? |jmp XCrackMe?
0040173F???????? (大寫-0x34) / 1A 取余
00401726? |>?3C 61???????? |cmp al,0x61
00401728? |.? 7C17???????? |jl XCrackMe?
00401741
0040172A ?|.? 3C7A???????? |cmp al,0x7A
0040172C? |.? 7F13???????? |jg XCrackMe?00401741
0040172E? |.?0FBEC0??????? |movsx eax,al
00401731? |.?83E8 54?????? |sub eax,0x54
00401734? |.? BB1A000000?? |mov ebx,0x1A
00401739? |.?99??????????? |cdq
0040173A? |.? F7FB????????? |idiv ebx
0040173C? |.?80C2 61?????? |add dl,0x61???????????????? (小寫-0x54) / 1A 取余
0040173F? |>?8AC2????????? |mov al,dl
00401741? |>?8801????????? |mov byte ptrds:[ecx],al
00401743? |.?41??????????? |inc ecx
00401744? |.?4F??????????? |dec edi
00401745? |.^ 75 A6???????? \jnz XCrackMe?004016ED
00401747? |.?5E??????????? pop esi
00401748? |.?5B??????????? pop ebx
00401749? |.? B001???????? mov al,0x1
0040174B? |.?5F??????????? pop edi
0040174C? \.? C20800?????? retn 0x8
跳出這個函數后
下面都是對變形后的字符串進行的推斷。
推斷了三位。
再然后
是對后十位的比較,將后十位變成整形后與EDI比較。edi由下圖函數得到
?
?
?
還好這個結果與后十位的內容無關。
?
當一切判定條件都通過后,就來到最后彈出對話框的地方。
?
?
這個注冊碼vscc11-695356-695356-6494939865是2014年8月1日過期
這個注冊碼是2015年八月1日到期? vscc11-695356-605356-6456326018
?
?咱如今的逆向水平也就僅僅能做到這了,剩下的題希望能從大牛那里得到經驗。也算從這次比賽得到的最大收獲了。
?
?