-
ReykjavikWargame/Microcorruption 2014. 7. 31. 11:14
Main 함수를 보면, 이상하게도 gets나 puts 함수를 call 하지 않는다.
대신 enc 함수만을 호출하고, 바로 0x2400이라는 주소를 호출한다.
우선 enc 함수를 살펴보자.
4438 <main> 4438: 3e40 2045 mov #0x4520, r14 443c: 0f4e mov r14, r15 443e: 3e40 f800 mov #0xf8, r14 4442: 3f40 0024 mov #0x2400, r15 4446: b012 8644 call #0x4486 <enc> 444a: b012 0024 call #0x2400 444e: 0f43 clr r15
매우길다.... 하지만 차근차근 살펴보면 0x2400 주소부터 들어있는 data에 여러 반복문, xor 연산등을 하며 data를 인코딩(?) 한다.
4486 <enc> 4486: 0b12 push r11 4488: 0a12 push r10 448a: 0912 push r9 448c: 0812 push r8 448e: 0d43 clr r13 4490: cd4d 7c24 mov.b r13, 0x247c(r13) 4494: 1d53 inc r13 4496: 3d90 0001 cmp #0x100, r13 449a: fa23 jne #0x4490 <enc+0xa> 449c: 3c40 7c24 mov #0x247c, r12 44a0: 0d43 clr r13 44a2: 0b4d mov r13, r11 44a4: 684c mov.b @r12, r8 44a6: 4a48 mov.b r8, r10 44a8: 0d5a add r10, r13 44aa: 0a4b mov r11, r10 44ac: 3af0 0f00 and #0xf, r10 44b0: 5a4a 7244 mov.b 0x4472(r10), r10 44b4: 8a11 sxt r10 44b6: 0d5a add r10, r13 44b8: 3df0 ff00 and #0xff, r13 44bc: 0a4d mov r13, r10 44be: 3a50 7c24 add #0x247c, r10 44c2: 694a mov.b @r10, r9 44c4: ca48 0000 mov.b r8, 0x0(r10) 44c8: cc49 0000 mov.b r9, 0x0(r12) 44cc: 1b53 inc r11 44ce: 1c53 inc r12 44d0: 3b90 0001 cmp #0x100, r11 44d4: e723 jne #0x44a4 <enc+0x1e> 44d6: 0b43 clr r11 44d8: 0c4b mov r11, r12 44da: 183c jmp #0x450c <enc+0x86> 44dc: 1c53 inc r12 44de: 3cf0 ff00 and #0xff, r12 44e2: 0a4c mov r12, r10 44e4: 3a50 7c24 add #0x247c, r10 44e8: 684a mov.b @r10, r8 44ea: 4b58 add.b r8, r11 44ec: 4b4b mov.b r11, r11 44ee: 0d4b mov r11, r13 44f0: 3d50 7c24 add #0x247c, r13 44f4: 694d mov.b @r13, r9 44f6: cd48 0000 mov.b r8, 0x0(r13) 44fa: ca49 0000 mov.b r9, 0x0(r10) 44fe: 695d add.b @r13, r9 4500: 4d49 mov.b r9, r13 4502: dfed 7c24 0000 xor.b 0x247c(r13), 0x0(r15) 4508: 1f53 inc r15 450a: 3e53 add #-0x1, r14 450c: 0e93 tst r14 450e: e623 jnz #0x44dc <enc+0x56> 4510: 3841 pop r8 4512: 3941 pop r9 4514: 3a41 pop r10 4516: 3b41 pop r11 4518: 3041 ret
따라서 enc 함수가 끝나는 부분에 break point를 걸고, continue한 후, 0x2400 부터의 데이터를 확보한다.
0b12 0412 0441 2452 3150 e0ff 3b40 2045 073c 1b53 8f11 0f12 0312 b012 6424 2152 6f4b 4f93 f623 3012 0a00 0312 b012 6424 2152 3012 1f00 3f40 dcff 0f54 0f12 2312 b012 6424 3150 0600 b490 e62b dcff 0520 3012 7f00 b012 6424 2153 3150 2000 3441 3b41 3041 1e41 0200 0212 0f4e 8f10 024f 32d0 0080 b012 1000 3241 3041 d21a 189a 22dc 45b9 4279 2d55 858e a4a2 67d7 14ae a119 76f6 42cb 1c04 0efa a61b 74a7 416b d237 a253 22e4 66af c1a5 938b 8971 9b88 fa9b 6674 4e21 2a6b b143 9151 3dcc a6f5 daa7 db3f 8d3c 4d18 4736 dfa6 459a 2461 921d 3291 14e6 8157 b0fe 2ddd 400b 8688 6310 3ab3 612b 0bd9 483f 4e04 5870 4c38 c93c ff36 0e01 7f3e fa55 aeef 051c 242c 3c56 13af e57b 8abf 3040 c537 656e 8278 9af9 9d02 be83 b38c e181 3ad8 395a fce3 4f03 8ec9 9395 4a15 ce3b fd1e 7779 c9c3 5ff2 3dc7 5953 8826 d0b5 d9f8 639e e970 01cd 2119 ca6a d12c 97e2 7538 96c5 8f28 d682 1be5 ab20 7389 48aa 1fa3 472f a564 de2d b710 9081 5205 8d44 cff4 bc2e 577a d5f4 a851 c243 277d a4ca 1e6b
살펴보면 이 data는 assembly 언어인 것을 알 수 있다. 사이트에서 직접 Disassemble 기능을 제공한다.
Disassemble하면 아래와 같은 asm이 나온다. 이 부분의 시작 주소는 0x2400이고, 이 부분을 바로 call해서 이 asm들을 하나하나 실행하는 것이다.
0b12 push r11 0412 push r4 0441 mov sp, r4 2452 add #0x4, r4 3150 e0ff add #0xffe0, sp 3b40 2045 mov #0x4520, r11 073c jmp $+0x10 1b53 inc r11 8f11 sxt r15 0f12 push r15 0312 push #0x0 b012 6424 call #0x2464 2152 add #0x4, sp 6f4b mov.b @r11, r15 4f93 tst.b r15 f623 jnz $-0x12 3012 0a00 push #0xa 0312 push #0x0 b012 6424 call #0x2464 2152 add #0x4, sp 3012 1f00 push #0x1f 3f40 dcff mov #0xffdc, r15 0f54 add r4, r15 0f12 push r15 2312 push #0x2 b012 6424 call #0x2464 3150 0600 add #0x6, sp b490 e62b dcff cmp #0x2be6, -0x24(r4) 0520 jnz $+0xc 3012 7f00 push #0x7f b012 6424 call #0x2464 2153 incd sp 3150 2000 add #0x20, sp 3441 pop r4 3b41 pop r11 3041 ret 1e41 0200 mov 0x2(sp), r14 0212 push sr 0f4e mov r14, r15 8f10 swpb r15 024f mov r15, sr 32d0 0080 bis #0x8000, sr b012 1000 call #0x10 3241 pop sr 3041 ret d21a 189a call &0x9a18 22dc bis @r12, sr 45b9 bit.b r9, r5 4279 subc.b r9, sr 2d55 add @r5, r13 858e a4a2 sub r14, -0x5d5c(r5) 67d7 bis.b @r7, r7 14ae a119 dadd 0x19a1(r14), r4 76f6 and.b @r6+, r6 42cb bic.b r11, sr 1c04 0efa rrc -0x5f2(r12) a61b invalid @r6 74a7 dadd.b @r7+, r4 416b addc.b r11, sp d237 jge $-0x5a a253 22e4 incd &0xe422 66af dadd.b @r15, r6 c1a5 938b dadd.b r5, -0x746d(sp) 8971 9b88 subc sp, -0x7765(r9) fa9b 6674 cmp.b @r11+, 0x7466(r10) 4e21 jnz $+0x29e 2a6b addc @r11, r10 b143 9151 mov #-0x1, 0x5191(sp) 3dcc bic @r12+, r13 a6f5 daa7 and @r5, -0x5826(r6) db3f jmp $-0x48 8d3c jmp $+0x11c 4d18 rrc.b r13 4736 jge $-0x370 dfa6 459a 2461 dadd.b -0x65bb(r6), 0x6124(r15) 921d 3291 sxt &0x9132 14e6 8157 xor 0x5781(r6), r4 b0fe 2ddd and @r14+, -0x22d3(pc) 400b reti pc 8688 6310 sub r8, 0x1063(r6) 3ab3 bit #-0x1, r10 612b jnc $-0x13c 0bd9 bis r9, r11 483f jmp $-0x16e 4e04 rrc.b r14 5870 4c38 subc.b 0x384c(pc), r8 c93c jmp $+0x194 ff36 jge $-0x200 0e01 rra r14 7f3e jmp $-0x300 fa55 aeef add.b @r5+, -0x1052(r10) 051c rrc r5 242c jc $+0x4a 3c56 add @r6+, r12 13af e57b dadd 0x7be5(r15), 4 8abf 3040 bit r15, 0x4030(r10) c537 jge $-0x74 656e addc.b @r14, r5 8278 9af9 subc r8, &0xf99a 9d02 be83 call -0x7c42(r13) b38c e181 sub @r12+, 8 3ad8 bis @r8+, r10 395a add @r10+, r9 fce3 4f03 xor.b #-0x1, 0x34f(r12) 8ec9 9395 bic r9, -0x6a6d(r14) 4a15 rra.b r10 ce3b jl $-0x62 fd1e call @r13+ 7779 subc.b @r9+, r7 c9c3 5ff2 bic.b #0x0, -0xda1(r9) 3dc7 bic @r7+, r13 5953 add.b #0x1, r9 8826 jz $-0x2ee d0b5 d9f8 639e bit.b -0x727(r5), -0x619d(pc) e970 01cd subc.b @pc, -0x32ff(r9) 2119 rra @sp ca6a d12c addc.b r10, 0x2cd1(r10) 97e2 7538 96c5 xor &0x3875, -0x3a6a(r7) 8f28 jnc $+0x120 d682 1be5 ab20 sub.b &0xe51b, 0x20ab(r6) 7389 sub.b @r9+, 4 48aa dadd.b r10, r8 1fa3 dinc r15 472f jc $-0x170 a564 de2d addc @r4, 0x2dde(r5) b710 swpb @r7+ 9081 5205 8d44 sub 0x552(sp), 0x448d(pc) cff4 bc2e and.b r4, 0x2ebc(r15) 577a d5f4 subc.b -0xb2b(r10), r7 a851 c243 add @sp, 0x43c2(r8) 277d subc @r13, r7 a4ca 1e6b bic @r10, 0x6b1e(r4)
쭉 훑어보면... 0x2464를 많이 call 하는데 이부분이 인터럽트 호출 (INT) 인 것을 짐작할 수 있다.
메뉴얼을 보면 알겠지만. unlock을 위한 인터럽트 넘버는 0x7F이다.
따라서 stack에 0x7F를 push 하고 0x2464를 call하는 asm이 있을것이다. 바로 이부분이다. (위 asm의 30번째줄 근처)
... b490 e62b dcff cmp #0x2be6, -0x24(r4) 0520 jnz $+0xc 3012 7f00 push #0x7f b012 6424 call #0x2464 ...
cmp로 0x2be6과 r4주소에서 -0x24한 만큼의 값을 비교하는 구문이 있다.
해당 asm이 있는 주소에(0x2448) break point를 걸고 실행해보자.
r4는 0x43fe이고 여기서 -0x24를 하면 0x43da로 sp가 가리키는 곳이 된다.
이곳은 사용자가 입력한 값이 있는 부분이라는 것을 알 수 있다.
즉 사용자가 입력한 값과 0x2be6을 비교하여 맞으면 unlock 하므로,
키는 e62b가 된다.
'Wargame > Microcorruption' 카테고리의 다른 글
Whitehorse (0) 2014.07.31 Johannesburg (0) 2014.07.31 Cusco (0) 2014.07.31 Hanoi (0) 2014.07.30 Sydney (0) 2014.07.30