이번에 HypeBoy 팀으로 DEFCON 31 CTF 본선에 참여하고 왔습니다. 2020년과 2022년에도 DEFCON 본선에 참여하였지만 코로나 및 대학원 면접 이슈로 오프라인으로 참가하는 것은 이번이 처음이라 굉장히 설렜습니다.
DEFCON 예선
DEFCON 예선 이야기를 잠깐 하자면, 저희 팀은 소수의 인원으로 구성되어 있었기 때문에 예선을 통과하는 것부터 난관이었습니다. 15명의 인원으로 예선을 진행했는데 1명당 한문제를 풀어도 본선 통과는 어림도 없었습니다.
ifuckup이라는 문제를 외롭게 담당하던게 기억에 남는데, 이 문제는 well512 암호를 기반으로 한 PRNG로 생성된 값으로 PIE base, libc base, stack base가 바뀌는 문제였습니다. PRNG를 깨기 위한 아이디어을 내고 10시간 내내 코딩하다가 겨우 플래그를 따냈습니다(진짜 겨우 1인분 한 느낌이라 굉장히 기분좋았습니다 ㅎㅎ). 근데 알고보니 PRNG를 깨는 의도로 출제한 문제가 아니라 그냥 VDSO 영역에 있는 syscall 가젯을 이용한 ROP가 인텐이었다고 해서 정말 어이가 없었습니다 ㅠ
강남 Hspace에 모두 모여서 48시간 내내 진행한 결과 기적처럼 12등(턱걸이)으로 본선에 진출하게 되었습니다. 사실 마지막 문제를 풀고난 후 더이상 풀게 없어서 다같이 스코어보드만 보며 1시간 기도하고 있었습니다 ㅋㅋ (작년 본선 2등이었던 Katzebin 팀이 저희 바로 밑이어서 무조건 플래그 키핑이라고 생각했는데 아니어서 정말 다행입니다 ㅠ)
DEFCON 본선
본선은 Las Vegas 시간 기준 08.11 10:00 ~ 08.13 14:00으로 진행되었습니다. 중간에 쉬는시간이 있지만, 다음날 공격/방어 준비를 해야하기 때문에 거의 밤샐 각오는 하는 편입니다.
DEFCON은 다른 CTF와는 조금 다르게 Attack & Defense(A&D)와 King of the Hill(KOH) 문제의 점수 합으로 순위를 매깁니다. A&D의 경우 취약점을 패치해서 올리면 해당 바이너리가 다른 팀에게 공개되는 시스템이며, 공격에 성공할 때마다 1점이 부여됩니다. 만약 1 tick(5분)에 모든 공격을 막는다면 방어 점수 1점이 부여됩니다. 이번 A&D의 경우 다소 특이하게 Docker를 주고 도커를 수정해서 올리게끔 패치를 하게 하였는데, 이런 형식 덕분에 많은 팀들이 libc도 바꾸는 등의 창의적인 패치를 많이 적용했습니다.
KoH의 경우 점수를 내는 시스템이 올라가고 1 tick마다 높은 점수를 얻는 팀에게 정해진 점수가 제공되는 시스템입니다. 이번에는 1~5등에게 각각 12 / 7 / 4 / 2 / 1점이 부여되었습니다. 이전과 다르게 KoH 점수가 많이 높아서, 시작할 때부터 KoH로 등수가 갈릴 것으로 예상하였습니다.
대회 D-1
대회 시작 하루 전에 입장 뱃지를 배분했는데, 오프라인으로 처음 참여해보는 제가 봤을 때 정말 믿을 수 없을 정도로 대충(?) 운영하더라구요. 모든 팀이 들어와있는지도 모르는 채팅방에 “6시에 에스컬레이터 앞에서 받아가세요~”라고 그냥 공지하는 식이었습니다. 심지어 건물 들어가려는데 뱃지 없으면 못들어간다고 해서 한바탕 했던게 기억나네요.
아무튼 뱃지를 8개 받았는데 1개만 정상적인 뱃지고 나머지 7개는 급조한(?) 플라스틱 뱃지였습니다 ㅠ 나중에 알고보니 급조한 플라스틱보다 더 낮은 퀄리티로 종이 뱃지도 있었다고 하더라구요. CTF 운영진들도 DEFCON 주최측에서 뱃지를 받아서 전달하는 형식이라서 그러려니 했지만, 목걸이 줄 없는건 좀 아닌 것 같아서 구해달라고 부탁을 하니 2일차 대회 시작 직전에 스윽 가져다줬습니다 ㅎㅎ
대회 1일차
예상했던 바와 같이 10시에 시작하지 않았습니다. 운영진들도 당일 아침에 와서 환경을 세팅하고, 여러 팀들이 참가하다보니 다양한 이슈가 생겨서 매번 2~30분정도 미뤄진 것 같습니다. 대회 서버가 정상 오픈할 때까지 기다리고 있을 때 Team Token을 나눠줬는데, 진짜 실시간으로 급조한 티가 너무 나서 어이가 없었습니다. (이게 DEFCON의 현실인가 봅니다)
타임라인을 대략 정리하자면 10시 30분쯤 웹페이지가 오픈되어 첫 문제가 나왔고, flag submit API는 11시 30분쯤 개발되었습니다(플래그를 따도 플래그 제출을 못하다니!!!). 그리고 대회장 인터넷이 너무 느려서 vscode remote ssh server 다운로드 받는데 한 20분정도 걸리더라구요. (하하.. 답답해 미치는 줄 알았습니다)
아무튼 1일차 대회 중에는 2개의 KoH 문제와 여러 Attack & Defense 문제들이 나왔는데, 저는 초반에 잠시 A&D 문제의 취약점을 찾다가 KoH 문제가 열리자마자 KoH에 시간을 쏟았습니다.
처음 나온 KoH는 evm이라는 문제였는데, 사실 문제명을 보자마자 blockchain evm이 나오는게 아닌가 했지만 다행히도 일반적인 문제였습니다. Rust로 구현된 vm과 함께 ELF 바이너리가 주어졌고, vm에 구현된 instruction들을 활용해서 플래그를 읽어내야 했습니다. vm에는 일반적인 IO들과 함께 binary bit flip instruction이 제공되어 있었습니다. 각 instruction을 실행할 때마다 소모되는 cost가 정해져있고 해당 cost를 적게 사용하는 팀이 높은 등수를 가져가는 시스템이었습니다.
KoH를 하는데 Reinose 님께서 너무너무 잘하셔서 중간에 잠시 실직하긴 했습니다 ㅎ 그리고 10분에 한번 꼴로 팀원들이 문제 질문이나 항의를 요구해서, 이 때는 운영진에게 따지러 가는 팀 전담 통역사가 된 기분이었습니다 ㅋㅋ
아무튼 어찌저찌해서 신기하게도 3등으로 1일차를 마무리했습니다.
대회 끝나기 직전에 문제가 2~3개 갑자기 나왔어서 다들 의아해하고 있었는데, 캡틴 미팅 때 처음 하는 말이 “너희 아마 잠 못잘거야 힘내!”라길래 진짜 어처구니가 없었습니다. 덕분에 새벽까지 하늘이랑 승기님이랑 계속 cache라는 문제를 분석했는데, 1시쯤 취약점을 찾고 3시쯤 익스플로잇에 성공해서 “무조건 1등임"이라는 채팅을 남기고 잠시 자러 갔습니다.
대회 2일차
이번 DEFCON은 이전과 다르게 KoH 점수 비중이 높았기 때문에, 1일차에 KoH 문제를 담당하던 사람들이 3일까지 쭉 담당하기로 했습니다. 전날에 KoH 익스에 성공했기 때문에 스크립트를 돌려놓고 evm 문제에 합류하였습니다.
많은 팀이 익스플로잇을 준비해올 것이라고 예상은 했지만, 첫 번째 tick에 4팀이 최고 점수를 기록했고 그 후로도 계속 공동 1등을 유지하였습니다.
그런데 취약점이 의도된게 아니었던건지, 2시간만에 취약점을 패치해서 바이너리를 업데이트 시켜버렸습니다 (아놔… 이럴거면 밤 안샜지!!)
이후, 남은 시간동안 내내 cache 문제 분석만 하다가 2일차가 날아가버렸습니다ㅠㅠ 다른 팀들은 인원이 많아서 여러 취약점에 대한 공격을 미리 준비해왔던 것 같았고, 그래서 패치 후에도 점수를 계속 얻고 있었습니다.
cache 문제 뿐만 아니라 safebox라는 KoH 문제가 하나 더 나와서 하늘이랑 같이 멀티를 진행했고, 저는 오프라인 항의하러 계속 가야해서 3가지 일을 동시에 하느라 정신이 너무 없었습니다. 내년에는 진짜로 통역담당을 데려와야겠다는 생각을 많이 했습니다.
팀원들이 다양한 채널에서 계속 저를 태그하면서 문제 상황을 이야기하길래, 결국 현실갱 이라는 슬랙 채널도 하나 팠습니다 ㅋㅋㅋ
정신없이 8시간이 흘러갔고, 2일차가 마무리되었습니다. 스코어보드를 보니 MMM팀과 격차가 너무 벌어져서 1등은 무리라고 생각했지만, 저희에게는 LiveCTF가 남아있었기 때문에 2등까지는 노려볼만하다고 생각했습니다. 마침 2등과 3등 팀이 LiveCTF에서 탈락했던 상황이고 저희 팀은 최소 3등이 확정된 상황이었습니다. 만약 저희가 1등을 한다면 800점 이상의 차이를 낼 수 있었기 때문에 충분히 가능성이 있었습니다.
2일차 종료 이후, 1일차 밤과 똑같이 하늘이랑 승기님이랑 새벽까지 cache 문제 분석을 진행했습니다. 정말 문제의 모든 것을 이해했지만 새벽 5시까지 아이디어가 떠오르지 않더라구요. 그러다가 문득 신박한 아이디어가 하나 떠올랐고, 바로 마무리해버렸습니다.
이 때, 아주 간단한 트릭으로 점수를 일반적인 접근보다 점수를 살짝 더 낼 수 있어서 1등이라고 확신했습니다. 만약 1일차처럼 또 패치해버리면 아메리카노를 부어버리려고 했습니다. 이 상황에서 제가 얼마나 피곤했냐면 계속 "뜨거운 아이스아메리카노"라는 말을 했다고 합니다 ㅋㅋ
대회 3일차
마지막날은 4시간밖에 없고 무난히만 가면 LiveCTF 점수 받아서 2~3등을 노려볼만해서 막판 스퍼트를 달렸습니다.
우선, 전날 밤새 하늘이랑 승기님이랑 cache 문제를 완벽히 풀어놔서 문제 없이 계속 1등 점수를 받았습니다. (다행히도 뜨거운 아아를 던질 일은 없었네요 ㅎㅎ)
그런데, 갑자기 네트워크 이슈가 발생했습니다. 서버의 응답이 너무 느려서 익스플로잇 코드가 있어도 플래그를 가져오지 못하는 상황까지 와버렸습니다. 이것 때문에 운영진이랑 1시간을 넘게 싸우다가, 우리 쪽의 문제라고 해서 다들 어이 없는 기분으로 어쩔 수 없이 수동으로 1분에 하나씩 공격코드를 실행시켜서 플래그를 제출 노가다만 진행했습니다.
1시간 정도 노가다를 하다가, 아무리 해도 순위 변동은 안될 것 같아서 마지막 두시간 정도는 대회를 살짝 관두고, 다같이 주창이의 LiveCTF 관전을 했습니다. 모두가 공감하겠지만 LiveCTF 결승전은 정말 흥미진진했고 jinmo 선배님과 주창이 둘다 너무 잘해서 1시간 내내 감탄만 했던 것 같습니다.
대회 마무리
결과적으로 4등으로 DEFCON 31 본선을 마무리 했습니다.
최소 3~40명으로 구성된 다른 팀들에 비해 15명이라는 인원인 저희 팀 입장에서는 꼴등만 안해도 본전이었는데, 4등이라는 좋은 성적이 거의 기적같았습니다. 마지막 날에 있었던 네트워크 이슈 때문에 살짝 아쉽긴 했지만, 더 잘 준비해서 내년에 좋은 결과 가져와보도록 하겠습니다.
제가 영어를 막 그렇게 잘하진 않지만, 말하고 듣는데에는 큰 무리가 없고 또 팀에서 영어하는 사람이 많이 없어서 어쩌다보니 이번 대회에서 통역 역할을 하게되었습니다. 아마 내년에도 본선을 가게 된다면 또 통역 역할을 할테니 1년간 영어 공부를 좀 해서 내년엔 더 잘 싸워보려고 합니다 ㅎㅎ (매년 대회할 때마다 이슈가 생길 수밖에 없고 건의를 무작정 해야 이득인 것 같습니다)
마지막으로, 내년에는 꼭 하이브 / 뉴진스의 후원을 받아보도록 하겠습니다(응원 영상이라도 어떻게 안될까요? 저희가 내년에 꼭 1등해서 단상에서 춤이라도 추겠습니다 ㅠ). 만약 개인적으로 친분이 있는 분이 있다면 꼭 전해주시길 바랍니다 ㅠㅠ 심지어 구글에 hypeboy를 검색하면 데프콘 내용이 먼저 나옵니다!!
이 자리를 빌려 많은 지원을 해주신 BoB 측에 감사의 인사를 전합니다.
또, HypeBoy 팀의 리더이신 hellsonic, dakuo님에게도 감사의 인사를 전합니다.
HypeBoy 화이팅!!
'CTF > CTF 대회 후기' 카테고리의 다른 글
CODEGATE 2023 본선 후기 (1) | 2023.08.26 |
---|---|
SSTF 2021 후기 (1) | 2021.08.17 |
DEFCON CTF finals 2020 후기 (0) | 2020.08.10 |
CODEGATE2020 예선 후기 (0) | 2020.02.09 |