ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Reykjavik
    Wargame/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
Designed by Tistory.