ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Hanoi
    Wargame/Microcorruption 2014. 7. 30. 18:45

    Main 함수는 단지 login 함수를 호출한 뿐이다. login 함수를 보자.

    아래와 같이 0x1c와 0x2400을 r14, r15 레지스터에 넣고 getsn 함수를 호출한다.

    4520 <login>
    ...
    4534:  3e40 1c00      mov	#0x1c, r14
    4538:  3f40 0024      mov	#0x2400, r15
    453c:  b012 ce45      call	#0x45ce <getsn>


    이후 getsn 함수에서 r14, r15, 0x2를 각각 push하고 인터럽트(INT)를 호출한다.

    45ce <getsn>
    45ce:  0e12           push	r14
    45d0:  0f12           push	r15
    45d2:  2312           push	#0x2
    45d4:  b012 7a45      call	#0x457a <INT>
    45d8:  3150 0600      add	#0x6, sp
    45dc:  3041           ret


    각 인터럽트 번호별 기능은 메뉴얼 을 확인하면 된다. 0x02일 경우 아래와 같다.

    즉, 첫번째 인자인 r15 레지스터의 값, 0x2400이 사용자에게 입력받는 string의 시작 주소가 될것이고,

    두번째 인자인 r14의 레지스터값, 0x1c만큼을 입력받을 것이다.

    즉 우리는 0x241c까지 값을 입력할 수 있다.


    이후 계속 login 함수를 보면 0x5d와 0x2410의 값을 비교하여 같으면 unlock 하는것을 알 수 있다.

    4520 <login>
    ...
    455a:  f290 5d00 1024 cmp.b	#0x5d, &0x2410
    4560:  0720           jne	#0x4570 <login+0x50>
    4562:  3f40 f144      mov	#0x44f1 "Access granted.", r15
    4566:  b012 de45      call	#0x45de <puts>
    456a:  b012 4844      call	#0x4448 <unlock_door>
    456e:  3041           ret
    4570:  3f40 0145      mov	#0x4501 "That password is not correct.", r15
    4574:  b012 de45      call	#0x45de <puts>
    4578:  3041           ret


    위에서 설명했듯이 0x241c까지 입력 가능한데 0x2410의 데이터를 체크한다?

    기본적인 buffer overflow 문제인 것을 알 수 있다.

    고로 키값은 아무런 데이터 16 byte + 5d

    가볍게 풀어주자.

    'Wargame > Microcorruption' 카테고리의 다른 글

    Reykjavik  (0) 2014.07.31
    Cusco  (0) 2014.07.31
    Sydney  (0) 2014.07.30
    New Orleans  (0) 2014.07.30
    Microcorruption 소개  (0) 2014.07.30
Designed by Tistory.