cat hint !
너무 길어서 깜짝 놀랐다.
천천히 해석을 해보자면, 우선 쉘은 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 |