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