-
HanoiWargame/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