Microcurruption의 Jakarta다.
4560 <login>
4560: 0b12 push r11
4562: 3150 deff add #0xffde, sp
4566: 3f40 8244 mov #0x4482 "Authentication requires a username and password.", r15
456a: b012 c846 call #0x46c8 <puts>
456e: 3f40 b344 mov #0x44b3 "Your username and password together may be no more than 32 characters.", r15
4572: b012 c846 call #0x46c8 <puts>
4576: 3f40 fa44 mov #0x44fa "Please enter your username:", r15
457a: b012 c846 call #0x46c8 <puts>
457e: 3e40 ff00 mov #0xff, r14
4582: 3f40 0224 mov #0x2402, r15
4586: b012 b846 call #0x46b8 <getsn>
458a: 3f40 0224 mov #0x2402, r15
458e: b012 c846 call #0x46c8 <puts>
4592: 3f40 0124 mov #0x2401, r15
4596: 1f53 inc r15
4598: cf93 0000 tst.b 0x0(r15)
459c: fc23 jnz #0x4596 <login+0x36>
459e: 0b4f mov r15, r11
45a0: 3b80 0224 sub #0x2402, r11
45a4: 3e40 0224 mov #0x2402, r14
45a8: 0f41 mov sp, r15
45aa: b012 f446 call #0x46f4 <strcpy>
45ae: 7b90 2100 cmp.b #0x21, r11
45b2: 0628 jnc #0x45c0 <login+0x60>
45b4: 1f42 0024 mov &0x2400, r15
45b8: b012 c846 call #0x46c8 <puts>
45bc: 3040 4244 br #0x4442 <__stop_progExec__>
45c0: 3f40 1645 mov #0x4516 "Please enter your password:", r15
45c4: b012 c846 call #0x46c8 <puts>
45c8: 3e40 1f00 mov #0x1f, r14
45cc: 0e8b sub r11, r14
45ce: 3ef0 ff01 and #0x1ff, r14
45d2: 3f40 0224 mov #0x2402, r15
45d6: b012 b846 call #0x46b8 <getsn>
45da: 3f40 0224 mov #0x2402, r15
45de: b012 c846 call #0x46c8 <puts>
45e2: 3e40 0224 mov #0x2402, r14
45e6: 0f41 mov sp, r15
45e8: 0f5b add r11, r15
45ea: b012 f446 call #0x46f4 <strcpy>
45ee: 3f40 0124 mov #0x2401, r15
45f2: 1f53 inc r15
45f4: cf93 0000 tst.b 0x0(r15)
45f8: fc23 jnz #0x45f2 <login+0x92>
45fa: 3f80 0224 sub #0x2402, r15
45fe: 0f5b add r11, r15
4600: 7f90 2100 cmp.b #0x21, r15
4604: 0628 jnc #0x4612 <login+0xb2>
4606: 1f42 0024 mov &0x2400, r15
460a: b012 c846 call #0x46c8 <puts>
460e: 3040 4244 br #0x4442 <__stop_progExec__>
4612: 0f41 mov sp, r15
4614: b012 5844 call #0x4458 <test_username_and_password_valid>
4618: 0f93 tst r15
461a: 0524 jz #0x4626 <login+0xc6>
461c: b012 4c44 call #0x444c <unlock_door>
4620: 3f40 3245 mov #0x4532 "Access granted.", r15
4624: 023c jmp #0x462a <login+0xca>
4626: 3f40 4245 mov #0x4542 "That password is not correct.", r15
462a: b012 c846 call #0x46c8 <puts>
462e: 3150 2200 add #0x22, sp
4632: 3b41 pop r11
4634: 3041 ret
이제 문제를 풀다보니 버퍼에 제한이 걸리면 무조건 꽉채워보는 습관이 생긴 것 같다. 이렇게 하면 안되지만 어쨋든 분석해보면 문자열의 길이를 비교하는 부분이 있다.
r11 = 입력한 문자열의 길이 (0x20 = 32)
45c8: 3e40 1f00 mov #0x1f, r14
45cc: 0e8b sub r11, r14
45ce: 3ef0 ff01 and #0x1ff, r14
합쳐서 32글자라고 했으니깐 한번 입력에 32만큼 입력하면 어떻게 되는지 쭉 분석하다가 보니깐 다음 입력의 길이를 구하는 부분에서 0x1f - 0x20 = -1 (0xffff)가 되고 음 뭐지? 하다가 0x01ff랑 and 연산을 해서 다음 입력의 길이로 사용되었다. 이거의 경우 ULONG으로 for문을 돌다보면 FFFF를 넘어가는 순간에 다시 0으로 되어 무한루프가 발생하는 코드를 작성했었던 참사가 있어서 잘 알고 있다. 같은 케이스다. 길이를 검사하는 구간에서는 cmp.b라서 0x20을 0x120으로 인식시켜주면 우회할 수 있는데, 이미 전에 0x20을 꽉채웠으니깐 0x100만큼만 입력해주면 0x120이 된다. 0x120만큼 쓰레기 데이터를 입력해주면 된다.
3fe0: 7846 0100 7846 0300 ec46 0000 0a00 2000 xF..xF...F.... .
3ff0: 2e46 6161 6161 6161 6161 6161 6161 6161 .Faaaaaaaaaaaaaa
4000: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
4010: 6161 6262 6262 XXXX 6262 6262 6262 6262 aabbbbbbbbbbbbbb
ret를 sp가 XXXX를 가리키고 있었고, XXXX를 unlock_door 주소로 덮어주면 된다.
댓글 없음:
댓글 쓰기