ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Johannesburg
    Wargame/Microcorruption 2014. 7. 31. 14:02

    login 함수를 보면 마지막 부분에 sp에서 0x11만큼의 값이 0x1a인지를 비교하고,

    다르면 password too long이라는 에러와 함께 실행이 종료되어 버린다.

    452c <login>
    ...
    4578:  f190 1a00 1100 cmp.b	#0x1a, 0x11(sp)
    457e:  0624           jeq	#0x458c <login+0x60>
    4580:  3f40 ff44      mov	#0x44ff "Invalid Password Length: password too long.", r15
    4584:  b012 f845      call	#0x45f8 <puts>
    4588:  3040 3c44      br	#0x443c <__stop_progExec__>
    458c:  3150 1200      add	#0x12, sp


    그렇다면 sp가 가르키는 곳은 ?

    gets로 0x2400부분에 0x3f만큼 값을 입력받고,

    이를 strcpy로 복사해온다. 그리고 복사해온 값의 시작주소를 가리키고 있는곳이 sp이다.

    452c <login>
    ...
    4546:  3e40 3f00      mov	#0x3f, r14
    454a:  3f40 0024      mov	#0x2400, r15
    454e:  b012 e845      call	#0x45e8 <getsn>
    4552:  3e40 0024      mov	#0x2400, r14
    4556:  0f41           mov	sp, r15
    4558:  b012 2446      call	#0x4624 <strcpy>
    ...


    따라서 sp에서 0x11만큼은, 사용자 입력값 시작주소 + 0x11 라는것.

    만약 사용자의 입력값이 16 Byte를 초과하게 되면, 이 부분이 덮이게 되고, 프로그램이 이를 감지하여 종료해 버린다.

    Cusco문제와 같지만 Stack Cookie의 개념이 포함되어 있다고 보면 될듯.


    우회방법은 ? 간단하다.

    위의 조건을 충족하면서, RET를 덮으면 된다.

    따라서 [ 16 Byte의 아무런 값 ] + [ 0x1a ] + [ unlock_door의 주소 ] 를 입력하면 끝.

    고로 키 값은 414141414141414141414141414141411a4644

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

    Montevideo  (0) 2014.07.31
    Whitehorse  (0) 2014.07.31
    Reykjavik  (0) 2014.07.31
    Cusco  (0) 2014.07.31
    Hanoi  (0) 2014.07.30
Designed by Tistory.