๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ง ๋ฆฌ๋ฒ„์‹ฑ

๊ธฐํƒ€ ๋ฆฌ๋ฒ„์‹ฑ ๋ฌธ์ œํ’€์ด: easy-crackme1

by ๋ถˆํƒ€๋Š” ์ฐธ์ƒˆ 2023. 10. 9.

๋ฌธ์ œ ์ดํ•ด

cmd ์ฐฝ์„ ์—ด์–ด easy crackme1 ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ด๋ณธ๋‹ค.

"input: " ๋’ค์— ์ˆซ์ž ๋‘ ๊ฐœ๋ฅผ ์ž…๋ ฅ ๋ฐ›์€ ๋’ค์— " Wrong"์ด ์ถœ๋ ฅ ๋๋‹ค. ๋”ฐ๋ผ์„œ Wrong์ด ๋‚˜์˜ค์ง€ ์•Š๋Š” ์ˆซ์ž 2๊ฐœ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค.

๋ฌธ์ œ ๊ณ„ํš

  1. X64 Debuger๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์—ด์–ด ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์ธ์ง€ ๋ถ„์„ํ•  ์ค€๋น„๋ฅผ ํ•œ๋‹ค.
  2. "Wrong"์ด๋‚˜ "Input" ๊ด€๋ จ ๋ช…๋ น์–ด๊ฐ€ ์–ด๋”” ์žˆ๋Š”์ง€ ์ฐพ์•„ main ํ•จ์ˆ˜ ๋ถ€๋ถ„์„ ์•Œ์•„๋‚ธ๋‹ค.
  3. "Wrong" ๋˜๋Š” "Correct"๋ฅผ ๊ฒฐ์ •์ง“๋Š” ์ฝ”๋“œ, ๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋‚ธ๋‹ค.
  4. ๊ทธ ๊ฒฐ์ •์ง“๋Š” ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด ์–ด๋–ค ๊ฐ’์„ ์ž…๋ ฅํ•ด์•ผ ์ถœ๋ ฅ๊ฐ’์ด "Correct"๊ฐ€ ๋˜๋Š”์ง€ ์•Œ์•„๋‚ธ๋‹ค.
  5. 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์ด์˜€๋‹ค.

C++๋กœ 16์ง„์ˆ˜ ๊ณ„์‚ฐํ•ด๋ณด๋‹ˆ ๋”ฑ ๋–จ์–ด์กŒ๋‹ค.

  • 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์ง„์ˆ˜๋‹ค. ์žŠ์ง€ ๋ง ๊ฒƒ.
  • ๋ฌธ์ œ๊ฐ€ ๋งํ•˜๋Š” ์กฐ๊ฑด์€ ์ง์ ‘ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ•ด์ค€๋‹ค.

๋ฐ˜์„ฑ

  • ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค.
  • ์‹œ๊ฐ„์„ ๋„ˆ~๋ฌด ๋งŽ์ด ์ผ๋‹ค.