Microcorruption의 Whitehorse다.
4438 <main>
4438: b012 f444 call #0x44f4 <login>
일단 main은 한줄이고, login 함수를 호출한다.
44f4 <login>
44f4: 3150 f0ff add #0xfff0, sp
44f8: 3f40 7044 mov #0x4470 "Enter the password to continue.", r15
44fc: b012 9645 call #0x4596 <puts>
4500: 3f40 9044 mov #0x4490 "Remember: passwords are between 8 and 16 characters.", r15
4504: b012 9645 call #0x4596 <puts>
4508: 3e40 3000 mov #0x30, r14
450c: 0f41 mov sp, r15
450e: b012 8645 call #0x4586 <getsn>
4512: 0f41 mov sp, r15
4514: b012 4644 call #0x4446 <conditional_unlock_door>
4518: 0f93 tst r15
451a: 0324 jz #0x4522 <login+0x2e>
451c: 3f40 c544 mov #0x44c5 "Access granted.", r15
4520: 023c jmp #0x4526 <login+0x32>
4522: 3f40 d544 mov #0x44d5 "That password is not correct.", r15
4526: b012 9645 call #0x4596 <puts>
452a: 3150 1000 add #0x10, sp
452e: 3041 ret
이번에도 비슷하다. 8~16 사이 값이 패스워드고 r14는 입력 버퍼의 크기 0x30 (최대 48글자) , r15가 입력 버퍼인가보다. 그리고 conditional_unlock_door 함수를 호출해서 r15 값에 따라 문이 열리냐 안열리냐로 구분된다. 근데 이전 문제에서도 확인했다시피 내 입력 값으로 r15를 어떻게 조작할 수가 없다. 이번에도 16자 이상을 쭉 채워서 버퍼의 어느 위치가 login 함수의 ret인지 확인한다. ret를 인터럽트 call 주소로 변경해주고 다음 2 Byte에 0x7f 인자를 넣어주면 된다. call은 인자 ret jmp로 실행된다.
6161616161616161616161616161616160447f00
댓글 없음:
댓글 쓰기