이건 문제 분류상 기타&포너블에 속한 문제이다. 가중치가 0으로 점수는 없지만 ㅠ 리눅스에 흥미가 생겨서 풀어보았다.
문제 설명은 이러하다.
서버에 접속해서 보면 원래는 a.c 파일만 있었다.
gcc a.c를 입력하여 컴파일 해주면 a.out 파일이 생긴다.
그런데 flag 파일이 안생겨서 a.out을 실행을 해봤는데, 무슨 배열이 10번 출력된다.
상위 디렉토리로 이동하여 뭐가 있는지 봤는데,
anonymous 디렉토리와 stupid_gcc 디렉토리가 있었고 anonymous 디렉토리 안은 비어있었다.
한 번 더 상위 폴더로 이동할 경우 flag.txt 가 있는 것을 확인할 수 있다.
권한은 아무것도 설정되지 않았다.
참고로 ps를 입력해보면 10초마다 root가 a.out을 실행하고 있는 것을 알 수 있다.
소스코드는 직접 cat a.c를 해서 봐도 되고, 올려진 소스코드 다운받아도 된다.
소스는 간단하다.
v1이 10번 반복하는 동안 v2에 v1을 계속 더해주고 printf로 배열값을 출력한다.
가장 중요한 flag는 v2가 10000 이상일 때만 /flag.txt를 읽어서 현재 디렉토리인 /home/stupid_gcc에 flag.txt 파일을 작성해준다. 그러므로 간단히 생각하면, 저 소스코드의 v2 > 10000 을 수정하여 v2 > 50 정도로 바꾸어주면 flag.txt가 실행될 것 같다.
그렇지만 vi나 cat 명령어 등 쓰기를 할 수 있는 권한이 없어서 수정된 소스를 컴파일 하는 방법을 찾지 못했다...
대신 포럼의 글 중 gcc 옵션에서 버그를 발생시키라는 힌트를 보고 gcc 옵션에 대해 찾아보았다.
그 중 -O3 옵션을 발견했다. 왜곡이 발생할 위험 이 있다고 하니 이 옵션을 붙여서 컴파일 해보자.
바로 flag.txt 파일이 생겼다!
a.out 을 실행시켜보면 이렇게 계속 반복문이 수행되고 segmentation fault가 발생한다.
cat flag.txt로 flag 파일을 확인하면 성공 🤗