看雪CTF 2016_第八题分析
用exeinfo查看發(fā)現(xiàn)是x64程序,所以用平常的OD調(diào)試器是調(diào)試不到的,需要用x64的調(diào)試器
我這里是用x64dbug 這個(gè)調(diào)試器來進(jìn)行調(diào)試分析
經(jīng)過一步一步調(diào)試,發(fā)現(xiàn)程序調(diào)用RtlMoveMemory 這個(gè)api來進(jìn)行獲取我們輸入的注冊(cè)碼
Rax的內(nèi)存地址即為我們輸入的假碼
我們先不要一步一步分析下去,直接來到提示注冊(cè)碼不正確那里。
?
?
我們來到上圖的地方,走到000000013F5018E1 | E8 4E 8D 00 00 | call crackme.13F50A634 | 這里提示注冊(cè)碼不正確
然后上面有個(gè)跳轉(zhuǎn),為了驗(yàn)證是否為關(guān)鍵跳轉(zhuǎn),我們修改zf標(biāo)志位使跳轉(zhuǎn)成立,看看是不是提示成功,經(jīng)過證實(shí)是提示成功,所以這個(gè)就是關(guān)鍵跳轉(zhuǎn)。
?
然后我們看看它是使什么條件成立才跳轉(zhuǎn)的呢。
?
000000013F5018A7 | 48 63 C6 | movsxd rax,esi |
000000013F5018AA | 49 63 D6 | movsxd rdx,r14d |
000000013F5018AD | 48 8D 0C 90 | lea rcx,qword ptr ds:[rax+rdx*4] |
000000013F5018B1 | 48 03 D1 | add rdx,rcx |
000000013F5018B4 | 48 8D 05 05 44 02 00 | lea rax,qword ptr ds:[13F525CC0] |
000000013F5018BB | 8B 0D 63 44 02 00 | mov ecx,dword ptr ds:[13F525D24] |
000000013F5018C1 | 0F AF CF | imul ecx,edi |
000000013F5018C4 | 03 0C 90 | add ecx,dword ptr ds:[rax+rdx*4] |
000000013F5018C7 | 8D 04 7F | lea eax,dword ptr ds:[rdi+rdi*2] |
000000013F5018CA | 3B C8 | cmp ecx,eax |
000000013F5018CC | 48 8D 0D A5 06 02 00 | lea rcx,qword ptr ds:[13F521F78] |
000000013F5018D3 | 74 07 | je crackme.13F5018DC |
?
這段匯編是對(duì)比ecx是否等于eax,如果等于就是為正確的注冊(cè)碼。
?
那么ecx的值和eax的值是怎么來的。
?
我們來分析一下:
?
movsxd rax,esi // esi=2
movsxd rdx,r14d //r14d=2
lea rcx,qword ptr ds:[rax+rdx*4] // [rax+rdx*4] 2+2*4=A
add rdx,rcx // rdx=A+2=C
lea rax,qword ptr ds:[13F525CC0] // [13F5B5CC0] =134
mov ecx,dword ptr ds:[13F525D24] // [13F5B5D24] =2=ecx
imul ecx,edi //這里的edi是個(gè)變量 我輸入的假碼是123456 所以這里edi=A678 ecx=2*A678=14cf0
add ecx,dword ptr ds:[rax+rdx*4] // dword [rax+rdx*4]=00000134 ecx=14cf0+134=14E24
lea eax,dword ptr ds:[rdi+rdi*2] // eax= [rdi+rdi*2]=A678+A678*2=1F368
所以很明顯ecx != eax
上面的值除了變量之外,其余的都是固定的,你可以其他假碼進(jìn)行測(cè)試,我這里就不再舉例了。
所以由上面得出:
設(shè)edi 為X
2X+134=3X
X=134
?
所以只要變量等于134,就是正確的注冊(cè)碼,然而134是怎么計(jì)算出來的,即上面的edi=A678是怎么來的。
?
經(jīng)過向上分析,我們得出edi的結(jié)果是下面這個(gè)call計(jì)算出來的
?
000000013F2D197B | E8 80 F9 FF FF | call crackme.13F2D1300 |
000000013F2D1980 | 85 C0 | test eax,eax |
000000013F2D1982 | 75 2B | jne crackme.13F2D19AF |
000000013F2D1984 | 48 8D 0D 8D 06 02 00 | lea rcx,qword ptr ds:[13F2F2018] |
?
我們進(jìn)入這個(gè)call分析
?
000000013F921300 | 45 33 C9 | xor r9d,r9d |
000000013F921303 | 44 8B D9 | mov r11d,ecx |
000000013F921306 | 41 B8 01 00 00 00 | mov r8d,1 |
000000013F92130C | 45 8B D1 | mov r10d,r9d |
000000013F92130F | 81 F9 6A 03 00 00 | cmp ecx,36A | 和注冊(cè)碼對(duì)比 ecx為注冊(cè)碼
000000013F921315 | 75 04 | jne crackme.13F92131B |
000000013F921317 | 83 C8 FF | or eax,FFFFFFFF |
000000013F92131A | C3 | ret |
當(dāng)前ecx=1E240 十進(jìn)制是123456 是我剛才出入的假碼 它和36A對(duì)比 36A十進(jìn)制是874
這里不是很清楚為什么注冊(cè)碼不能為874,因?yàn)槲疫@樣分析在前面丟失了很多細(xì)節(jié),不過沒所謂,我們繼續(xù)分析下去。
?
000000013F92131B | 81 F9 B1 68 DE 3A | cmp ecx,3ADE68B1 | 注冊(cè)碼和3ADE68B1 對(duì)比 十進(jìn)制為987654321 即注冊(cè)碼不能是987654321
000000013F921321 | 74 F4 | je crackme.13F921317 |
000000013F921323 | 85 C9 | test ecx,ecx |
000000013F921325 | 75 09 | jne crackme.13F921330 |
000000013F921327 | 45 8B D0 | mov r10d,r8d |
000000013F92132A | EB 21 | jmp crackme.13F92134D |
?
下面這段是檢測(cè)注冊(cè)碼長(zhǎng)度是否少于1
000000013F921330 | B8 67 66 66 66 | mov eax,66666667 |
000000013F921335 | 41 FF C2 | inc r10d |
000000013F921338 | F7 E9 | imul ecx |
000000013F92133A | 8B CA | mov ecx,edx |
000000013F92133C | C1 F9 02 | sar ecx,2 |
000000013F92133F | 8B C1 | mov eax,ecx |
000000013F921341 | C1 E8 1F | shr eax,1F |
000000013F921344 | 03 C8 | add ecx,eax |
000000013F921346 | 75 E8 | jne crackme.13F921330 |
000000013F921348 | 45 3B D0 | cmp r10d,r8d | 檢測(cè)注冊(cè)碼長(zhǎng)度要大于1
000000013F92134B | 7C 13 | jl crackme.13F921360 |
?
循環(huán)計(jì)算出r8的值 后面用來進(jìn)行運(yùn)算 這里r8=F4240 十進(jìn)制是 1000000
000000013F92134D | 41 8B C2 | mov eax,r10d | 輸入的長(zhǎng)度
000000013F921350 | 47 8D 04 80 | lea r8d,dword ptr ds:[r8+r8*4] |
000000013F921354 | 45 03 C0 | add r8d,r8d |
000000013F921357 | 48 83 E8 01 | sub rax,1 |
000000013F92135B | 75 F3 | jne crackme.13F921350 |
?
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
000000013F921360 | 41 FF C1 | inc r9d |
000000013F921363 | 41 8B C1 | mov eax,r9d |
000000013F921366 | 41 0F AF C1 | imul eax,r9d |
000000013F92136A | 99 | cdq |
000000013F92136B | 41 F7 F8 | idiv r8d |
000000013F92136E | 41 3B D3 | cmp edx,r11d | r11d等于輸入的假碼
000000013F921371 | 75 ED | jne crackme.13F921360 |
000000013F921373 | 41 8B C1 | mov eax,r9d |
000000013F921376 | C3 | ret |
?
這里就是計(jì)算出上面edi=A678 值的地方
用易語言是這么實(shí)現(xiàn)的
所以我們上面說到X=134就能得出正確的注冊(cè)碼,注意這里的134是十六進(jìn)制,轉(zhuǎn)換10進(jìn)制是等于308
所以r9d=308時(shí),eax=eax*eax 就是正確的注冊(cè)碼,計(jì)算得出注冊(cè)碼為:94864
文檔和CM下載地址:http://www.vdisk.cn/down/index/19775196
轉(zhuǎn)載于:https://www.cnblogs.com/Sendige/p/9601045.html
總結(jié)
以上是生活随笔為你收集整理的看雪CTF 2016_第八题分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个好听的男主播名字
- 下一篇: 【php】 PHP 支持 9 种原始数据