Microcurruption Jakarta

10

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 주소로 덮어주면 된다.

 

댓글 없음:

댓글 쓰기

Microcurruption Addis Ababa

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