๋ฌธ์ ์ดํด
cmd ์ฐฝ์ ์ด์ด easy crackme1 ํ๋ก๊ทธ๋จ์ ์คํํด๋ณธ๋ค.
"input: " ๋ค์ ์ซ์ ๋ ๊ฐ๋ฅผ ์ ๋ ฅ ๋ฐ์ ๋ค์ " Wrong"์ด ์ถ๋ ฅ ๋๋ค. ๋ฐ๋ผ์ Wrong์ด ๋์ค์ง ์๋ ์ซ์ 2๊ฐ๋ฅผ ์ฐพ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
๋ฌธ์ ๊ณํ
- X64 Debuger๋ก ํ๋ก๊ทธ๋จ์ ์ด์ด ์ด๋ค ํ๋ก๊ทธ๋จ์ธ์ง ๋ถ์ํ ์ค๋น๋ฅผ ํ๋ค.
- "Wrong"์ด๋ "Input" ๊ด๋ จ ๋ช ๋ น์ด๊ฐ ์ด๋ ์๋์ง ์ฐพ์ main ํจ์ ๋ถ๋ถ์ ์์๋ธ๋ค.
- "Wrong" ๋๋ "Correct"๋ฅผ ๊ฒฐ์ ์ง๋ ์ฝ๋, ๋๋ ํจ์๊ฐ ๋ฌด์์ธ์ง ์์๋ธ๋ค.
- ๊ทธ ๊ฒฐ์ ์ง๋ ์ฝ๋๋ฅผ ๋ถ์ํด ์ด๋ค ๊ฐ์ ์ ๋ ฅํด์ผ ์ถ๋ ฅ๊ฐ์ด "Correct"๊ฐ ๋๋์ง ์์๋ธ๋ค.
- ida๋ก ์ถ์ธกํ ์ฝ๋๊ฐ ๋ง๋์ง ํ์ธํ๋ค.
๋ฌธ์ ์คํ
X64 Debuger๋ก ๋ฌธ์ ํ์ผ์ ์ด์ด์ค๋ค. ์์ ๊ฐ์ ํ๋ฉด์ด ๋ณด์ธ๋ค.
์๋ ๊ฒ์ ์ ์ถ๋ ฅ ๋ฌธ์ ๋ฟ์ด๋ฏ๋ก ์์ ํ๋ฉด๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฌธ์์ด ์ฐธ์กฐ๋ฅผ ํด "Wrong" ๋๋ "Input"์ ๊ฒ์ํด์ค๋ค.
๋ฌธ์์ด ์ฐธ์กฐ์์ ๊ฒ์ํ "Wrong" ๋๋ "Input" ์ถ๋ ฅ ๊ด๋ จ ๋ช ๋ น์ด๋ฅผ ๋๋ธ ํด๋ฆญํ๋ฉด main ํจ์๋ฅผ ๋ณผ ์ ์๋ค.
main ํจ์์์ ์ฌ๋ฌ ๋ค๋ฅธ ํจ์๋ฅผ call ํ๊ณ ์๋ ๊ฒ์ด ๋ณด์ธ๋ค.
main ํจ์์์ ์์๋ด์ผ ํ๋ ์ฃผ์ ์ฌํญ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
- lea r8, qword ptr ss:[rsp+20] / lea rdx, qword ptr ss:[rsp+24]
- lea๋ ๋ค์ ์ธ์(์ฃผ์)๋ฅผ ์์ ์ธ์์ ์ ์ฅํ๋ผ๋ ์ต์ฝ๋์ด๋ค.
- ๋ฐ๋ผ์ r8๊ณผ rdx์ ์ ๋ ฅ ๋ฐ์ ๋ ๊ฐ์ ์ซ์ ์ฃผ์๊ฐ์ ์ ์ฅํ์์ ์ ์ ์๋ค.
- mov edx, qword ptr ss:[rsp+20] / mov ecx, qword ptr ss:[rsp+20]
- mov๋ ๋ค์ ์ธ์(*์ฃผ์, ์ฆ ์ฃผ์๊ฐ ๋ํ๋ด๋ ์ค์ ์)๋ฅผ ์์ ์ธ์์ ์ ์ฅํ๋ผ๋ ์ต์ฝ๋์ด๋ค.
- ๋ฐ๋ผ์ [rsp+20], [rsp+24]๋ผ๋ ์ฃผ์์ ๋ค์ด์๋ ์ ๋ ฅ ๋ฐ์ ์ซ์๊ฐ ๊ฐ๊ฐ edx, ecx์ ์ ์ฅ๋์์ ์ ์ ์๋ค.
- ํจ์ call๊ณผ test eax, eax, je
- edx, ecx์ ์ซ์๋ฅผ ์ ์ฅํ ์งํ ํจ์๋ฅผ callํ๋ค. ๊ทธ ํจ์ ๋ฐ๋ก ์๋ ๋ช ๋ น์ด๋ฅผ ๋ณด๋ฉด test eax, eax๋ฅผ ํ ๋ค ํน์ ํจ์๋ก je(jump equal)ํ๋ผ๋ ๋ช ๋ น์ด๊ฐ ๋์จ๋ค.
- eax์ eax๋ ๋น์ฐํ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ฏ๋ก ์ด ๋ช ๋ น์ด๋ฅผ ๋ง๋๋ฉด ๋ฌด์กฐ๊ฑด jump ํ๊ฒ ๋๋๋ฐ, jump ํ๋ฉด "Wrong"์ด ์ถ๋ ฅ ๋๋ค. ๋ฐ๋ผ์ ์ ๋ต์ด ๋๋ ค๋ฉด test eax, eax ์ ํจ์์์ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ด๋ํด je ๋ช ๋ น์ด๋ฅผ ๋ง๋์ง ์๊ฒ ํด์ผํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด์ Correct์ Wrong์ ๊ฒฐ์ ํ๋ 'easy crackme1.1410001180' ํจ์๋ก ๊ฐ์ ๋ถ์ํด๋ณด์.
์ด ํจ์์์ ์์๋ด์ผ ํ๋ ์ฃผ์ ์ฌํญ์ด๋ค. ๊ฐ์ฅ ์์ ๋ช ๋ น์ด๋ถํฐ ์ฐจ๋ก๋๋ก ์ ๋ฆฌํ๋ค.
- mov dword ptr ss:[rsp+10], edx / mov dword ptr ss:[rsp+8], ecx
- main ํจ์์์ ์์๋ธ ๋ฐ์ ๊ฐ์ด edx, ecx์๋ ๊ฐ๊ฐ ์ฒซ ๋ฒ์งธ ์ ๋ ฅ ๊ฐ, ๋ ๋ฒ์งธ ์ ๋ ฅ ๊ฐ์ด ๋ค์ด์๋ค.
- ์ด์ mov๋ฅผ ํตํด [rsp+10], [rsp+8] ์ฃผ์์๋ ์ ๋ ฅ ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
- sub rsp, 18
- rsp์์ 0x18 ๋งํผ์ ๊ฐ์ ๋นผ์ค ํจ์ ๊ณต๊ฐ์ ํ๋ณดํ๋ค.
- ์ด์ ์ ๋ ฅ๊ฐ์ ๋ณด๋ ค๋ฉด [rsp+10], [rsp+8]์ ์ฃผ์๊ฐ ์๋๋ผ [rsp+20], [rsp+28] ์ฃผ์๋ฅผ ๋ด์ผ ํ๋ค. rsp์ ๊ฐ์ด ๋ณํํ๊ธฐ ๋๋ฌธ์ด๋ค.( [rsp+10]→ [rsp+28], [rsp+8]→ [rsp+20])
- ์ฌ๊ธฐ์ ํ ์๊ฐ์ด ๋๊ฒ ์ง์ฒด ๋๋ค. (/_ \) ์ 10์ 28๋ก 8์ 20์ผ๋ก ๋ฐ๋๋์ง ์ดํด๊ฐ ์๋๋ค. ์๊ณ ๋ณด๋ ์ซ์๋ค์ด 16์ง์์๋ค(!!) 18์ด ๊ทธ๋ฅ 18์ด ์๋๋ผ 0x18์ด์๋ค.
- cmp dword ptr ss:[rsp+20], 2000 / ja easy...11A0
- cmp๋ ๋น๊ตํ๋ ์ต์ฝ๋๋ค. [rsp+20]์ ์๋ ๊ฐ๊ณผ 0x2000์ ๋น๊ตํ๋ผ๋ ๋ป์ด๋ค.
- ja๋ 'jump if above'์ ์ค์๋ง๋ก ์์ ์ธ์๊ฐ ๋ค์ ์ธ์๋ณด๋ค ํฌ๋ฉด jump ํ๋ค.
- jump ํ๊ฒ ๋๋ฉด xor eax, eax๋ฅผ ๋ง๋๊ณ jmp ๋ค์ ํจ์๋ก jump ํ๋๋ฐ ๊ทธ๋ฌ๋ฉด ํจ์๊ฐ ์ข ๋ฃ๋์ด ๋ฒ๋ฆฐ๋ค.
- ๋ฐ๋ผ์ dword ptr ss:[rsp+20], ์ฆ ์ฒซ ๋ฒ์งธ ์ ๋ ฅ ๊ฐ์ 2000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์์ผ ํ๋ค.
- cmp dword ptr ss:[rsp+28], 2000 / jbe easy...11A4
- jbe๋ 'jump below or equal'์ ์ค์๋ง๋ก ์์ ์ธ์๊ฐ ๋ค์ ์ธ์๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด jumpํ๋ค.
- ์ด๋ฒ์๋ jump ํด์ผ ํ๋ค. ๊ทธ๋์ผ xor eax, eax๋ฅผ ๋ง๋์ง ์๊ณ ํจ์๊ฐ ๊ณ์ ์คํ๋๋ค.
- ๋ฐ๋ผ์ dword ptr ss:[rsp+28], ์ฆ ๋ ๋ฒ์งธ ์ ๋ ฅ ๊ฐ๋ 2000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์์ผ ํ๋ค.
- mov eax, dword ptr ss:[rsp+20] / imul eax, dword ptr ss:[rsp+28] / mov dword ptr ss:[rsp], eax
- dword ptr ss:[rsp+20], ์ฆ ์ฒซ ๋ฒ์งธ ์ ๋ ฅ ๊ฐ์ eax์ ์ ์ฅํด์คฌ๋ค.
- imul์ ์์ ์ธ์์ ๋ค์ ์ธ์๋ฅผ ๊ณฑํด ์์ ์ธ์์ ์ ์ฅํด์ฃผ๋ ์ต์ฝ๋๋ค. ๋ฐ๋ผ์ eax(์ฒซ ๋ฒ์งธ ์ ๋ ฅ ๊ฐ)์ dword ptr ss:[rsp+28](๋ ๋ฒ์งธ ์ ๋ ฅ ๊ฐ)์ ๊ณฑํด eax์ ์ ์ฅํด์คฌ๋ค.
- mov ์ต์ฝ๋๋ฅผ ์ฌ์ฉํด ์ด๋ฅผ ๋ค์ dword ptr ss:[rsp]์ ์ ์ฅํ๋ค.
- mov eax, dword ptr ss:[rsp+20] / div dword ptr ss:[rsp+28] / mov dword ptr ss:[rsp+4], eax
- eax์ dword ptr ss:[rsp+20], ์ฆ ์ฒซ ๋ฒ์งธ ์ ๋ ฅ ๊ฐ์ ์ ์ฅํ๋ค.
- div๋ ๋๋๋ ์ต์ฝ๋์ธ๋ฐ eax ๋ ์ง์คํฐ ๊ฐ์ ์์ค์ ๋ด์ฉ์ผ๋ก ๋๋์ด์ ๋ชซ์ eax ๋ ์ง์คํฐ์ ์ ์ฅํ๊ณ ๋๋จธ์ง๋ edx ๋ ์ง์คํฐ์ ์ ์ฅํ๋ค. (edx ์ด๊ธฐํ ํ์), ์ด ๋ฌธ์ ์์๋ eax์ ์ ์ฅ๋ ์ฒซ ๋ฒ์งธ ์ ๋ ฅ ๊ฐ์ด dword ptr ss:[rsp+28](๋ ๋ฒ์งธ ์ ๋ ฅ ๊ฐ)์ผ๋ก ๋๋์ด์ ธ ๊ทธ ๋ชซ์ eax์, ๋๋จธ์ง๋ edx์ ์ ์ฅ๋๋ค.
- eax์ ์๋ ๋๋ ๋ชซ์ด mov dword ptr ss:[rsp+4]์ ์ ์ฅ๋๋ค.
- xor ecx, eax
- ๋ ์ ๋ ฅ ๊ฐ์ XOR ์ฐ์ฐํด์ ๊ทธ ๊ฐ์ ์ต์ข ์ ์ผ๋ก dword ptr ss:[rsp+8]์ ์ ์ฅํด์คฌ๋ค.
- cmp ~ / jne~
- ๊ทธ ์๋๋ถํฐ cmp ~ / jne~ ๊ตฌ๋ฌธ์ด 3๋ฒ ๋ฐ๋ณต๋๋ค.
- jne๋ 'jump not equal'์ ์ฝ์๋ก ๊ฐ์ง ์์ผ๋ฉด 'mov eax 1' ๋ช ๋ น์ด๋ ๊ฑด๋๋ด ์ฑ ํจ์๊ฐ ์ข ๋ฃ๋๋ค. ๋ฐ๋ผ์ cmp ํ์ ๋ ๋ ์ธ์์ ๊ฐ์ด ์๋ก ๊ฐ์์ผ ํ๋ค.
์ต์ข ์ ์ผ๋ก ์๋์ 4๊ฐ ์กฐ๊ฑด์ ๋ง์กฑํ ๋ ๊ฐ์ ์ ๋ ฅ ๊ฐ์ด ํค๊ฐ ๋๋ค.
1. num1<= 0x2000, num2<=0x2000
2. num1*num2 == 0x6AE9BC
3. num1/num2 == 4
4. num1^num2 == 0x12FC
์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ ์ซ์๋ฅผ C++์ ์ด์ฉํด ์ฐพ์์ค๋ค.
์คํํ๋ฉด 5678 1234๊ฐ ๋์ค๋๋ฐ ์ด ์ซ์๋ฅผ ๋ค์ cmd ์ฐฝ input ๋ค์ ์ ๋ ฅํด์ฃผ๋ฉด...
๋๋์ด correct !
์ค๋ ๋ฐฐ์ด ๊ฒ
- ์ฌ๋ฌ ์ต์ฝ๋๋ฅผ ์ง์ ์ฐ๋ฉฐ ์ตํ ์ ์์๋ค. (imul, xor, div, jbe, ja, jne ๋ฑ)
- ๋๋ฒ๊ฑฐ์ ์ฐ์ฌ์ง ์ซ์๋ ์ ๋ถ 16์ง์๋ค. ์์ง ๋ง ๊ฒ.
- ๋ฌธ์ ๊ฐ ๋งํ๋ ์กฐ๊ฑด์ ์ง์ ๊ตฌํ๋ ๊ฒ์ด ์๋๋ผ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํด์ ๊ตฌํด์ค๋ค.
๋ฐ์ฑ
- ํจ์๊ฐ ์ด๋ป๊ฒ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๋์ง ์ ํํ ์ดํดํ์ง ๋ชปํ๊ณ ์๋ค.
- ์๊ฐ์ ๋~๋ฌด ๋ง์ด ์ผ๋ค.
'๐ง ๋ฆฌ๋ฒ์ฑ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Dreamhack ๋ฆฌ๋ฒ์ฑ ๋ฌธ์ ํ์ด: rev-basic-3 (0) | 2023.10.31 |
---|---|
Dreamhack ๋ฆฌ๋ฒ์ฑ ๋ฌธ์ ํ์ด: rev-basic-2 (0) | 2023.10.31 |
Dreamhack ๋ฆฌ๋ฒ์ฑ ๋ฌธ์ ํ์ด: rev-basic-1 (1) | 2023.10.09 |
Dreamhack ๋ฆฌ๋ฒ์ฑ ๋ฌธ์ ํ์ด: rev-basic-0 (0) | 2023.08.05 |
๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง: ์ด์ ๋ธ๋ฆฌ (ํจ์) (0) | 2023.08.03 |