본문 바로가기

WARGAME/FTZ [system]

ftz level 18 [level18]

 

 

 

 

 

 

cat hint !

 

level18

 

 

너무 길어서 깜짝 놀랐다.

천천히 해석을 해보자면, 우선 쉘은 shellout()에 들어있으니 shellout() 을 실행하면 되는 것 같고,

check 가 0xdeadbeef 면 shellout() 을 호출하므로, check 가 0cdeadbeef 가 되도록 하면 될 것 같다.

 

 

그리고 중간에 보이는 fd_set 은 파일 디스크립터 구조체를 의미한다.

FD_ZERO 는 fd_set 으로 선언된 변수인 fds 를 초기화 할때 쓰이는 함수이다.

 

 

한마디로 이 소스에서는 STDID_FILENO 등이 인자로 사용된걸로 보아 그냥 사용자의 입력을 받는 구조체 정도로 이해하면 될 것 같다.

 

 

사용자의 입력에서 1바이트만 x 에 넣어 \r \n 0x08 이 아닌 경우 stiring[count] 에  x를 넣고 count 값을 ++ 하는데

위 if 문에 보면 count 가 100 이상이 될 경우 "what are you trying to do? " 라는 문자열이 출력되게 되어있는 걸로 보인다.

 

 

 

 

 

 

 

 

 

 

우선 디버깅을 해보자.

 

 

이 부분에서 주목해야하는 부분은 0xdeadbeef 문자열이 보이는 

main+91 이다.

 

0xdeadbeef 문자열과 cmp  하는 부분이 ebp-104 이고, 즉 check 이 될 것이고,

 

 

 

여기서는 밑에 inc 부분을 보면 inc 는 +1 명령어 이기 때문에 count ++ 부분에 해당하는 것을 추측할 수 있다.

 

따라서 위에 main+494 를 참고하여 string 변수는 ebp-100 임을 알 수 있다.

 

 

 

 

 

 

 

 

스택으로 살펴보면,

 

 

점점 허접해지는 것 같긴 하지만, 해석은 가능하다.

 

 

 

 

check 변수에 \xdeadbeef 가 들어가야하고, 그러나 check 이 나중에 선언되었기 때문에 string 을 이용해서 덮어씌우기가 불가능해보인다.

 

하지만 사용자의 입력 값이 0x08 이면 count 가 -- 된다는 점을 이용해서

0x08 을 4번 입력해준다면 아마 string 배열은 저 스택 에서 위로 4 바이트 올라가게 되어 check 자리를 덮어씌울 수 있게 될 것이다.

 

 

 

 

 

 

 

 

 

 

따라서 페이로드를 작성해서 입력해보면,

level19 password "swimming in pink" 획득 !

 

 

 

 

 

'WARGAME > FTZ [system]' 카테고리의 다른 글

ftz level 20 [level20]  (0) 2020.05.01
ftz level 19 [level19]  (0) 2020.05.01
ftz level 17 [level17]  (0) 2020.05.01
ftz level 16 [level16]  (0) 2020.05.01
ftz level 15 [level15]  (0) 2020.05.01