PlaidCTF는 2021 4월 17일 ~ 4월 19일에 진행된 CTF 대회다.
처음부터 너무 어려운 CTF 대회를 골랐는지 문제를 하나도 풀지 못해 접근한 방식만 작성하려고 한다.
위가 Plaidflix 문제다. 해석해보면 "Plaid+ episodes가 재미없다고? 바뀐 Plaidflix를 시도해봐라"다.
이번 CTF는 특이하게 문제(테마?) 하나당 여러 에피소드(문제)로 구성돼 있는데 나는 Launch를 풀려고 시도했다.
문제를 받아서 확인해보면 위 사진과 같이 flag.txt 파일, plaidflix 파일이 존재한다. 이 외로도 도커 파일이 있지만 문제 풀이와는 연관 없는거 같아 스킵했다.
당연히 flag.txt에 적혀있는 것은 진짜 flag가 아닌 가짜 flag였다. 여기까지 봤을 때 예상할 수 있는 것은 서버에도 flag.txt라는 파일이 존재해 plaidflix 파일의 취약점을 찾아 exploit에 성공하면 flag.txt에 적힌 flag를 출력해줄 것 같다.
plaidflix 파일을 실행해보면 다음과 같은 화면이 나온다. 먼저 사용자 이름을 받고 4가지 메뉴중 원하는 메뉴를 숫자로 선택할 수 있게끔 해준다.
0번 메뉴는 영화를 관리하는 메뉴로 영화 추가, 삭제, 목록 확인, 친구에게 영화를 공유하기를 할 수 있다. 이 과정에서 사용자 입력을 받는다.
1번 메뉴는 친구 추가, 친구 삭제, 친구 목록 확인을 할 수 있다.
2번 메뉴는 현재 접속한 계정(?)을 지우는 메뉴 같다.
3번 메뉴는 프로그램을 종료해주는 메뉴다.
대충 어떤 동작을 하는지 확인했으므로 checksec 명령어로 어떤 보호기법이 걸려있는지 확인해봤다.
Stack에는 Canary가 존재해 스택 오버플로우 공격을 수행할 수 없고, NX bit 또한 존재해 쉘 코드를 삽입할 수도 없다.
내가 알고 있는 공격인 bof, RTL, got overwrite 공격은 수행이 불가능할 것 같다.
일단 ida를 통해 파일을 열어봤다.
main 함수에는 별 내용이 없었다. sub_1170을 3번 호출하고 sub_20BC를 호출하는데 흐름상 sub_20BC가 메뉴를 보여줄 것 같다.
예상대로 sub_20BC에서 메뉴를 출력하고 선택지를 관리해주는 동작을 한다. 어쩌피 스택 오버플로우 공격은 불가하기에 스택 오버플로우 관련 취약점을 중점으로 보기 보다는 포맷 스트링 공격, 힙 오버플로우, UAF 공격등을 중점으로 탐색해봤다.
위처럼 로드되는 함수들은 많은데 코드 어디에도 위 함수를 호출하는게 보이지 않아 이상하게 여겨져서 한 번 알아봤다.
main에서 3번 정도 호출하던 sub_1170을 확인해봤다. 보니까 이 sub_1170 함수는 setvbuf_ptr이 있는 주소로 점프해주는 역할을 하는 것이었다.
이걸보고 다른 함수들도 sub_1170처럼 한 함수를 거쳐 사용할 함수가 있는 주소로 점프 시켜주는거다 생각해 ida function window에 존재하는 함수들을 하나하나 확인해본 후 분석을 편하게 하기 위해 함수 이름을 바꿔뒀다.
뭐 때문인지는 모르겠으나 rtl이나 got overwrite 공격을 막기 위해 함수를 호출할 때 다른 함수를 거쳐 점프하도록 작성한게 아닌가 생각이 든다.
menu와 선택지를 관리하는 코드를 분석하며 다른 함수들도 역할에 맞게 함수 명을 바꿔줬다. 또한 동작도 주석을 달아봤다.
하지만 몇 시간을 분석해도 그렇다할 취약점이 보이지 않았다. 아무래도 free 함수가 존재하기 때문에 힙 관련 취약점이 아닐까 생각을하고 초점을 맞춰서 분석했지만 보이지 않았다.
그러던 중 팀원 중 한 분이 미처 발견하지 못한 부분을 알려주셔서 해당 부분을 ida로 찾아봤다.(여쭤보니 문자열을 주의 깊게 보셔서 찾아냈다고 한다. 다음부터는 문자열도 주의 깊게 보는 버롯을 들여야겠다.)
위 부분이 바로 팀원 분이 알려주셨던 부분이다. 저 문자열을 띄우려면 영화 관리 메뉴에서 영화 제거를 선택하고 0보다 작은 수 혹은 6보다 큰 수를 입력하면 된다.
위 코드에서 실마리를 잡긴했는데 확신하지는 모르겠다. 보면 qword_60C0[v2][1]을 free시킨 후 qword_60C0[v2][1]에 다시 0LL을 넣는데 이미 free 시킨 공간에 0LL을 넣는 것을 봐서 UAF 공격이 성립하지 않을까 생각이 들었다.
하지만 너무 늦게 발견했고, UAF에 대해서 공부를 못한지라 결국 풀지 못했다..
write up이 올라온다면 꼭 한 번 보고 공부할 생각이다.
-PlaidCTF 후기-
한 문제도 풀지 못했다는 사실에 충격을 많이 받았고 stack overflow 공격이 막히자 무력해지는 내 자신의 지식에 많이 놀랐다. PlaidCTF 문제가 어려웠다는 사실도 있지만 다양한 취약점 공부를 못한거 같아서 이 부분부터 보완해야겠다는 생각이 들었다.
이번 ctf는 부족한 점을 뼈저리게 느끼게 해주고 내가 공부하고 가야할 길을 알려준 대회인 것 같다.
'CTF' 카테고리의 다른 글
[DawgCTF 2021] Misc - DawgCTF Discord (0) | 2021.05.08 |
---|---|
TamuCTF 2021 후기 (0) | 2021.04.25 |
TamuCTF 2021 - TicTacToe (0) | 2021.04.25 |
TamuCTF 2021 - Pancake (0) | 2021.04.25 |
TamuCTF 2021 - Handshake (0) | 2021.04.25 |