Wargame/Microcorruption
-
Addis AbabaWargame/Microcorruption 2014. 8. 14. 11:21
이번 문제는 login 함수가 없다. main 함수를 살펴보자. 4438 4438: 3150 eaff add#0xffea, sp 443c: 8143 0000 clr0x0(sp) 4440: 3012 e644 push#0x44e6 "Login with username:password below to authenticate.\n" 4444: b012 c845 call#0x45c8 4448: b140 1b45 0000 mov#0x451b ">> ", 0x0(sp) 444e: b012 c845 call#0x45c8 4452: 2153 incdsp 4454: 3e40 1300 mov#0x13, r14 4458: 3f40 0024 mov#0x2400, r15 445c: b012 8c45 call#0x458c 4460..
-
JakartaWargame/Microcorruption 2014. 8. 11. 17:34
login 함수를 살펴보면 username을 strcpy로 복사해오고, 그 길이(r11)가 0x21보다 크거나 같으면 프로그램을 종료해버린다. 45ae: 7b90 2100 cmp.b#0x21, r11 45b2: 0628 jnc#0x45c0 45b4: 1f42 0024 mov&0x2400, r15 45b8: b012 c846 call#0x46c8 45bc: 3040 4244 br#0x4442 즉, 우리는 최대 0x20까지만 username을 입력할 수 있다. 조금 더 아래쪽을 보면 [ 0x1f - username의 길이(r11) ] 부분이 있다.헌데 우리는 0x20까지 입력이 가능했다. 즉 [ 0x1f - 0x20 ] 의 결과로 0xffff(-1)가 나오게 된다.이후 이 값이 r14에 들어가 0x1ff와 ..
-
Santa CruzWargame/Microcorruption 2014. 8. 4. 17:05
login함수 앞부분을 살펴보면, Stack에 변수를 선언하는 부분이 있다.무엇을 위한 변수인지는 분석을 통해 알아가자. 4550 4550: 0b12 pushr11 4552: 0412 pushr4 4554: 0441 movsp, r4 4556: 2452 add#0x4, r4 4558: 3150 d8ff add#0xffd8, sp 455c: c443 faff mov.b#0x0, -0x6(r4) 4560: f442 e7ff mov.b#0x8, -0x19(r4) 4564: f440 1000 e8ff mov.b#0x10, -0x18(r4) 이후 이전 레벨들과는 다르게 username과 password 2가지를 입력받는다.그뒤 사용자가 입력한 값들을 strcpy로 각각 복사해온다.getsn에 길이 제한이 있긴 하..
-
MontevideoWargame/Microcorruption 2014. 7. 31. 16:41
login 함수를 살펴보면, 전체적으로 이전레벨인 Whitehorse와 별반 다를게 없다. 1. 0x2400 부분에 사용자가 입력한 값을 쓴다. 2. 위에서 입력받은 값을 strcpy를 이용해 sp가 가리키는 곳에 복사한다. 3. memset을 이용해 0x2400 부분에 사용자가 입력한 값을 0으로 초기화한다. 다만 memset이 추가되어, 0x2400 부분의 값들을 모두 0으로 초기화 하는것을 알 수 있다. 44f4 44f4: 3150 f0ff add#0xfff0, sp 44f8: 3f40 7044 mov#0x4470 "Enter the password to continue.", r15 44fc: b012 b045 call#0x45b0 4500: 3f40 9044 mov#0x4490 "Remember:..
-
WhitehorseWargame/Microcorruption 2014. 7. 31. 15:49
login 함수를 보면 conditional_unlock_door라는 함수를 호출한다. 4446 4446: 0412 pushr4 4448: 0441 movsp, r4 444a: 2453 incdr4 444c: 2183 decdsp 444e: c443 fcff mov.b#0x0, -0x4(r4) 4452: 3e40 fcff mov#0xfffc, r14 4456: 0e54 addr4, r14 4458: 0e12 pushr14 445a: 0f12 pushr15 445c: 3012 7e00 push#0x7e 4460: b012 3245 call#0x4532 4464: 5f44 fcff mov.b-0x4(r4), r15 4468: 8f11 sxtr15 446a: 3152 add#0x8, sp 446c: 3441 ..
-
JohannesburgWargame/Microcorruption 2014. 7. 31. 14:02
login 함수를 보면 마지막 부분에 sp에서 0x11만큼의 값이 0x1a인지를 비교하고, 다르면 password too long이라는 에러와 함께 실행이 종료되어 버린다. 452c ... 4578: f190 1a00 1100 cmp.b#0x1a, 0x11(sp) 457e: 0624 jeq#0x458c 4580: 3f40 ff44 mov#0x44ff "Invalid Password Length: password too long.", r15 4584: b012 f845 call#0x45f8 4588: 3040 3c44 br#0x443c 458c: 3150 1200 add#0x12, sp 그렇다면 sp가 가르키는 곳은 ? gets로 0x2400부분에 0x3f만큼 값을 입력받고, 이를 strcpy로 복사해온다..
-
ReykjavikWargame/Microcorruption 2014. 7. 31. 11:14
Main 함수를 보면, 이상하게도 gets나 puts 함수를 call 하지 않는다.대신 enc 함수만을 호출하고, 바로 0x2400이라는 주소를 호출한다.우선 enc 함수를 살펴보자. 4438 4438: 3e40 2045 mov#0x4520, r14 443c: 0f4e movr14, r15 443e: 3e40 f800 mov#0xf8, r14 4442: 3f40 0024 mov#0x2400, r15 4446: b012 8644 call#0x4486 444a: b012 0024 call#0x2400 444e: 0f43 clrr15 매우길다.... 하지만 차근차근 살펴보면 0x2400 주소부터 들어있는 data에 여러 반복문, xor 연산등을 하며 data를 인코딩(?) 한다. 4486 4486: 0b12 ..
-
CuscoWargame/Microcorruption 2014. 7. 31. 10:37
login 함수를 살펴보면, 마찬가지로 getsn함수로 값을 입력받는데 버퍼보다 큰 값을 입력받는다. ( 0x30 ) Hanoi와 같은 buffer overflow 문제라는 것을 알 수 있다. 4500 ... 4514: 3e40 3000 mov#0x30, r14 4518: 0f41 movsp, r15 451a: b012 9645 call#0x4596 이해를 위해 우선 0x30 ( 48 ) 만큼 A를 입력해보자. 이후 login 함수의 제일 마지막 부분인 ret 부분에 break point를 걸고 실행해보자. 그럼 위와 같이 sp가 사용자가 입력한 값인 4141부분을 가르치고 있는것을 알 수 있다. 이후 ret를 실행하면 당연히 이 값이 pc (eip) 부분에 들어가게 되고, 이는 올바른 주소가 아니므로,..