生活随笔
收集整理的這篇文章主要介紹了
吾爱破解crackme 023 024
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這兩個題目中規中矩,只要分析好作者的意圖即可。
023:
首先,點擊About,作者不讓爆破,即讓分析keygen。
pe裝載發現是純匯編,666。
od載入調試,我們跟到關鍵處:
004012AE
|> \A2 67314000 mov byte ptr ds:[0x403167],al
004012B3
|. 83F8 10 cmp eax,0x10
004012B6
|. 74 16 je short Chafe_1.004012CE
004012B8
|. 68 65304000 push Chafe_1.00403065 ; /Text = "Your serial is not valid.
"
004012BD
|. FF35 7C314000 push dword ptr ds:[0x40317C] ; |hWnd = 00031230 ('Your serial is not valid.',class='Edit',parent=00071162)
004012C3
|. E8 66020000 call <jmp.&USER32.SetWindowTextA> ; \SetWindowTextA
004012C8
|. 33C0 xor eax,eax
004012CA
|. C9 leave
004012CB
|. C2 1000 retn 0x10
004012CE
|> 68 7F304000 push Chafe_1.0040307F ; /Text = "YES! You found your serial!!
"
004012D3
|. FF35 7C314000 push dword ptr ds:[0x40317C] ; |hWnd = 00031230 ('Your serial is not valid.',class='Edit',parent=00071162)
004012D9
|. E8 50020000 call <jmp.&USER32.SetWindowTextA> ; \SetWindowTextA
004012DE
|. 33C0 xor eax,eax
004012E0
|. C9 leave
004012E1
|. C2 1000 retn 0x10
我們分析代碼之后,發現這是一個教科書的windows窗口過程。但這與我們破解無關,通過Yes! You found your serial 之后我們可以跟到判斷的關鍵處。
00401294 |. E8 BA010000 call Chafe_1.00401453 ; Case 113 (WM_TIMER) of switch 0040123F
00401299 |. 0FBE05 663140>movsx eax,byte ptr ds:[0x403166]
004012A0
|. 3A05 67314000 cmp al,byte ptr ds:[0x403167]
004012A6
|. 75 06 jnz short Chafe_1.004012AE
004012A8
|. 33C0 xor eax,eax
004012AA
|. C9 leave
004012AB
|. C2 1000 retn 0x10
004012AE
|> A2 67314000 mov byte ptr ds:[0x403167],al
004012B3
|. 83F8 10 cmp eax,0x10
004012B6
|. 74 16 je short Chafe_1.004012CE
比較byte ptr ds:[0x403166]是否等于0x10,我們去跟蹤一下有多少地方對這個地址進行了操作。
正好發現有四個add * 0x04,這不告訴我們只要滿足這四個條件就可以了么。
第一個:
0040146F .
8B25 A0314000
mov esp,dword ptr ds:[
0x4031A0]
00401475 .
6A
00 push 0x0
00401477 .
8D45 FC lea eax,dword ptr ss:[ebp-
0x4]
0040147A .
50 push eax
0040147B .
6A
64 push 0x64
0040147D . FF35
70314000 push dword ptr ds:[
0x403170]
00401483 . E8
64000000 call <
jmp.&USER32
.GetDlgItemInt>
00401488 . A3
88314000 mov dword ptr ds:[
0x403188],eax
0040148D .
837D FC
00 cmp dword ptr ss:[ebp-
0x4],
0x0
00401491 .
74 07 je short Chafe_1
.0040149A
00401493 .
8005 66314000>
add byte ptr ds:[
0x403166],
0x4
0040149A > C9 leave
0040149B . C3 retn
0040149C . A1
88314000 mov eax,dword ptr ds:[
0x403188]
004014A1 .
05 78241109 add eax,
0x9112478
004014A6 .
85C0 test eax,eax
004014A8 .
75 09 jnz short Chafe_1
.004014B3
004014AA .
8005 66314000>
add byte ptr ds:[
0x403166],
0x4
004014B1 . EB
07 jmp short Chafe_1
.004014BA
004014B3 > C605
66314000>
mov byte ptr ds:[
0x403166],
0x0
004014BA >
8B25 A0314000
mov esp,dword ptr ds:[
0x4031A0]
004014C0 . C9 leave
004014C1 . C3 retn
GetDlgItemInt,說明需要滿足我們輸入的serial為純數字,那么一定會+4的,
第二個+4來自于GetWindowText,也是一定會+4,
第三個+4來自于下面的代碼:
00401361 . 8
D3D 8
C314000 lea edi,
dword ptr ds:
[0x40318C]
00401367 . 0
FBE05 683140>
movsx eax,
byte ptr ds:
[0x403168]
0040136
E . 03
F8 add edi,
eax
00401370 .
FE05 68314000
inc byte ptr ds:
[0x403168]
00401376 .
A1 88314000
mov eax,
dword ptr ds:
[0x403188]
0040137
B . 8
B25 A0314000 mov esp,
dword ptr ds:
[0x4031A0]
00401381 . 40
inc eax
00401382 .
FF05 88314000
inc dword ptr ds:
[0x403188]
00401388 . 3307
xor eax,
dword ptr ds:
[edi]
0040138
A .
A3 88314000
mov dword ptr ds:
[0x403188],
eax
0040138
F . 803
D 68314000>
cmp byte ptr ds:
[0x403168],0
x10
00401396 . 75 07
jnz short Chafe_1.0040139F
00401398 . 8005 66314000>
add byte ptr ds:
[0x403166],0
x4
0040139
F >
C9 leave
004013
A0 .
C3 retn
發現這里一定會循環17次,然后+4,所以通過這三部分一定會+12,所以最后那個+4才是關鍵的點,這里明顯是個算法,認真分析,代碼如下:
from ctypes import *
name =
"1234"
namevalue = ((ord(
name[
3])<<
24) + (ord(
name[
2])<<
16) +(ord(
name[
1])<<
8) + (ord(
name[
0])<<
0))
serial =
1111for i
in range(
0,
16):serial +=
1serial = (serial) ^ namevalue namevalue = c_uint(namevalue >>
8).valueprint hex(serial)
那么分析第四個+4代碼如下:
0040149C . A1
88314000 mov eax,dword ptr ds:[
0x403188]
004014A1 .
05 78241109 add eax,
0x9112478
004014A6 .
85C0 test eax,eax
004014A8 .
75 09 jnz
short Chafe_1
.004014B3
004014AA .
8005 66314000>
add byte ptr ds:[
0x403166],
0x4
004014B1 . EB
07 jmp
short Chafe_1
.004014BA
004014B3 > C605
66314000>mov
byte ptr ds:[
0x403166],
0x0
004014BA >
8B25 A0314000 mov esp,dword ptr ds:[
0x4031A0]
004014C0 . C9 leave
看出,之前算出的結果和0x9112478相加得到0就能通過了。
那么我們逆思路回去,輸入name為1,1比較好算啦,,,,不再寫keygen了,得出serial結果為4142848839,輸入之后通過。
024
這個題目還是比較有趣的,通過改變text段的代碼,然后進行跳轉成功頁面:
分析如下:
我們看到代碼片段如下:
004012D9
54 push esp
004012DA
45 inc ebp
004012DB
58 pop eax
004012DC
00 db
00
這段代碼通過上面的一條語句004012C4 . 66:2905 D9124>sub word ptr ds:[0x4012D9],ax
進行修改。
我們在往下看到如下語句:
004012D0 . B9
3E000000 mov ecx,
0x3E...
004012DD > AD lods dword ptr ds:[esi]
004012DE . |33D8 xor ebx,eax
004012E0 . |
49 dec ecx ; Chafe_2.<ModuleEntryPoint>
004012E1 .^\
75 FA jnz short Chafe_2.004012DD
004012E3 . 81FB FBCFFCAF cmp ebx,
0xAFFCCFFB
從dword ptr ds:[esi]處進行0x3e異或循環,如果等于0xaffccffb,那么進行跳轉
這些異或數據中,其他的都是固定的,只有上述的四個字節可控,所以我們控制這四個字節的值就能達到跳轉的效果。
異或這個運算還是比較有趣的,分析一下:
如果有a^b^c^d=e
那么a=b^c^d^e
b=a^c^d^e…具有叫什么性質,,,額,可交換性,姑且這么講吧。
所以我們很容易去得到這四個字節的值,因為寫博客和分析的時間間隔比較久遠,具體是啥也不太清楚了,但是一定會有個je 跳轉的指令之類將其跳轉到成功的彈窗代碼處。完成程序的注冊。
總結
以上是生活随笔為你收集整理的吾爱破解crackme 023 024的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。