DEF CON CTF 2020 후기

대학원 입학 준비 + 이사 준비 + (롤 티모 프레스티지 스킨을 위한 노가다,,,) 등으로 바빠서 글을 오랜만에 쓰네요.

 

작년에는 본선에 가서 ㄹㅇ 한게 없었어서 후기를 빙자한 라스베가스 여행기를 올렸는데 올해에는 그래도 대회에 대해 할 얘기가 조금 생겼습니다.

 

시기가 시기인만큼 데프콘 컨퍼런스는 온라인으로 진행되었고 CTF 또한 온라인 상에서 진행되었습니다.

 

저희 팀은 2019 CODE BLUE CTF에서 우승해서 진출권을 땄습니다. 졸업하고 나서는 크게 CTF를 많이 하지 않았어서 데프콘도 별 생각이 없다가 지금 동아리 회장인 친구한테 요새 잉여인력이라 혹시 필요한 상황 있으면 도와주겠다고 했고 그렇게 어쩌다보니 데프콘에 참여했습니다.

 

디코 그룹에 들어가보니 재학생과 졸업생들이 많이 있었고 특히 경험 많은 선배들이 이것저것 리드를 해주셨습니다.

- 대회에 대한 정보

일단 대회 일정이 좀 미쳤습니다. 작년 데프콘에서는 8시간 공방 - 16시간 휴식 - 8시간 공방 - 16시간 휴식 - 4시간 공방으로 총 52시간 진행된 것으로 기억하는데 이번에는 공방전이 4번의 shift에 걸쳐 진행되었습니다. 각 shift는 8시간이었고 shift 사이에 9시간의 휴식 시간이 있었습니다. 즉 8시간 공방 - (9시간 휴식 - 8시간 공방)x3 으로 진행되었습니다. 24시간을 주기로 돌아가면 시간대에 따라 유불리가 심하게 갈릴 수 있으니 일부러 괴상하게 해놓은 것 같았습니다. 그러다보니 한국 시간 기준으로

 

1. 2020-08-07 21:00 ~ 08-08 05:00

2. 2020-08-08 14:00 ~ 08-08 22:00 

3. 2020-08-09 07:00 ~ 08-09 15:00

4. 2020-08-10 00:00 ~ 08-10 08:00

 

이라는 어마어마한 스케쥴로 대회가 진행되었습니다.

 

다만 작년에는 원래 shift가 끝나기 직전에 문제를 여러 개 공개해서 휴식 시간에도 휴식을 거의 할 수 없었는데 올해에는 딱히 그러지 않았습니다. 당연히 shift가 진행될 때에는 잠을 잘 수가 없었고 휴식 시간에도 가능하면 깨어있고 싶었지만(혹시 제가 필요한 상황이 있을수도 있으니) 파릇파릇한 대학생 시절과 달리 이제는 늙어서 그런지 밤을 새는게 많이 힘들었고 특히 마지막 shift에서는 거의 제정신이 아닌 채로 있었습니다.

 

문제는 작년과 같이 일반적인 attack & defence 형식의 문제와 king of the hill 형식이 있었고 자세한 정보는 여기를 참고하세요. attack & defence 문제는 어느 한 팀이 600개의 플래그를 획득한 순간 종료되었습니다.

 

각 tick은 6분 동안 진행되니 각 문제에서 매 6분마다 최대 15개의 플래그를 획득할 수 있었습니다. 그렇기에 일단 exploit이 나오고 나면 다른 팀이 얼마나 적극적으로 패치를 성공하냐에 따라 대략 4-8시간 후에 문제가 종료된다고 생각하면 됐습니다.

- 세팅

wireguard로 vpn 환경을 구축했고 저는 윈도우에서 VSCode + SSH로 로컬과 서버를 왔다갔다하며 코딩했습니다.  또 대회 전날에 후배가 짜놓은, 패킷을 ip / port 단위로 쪼개어 저장하는 스크립트를 이용해 제 서버에서 실시간으로 제공되는 패킷을 받아 분석한 후 플래그를 뺏긴 것으로 의심되는 패킷은 따로 표시를 할 수 있도록 했습니다. 그리고 제 서버에 SSH로 접속해 패킷을 확인할 수 있도록 처리를 해두었습니다. 그러나 후술하겠지만 실제 문제를 풀고있는 팀원들에게 이 부분이 별로 도움이 되지는 않았습니다.

- 패킷

나름대로 제 서버에 패킷을 자동으로 받아 분석하도록 했지만 분석 결과에서 플래그를 제대로 못잡아내는 경우도 있었고 또 팀원의 입장에서 접근성이 떨어져서인지 딱히 제 서버가 쓰이지 않고 그냥 각자가 알아서 패킷을 받아서 필요한 부분을 탐색했습니다. 그래서 아예 웹 상으로 대시보드를 만들면 어땠을까 하는 아쉬움이 있습니다. PPP같은 다른 팀들은 이 부분을 어떻게 했을지 궁금하네요.

- gameboooy

이 문제가 정확히 뭐하는 문제인지는 모르겠지만 처음에는 input module에 백도어가 있는 채로 공개가 되었고 해당 백도어는 내가 넣은 input에 대해 AES를 살짝 변형한 알고리즘의 결과가 특정 값이 되도록 만들어서 trigger시킬 수 있었습니다.

 

