본문 바로가기
Hack/ftz

ftz 풀이 level18

by Choraengyi 2017. 1. 8.
728x90

 ftz level18 풀어보겠습니다.


힌트조회입니다.



 attackme의 소스인데 필수적인 몇개만 설명하며 넘어가겠습니다.


*FD_SET, FD_ZERO, select() 에 대한 내용은 아래의 URL을 참고하시면 됩니다.

http://mintnlatte.tistory.com/313


if(count >= 100)                                                    //count가 100이상이면

        printf("what are you trying to do?\n");               //문자열 출력

      if(check == 0xdeadbeef)                                    //check의 값이 0xdeadbeef 이면

        shellout();                                                    //shellout함수 실행(쉘함수)



switch(x)                                                                //switch case문

                    {

                      case '\r':                                        //x가 \r 일 경우 아무것도 안함

                      case '\n':                                        //x가 \n일 경우

                        printf("\a");                                   //"\a" 출력

                        break;                                           

                      case 0x08:                                         //x가 0x08일 경우

                        count--;                                         //count를 1내림

                        printf("\b \b");                                //"\b \b" 출력

                        break;

                      default:                                            //나머지 경우

                        string[count] = x;                                //string[count]에 x 값 삽입

                        count++;                                        //count = count + 1

                        break;

                    }


 큰 힌트에는 빨간 표시를 해놓았습니다. 지금까지 보면 check변수에 0xdeadbeef 를 삽입하면 쉘함수가 실행되어 넘어갈 수 있다는 것을 알 수 있습니다. 메모리 구조를 살펴보겠습니다.



엄청나게 긴데 포인트만 잡아서 빨간 부분에 표시해놓았습니다. 우선 목적이 메모리구조 파악이기 때문에 변수와 배열의 위치를 찾는 위주로 표시해놓았습니다.


메모리 구조는 대략 이렇습니다.









0xffffff9c 

string[100]


0xffffff98 

check


0xffffff94 

x


0xffffff90 

count


 check에 변화를 주어야 하는데 string 시작 주소가 check 주소보다 상위에 있어 변화를 주기가 힘들어 졌습니다. 전에 했던 방법과는 살짝 다른 구조라서 다른 방법을 생각해보다가 배열이 주소로 접근한다는 것을 알게되었습니다.


예를 들면 


 이러한 코드가 있을때 배열카운터에 -4의 값을 넣으면 출력되는 값은 b배열의 시작에서 -4바이트에 있는 값이 출력됩니다. 위의 코드에서는 {높은   b | a   낮은} 순으로 되있어서 4바이트 낮아지면 a의 값이 출력됩니다.



이와 같은 배열의 성질을 통해 아까 C 코드에서 이러한 부분이 있었습니다.


     case 0x08:                                         //x가 0x08일 경우

                        count--;                                         //count를 1내림

                        printf("\b \b");                                //"\b \b" 출력


0x08을 입력하면 count값이 1씩 감소 됩니다. count 초기 값이 0이고 string 밑에 바로 check가 있으므로 4바이트를 내려가면 check의 시작주소에 접근할 수 있게 됩니다. 최종 공격으로 0x08 값을 4번 넣고, 0xdeadbeef 를 넣어 실행시켜 보겠습니다.



ftz level19 패스워드가 나왔습니다.


728x90
반응형

'Hack > ftz' 카테고리의 다른 글

ftz 풀이 level20  (0) 2017.01.12
ftz 풀이 level19  (0) 2017.01.11
ftz 풀이 level17  (0) 2017.01.06
ftz 풀이 level16  (0) 2017.01.06
ftz 풀이 level15  (0) 2017.01.04

댓글