-
[F.T.Z] Level 12Wargame/F.T.Z 2022. 9. 25. 14:05반응형
Level 12를 풀어보자.
Level 11과 굉장히 유사하지만, 마지막에 차이가 있고 이에 대한 개념이 필요하다.
Level 12의 hint를 살펴보자.
이번에도 attackme라는 실행 파일의 소스 코드인 듯하다.
간략히 분석을 해보자면, str에 char형으로 256의 크기를 가진 배열을 선언한다.
그 후 setreuid로 Level 13의 권한을 획득하고, 문장을 출력한다.
이번에는 strcpy가 아닌, gets 명령어로 str에 문자열을 입력받는다.
마지막으로 str의 내용을 출력하며 프로그램이 종료된다.
프로그램을 실행해보면 문장을 입력받고, 그 문장을 출력한 후 종료되는 것을 알 수 있다.

<Level 12의 hint> attackme 파일을 분석해보자.
Level 11과 마찬가지로 gets 함수 윗부분을 살펴보면 eax와 ebp에 264만큼의 공간이 있다.
sfp의 4바이트를 포함해 268 바이트의 공간을 채우고, return address에 4 바이트의 쉘 코드를 입력해 해결하자.

<attackme 파일 분석> 환경변수를 선언하고, 확인한다.

<환경변수 선언> /tmp 디렉터리에 선언한 환경변수의 주소를 출력할 수 있는 코드를 작성한다.

<환경변수 주소 출력 코드> 컴파일 후 실행시키면 환경변수의 주소가 나타난다.

<나타난 환경변수의 주소> 다시 홈 디렉터리로 돌아와 프로그램을 실행시키며 페이로드를 입력한다.
그런데.. 이상하다.
쉘이 나타나는 것이 아니고, 프로그램이 실행된 후 종료된다.
무엇을 잘못한 것일까??

<나타나지 않는 비밀번호> 사실 페이로드를 작성하는 방법에는 두 가지가 있다.
첫 번째는 앞의 Level 11에서 했었던 argv (파라미터) 방식이다.
이것은 명령어 자체가 인자로서 입력되는 것이다.
그래서 Level 11에서는 프로그램이 시작되면서 그 인자로 뒤의 명령어가 입력되어 쉘이 실행되었던 것이다.
두 번째는 이번 Level 12에서 하는 stdin (표준입력) 방식이다.
이것은 프로그램의 동작 중에 명령을 입력받는 방식이다.
이렇게만 적혀 있다면, 프로그램을 실행시키고 명령어를 입력하면 되는 것 아니냐고 생각할 수 있다.
하지만, attackme는 입력된 문자열을 단지 출력해줄 뿐이다.
그렇다면 어떻게 공격 명령을 attackme 프로그램에 입력시킬 수 있을까??
아래의 코드를 보면 파이프를 이용해 출력을 attackme에 입력할 수 있다.
여기서 의문은 왜 뒤에 cat 명령어가 추가로 붙는 것일까??
구글링을 해보면 python exploit 만으로도 쉘이 실행된다고 한다.
그런데 쉘에게 stdin은 EOF(End Of File)를 주게 되고, 이로 인해 쉘이 종료가 된다고 한다.
그래서 cat 명령어를 추가해 쉘에 EOF를 주지 않게 하고 이후 명령을 입력할 수 있게 하는 것이다.
이런 과정을 거쳐 my-pass를 입력해보면 Level 13의 비밀번호가 나타난다.

<나타난 비밀번호> Level 11과 모든 것이 비슷하지만, 페이로드의 입력법에 대해서 알게 되었다.
완전히 이해한 것은 아니고, 앞으로도 이번과 비슷하게 작성을 할 것 같지만 사용하면서 조금씩 이해하도록 하자.
반응형'Wargame > F.T.Z' 카테고리의 다른 글
[F.T.Z] Level 14 (0) 2022.09.28 [F.T.Z] Level 13 (1) 2022.09.26 [F.T.Z] Level 11 (0) 2022.09.25 [F.T.Z] Level 10 (0) 2022.09.24 [F.T.Z] Level 9 (1) 2022.09.21