알고리즘이 엄청 복잡했던 것도 아니고 그냥 차분하게 역연산을 하면 됐는데 계속 결과가 이상하게 나왔고 어영부영하다가 주최측에서 input backdoor를 제거해서 그냥 그렇게 끝났습니다. 이정도는 당연히 구현을 해야하는 것이었는데 추하지만 변명을 조금 하자면 당시 카페에서 CTF를 하려고 노트북을 들고 나왔는데 뜬금없이 계속 블루스크린이 떠서 자료를 날리고 급하게 파이썬이랑 openssh를 설치해서 코딩을 하느라 멘탈도 조금 온전하지 못했고 시간도 많이 잡아먹었습니다. 이것만 아니었으면 당연히 완성했을거임.. ㅇㄱㄹㅇ

- sloootmachine

이건 정말 마음이 아픈 문제입니다. shift 3에 공개된 AES White box encryption 문제였습니다. 다른 팀의 실제 AES key를 입력받아 White box에 쓰이는 key를 만드는 generator와 White box용 key 파일 3개를 볼 수 있기 때문에 White box용 key 파일 3개로부터 원래 key를 복원하면 그게 바로 flag인 문제였습니다. 그리고 패치를 위해서는 generator와 White box용 key 파일을 가지고 encryption을 수행하는 cryptor를 제출하면 됐습니다.

 

Generator와 Cryptor는 이 repository를 토대로 만든 것으로 추정되는 상황이라 패치는 둘째치고 공격 자체는 BGE Attack을 수행하면 되고 그나마도 공격법을 이해한 후 코딩할 필요도 없이 대놓고 구현되어 있는 것을 조금만 바꾸면 됐습니다.

 

그런데 팀에서 이 문제가 AES White box encryption임을 shift 4가 되어서야 알았습니다. Generator 내에서 암호화 루틴(인줄 알았는데 사실은 AES key로부터 White box용 key를 만드는 루틴)을 들여다보면서 핸드레이를 시도하기도 했지만 당연히 굉장히 복잡했고 서버 스크립트 안에 cryptor라는 파일이 있지만 cryptor는 어디에서도 주어지지 않으니 애초에 문제에서 요구하는게 뭔지조차 전혀 이해하지 못했습니다. 저 repository를 팀원이 찾아낸 후에야 문제가 의미하는 바가 무엇인지, 어떻게 공격을 하는지를 이해할 수 있었습니다. ugonfor... awesome...

 

repository의 testing.cpp에서 임의로 생성한 키에 대해 AES key를 복원하는 예시가 있었기 때문에 적당히 수정만 하면 될줄 알았는데 과정이 쉽지 않았습니다. 우선 환경 세팅 자체가 꽤 오랜 시간을 필요로 했고 White box용 key가 boost로 serialize된 파일이었는데 이 문제에서 제공되는 key와 원래 코드에서 나오는 key의 구조가 달랐습니다. 이렇게 삽질을 하다 보니 어는새 이미 문제가 되기 직전인 상황이라 결국 공격에 실패했습니다. 지금 생각해보니 구조가 뭔가 이상하다는걸 알았을 때 generator를 빠르게 분석했어야 하는데 계속 repository의 코드만 보면서 구조를 끼워맞추려고 하고 있었네요ㅠㅠ 리버싱 능력이 부족하니 분석의 많은 부분을 팀원에게 의존하게 됩니다. 정말 풀고 싶었는데 아쉬움이 많이 남는 문제입니다.

 

 

아쉽게도 작년과 같이 올해도 본선에서 유의미한 기여를 하지 못했습니다. 그나마 작년보다 나았던 점이라고 한다면 작년에는 아예 암호학이 필요한 문제가 없어서 시도를 할 문제조차 거의 없었지만 올해는 최소 시도를 할 수 있는 문제는 일부 있었습니다. 풀어냈으면 정말 좋았을텐데 아쉽네요.

 

코포든 ICPC든 CTF든 나는 감도 못잡고 있는데 남들이 잘 풀어내는걸 보면 나도 정말 잘하고 싶다는 생각이 강하게 듭니다. 사실 PS 분야의 경우에는 내가 절대 풀지 못하지만 남은 풀 수 있는 문제가 아주 널려있음을 이미 매우 잘 알고 있지만 암호 분야의 경우에는 (충분한 시간만 주어진다면) 아직 누군가 풀어낸 문제는 나도 풀 수 있다는 강한 믿음을 가지고 있습니다. 쓰다보니 저도 이게 무슨 소리인지 모르겠는데 아무튼 앞으로 더 열심히 해야겠습니다.

 

그리고 늘 그렇지만 팀으로 대회에 나가고 다같이 으쌰으쌰하는게 정말 재밌었습니다. 저희 팀을 포함해서 긴 시간 고생하신 모든 참가자 분들 고생 많으셨습니다!!

'대회 > 각종 대회 후기' 카테고리의 다른 글

Quora Programming Challenge 2022 후기  (10) 2022.02.06
Hackceler8 후기  (4) 2021.11.08
DEF CON CTF 2021 후기  (2) 2021.08.10
2019 ACM-ICPC Da Nang Regional 후기  (0) 2020.01.26
2019 ACM-ICPC Seoul Regional 후기  (4) 2019.11.14
DEF CON CTF 2019 후기  (2) 2019.10.14
  Comments