SCTF 2017 본선 후기

삼성에서 처음 CTF를 열었습니다. 맨 처음에 공고를 봤을 때 삼성에서 CTF를 여는 날이 올 것이라고는 전혀 생각하지 못했는데 굉장히 신기했습니다. 또 보통 일반인을 대상으로 여는 큰 CTF 대회들은 거의 다 팀전이라 딱히 해킹팀에 속해있지 않은 저로서는 나가기가 사실상 불가능한데 이 대회는 개인전이었습니다. 그 덕분에 조금 더 편하게 참가할 수 있었습니다.


본선에 80명이 참가하는 대회인만큼 Capture The Flag 방식으로 서로 주어진 서비스를 공격/방어를 하는 것은 아니었고 주어진 문제를 해결해서 Flag를 얻어내는 방식이었습니다.


예선 때는 해킹 문제를 하나도 안 풀고 코딩 카테고리의 Turing Competition만 맞춰서 본선에 진출했습니다. 본선에서 코딩/암호학 문제를 잘 풀어서 턱걸이로 장려상이라도 받았으면 좋겠다고 생각하고 SCPC를 치러 갔던 R&D 캠퍼스로 또 갔습니다.


대회는 일요일 오전 10시 반부터 월요일 오전 10시까지 23.5시간 동안 진행되었고(원래는 24시간이었는데 네트워크 문제로 시작 시간이 조금 지연되었습니다.) 코딩 2문제, 암호학 2문제, 공격 5문제, 방어 3문제, 리버싱 3문제가 있었습니다. 문제의 점수는 기본적으로 1000점이고 푼 사람이 많으면 배점이 실시간으로 줄어드는 방식이었습니다. 점수대로 끊어서 상위 23명에게 상을 주는 줄 알았는데, 그게 아니라 점수로 18명을 선정하고 각 분야의 1위(총 5명)에게 따로 특별상을 준다는 것을 오리엔테이션때 알게 되었습니다. 어차피 공격/방어/리버싱은 저보다 잘하는 사람이 엄청 많을테니 코딩/암호학에서 특별상을 노려봐야겠다고 생각이 들어서 바로 코딩 문제부터 확인했습니다.


첫 번째 문제는 그냥 알고리즘 문제였는데, 코드 자체는 검색을 통해 금방 찾았지만 맨 처음에 대략 3000바이트를 넘어가는 코드가 정상적으로 제출이 되지 않는 버그가 있었고 문제 설명 상의 출력 형식이 조금 헷갈리게 되어있는 데다가 제출에 실패하면 10분 후에 제출해야 했기 때문에 시간을 굉장히 많이 빼앗겼습니다. 결국 첫 번째 문제도 해결하지 못한 상황에서 코딩 카테고리의 두 문제가 다 풀려서 특별상이 물건너가자 코딩 문제를 잠시 접어두고 바로 암호학으로 넘어갔습니다.


암호학의 2문제는 IEM(CPA 환경에서의 블록 암호 공격), GluedWindow(RSA에서의 오류 주입 공격)이었습니다. 첫 번째 문제 IEM은 i) 랜덤의 시드가 고정되어있는 점 ii) 코드의 Permutation, XOR 연산이 inverse가 자기 자신이라는 성질을 우선 찾아내야합니다. 그 이후에는 Slide attack을 생각하면 되는데, C0 = E(P0), C1 = E(P1)인 쌍에 대해 P0 ^ C1 = P1 ^ C0이면 그 값이 K0일 확률이 높다는 식을 이끌어낼 수 있었고 비슷하게 F(P0) ^ F(C1) = F(P1) ^ F(C0)이면 그 값이 K1일 확률이 높다는 식 또한 이끌어낼 수 있습니다.


대략 20000개의 평문-암호문 쌍을 수집하니 K0, K1을 구할 수 있었습니다. 다만 파이썬에서 버전에 따라 동일한 시드임에도 불구하고 랜덤 값이 다를 수 있다는 사실 때문에 조금 헤맸습니다. 3.6 버전과 2.7 버전은 다를 수 있다는걸 알았는데 2.7.10 버전과 2.7.12 버전끼리도 랜덤 값이 다르다고는 생각하지 못했습니다. IEM 문제를 오후 8시쯤에 처음으로 풀어내어 퍼스트 블러드를 확보했습니다. 대회 시작 9시간 반 만이었네요.



^o^


 이후에 mathboy7님, qwaz님, nomeaning님 이렇게 3명이 더 푸셔서 IEM은 총 4명이 풀었습니다. 특히 nomeaning님은 대회 종료 42분 전에 IEM을 풀어서 2위에서 1위로 올라섰습니다. 정말 기분 좋으셨을 것 같아요.


그 이후에는 바로 다음 암호문제에 집중했습니다. 이 문제만 풀어내면 특별상(=500만원)이 보장되기 때문에 반드시 풀어야겠다고 생각했습니다. GluedWindow 문제는 예선에 나왔던 BrokenWindow와 비슷한데 주어진 정보가 더 적은 문제였습니다. 비밀키의 앞 119바이트는 알아내는데 성공했지만 뒤의 9바이트를 도저히 알아낼 방법을 모르겠어서 긴 시간동안 고통받았습니다. 결국 대회 종료 3시간 전부터는 포기한채 그냥 아무도 GluedWindow를 못풀기만을 바라면서 끝나기를 기다렸습니다. 대회에서 1등을 하신 nomeaning님이 유일하게 GluedWindow를 풀긴 했지만 특별상과 1/2등상을 중복해서 받지는 않도록 되어있었기 때문에 최종적으로 암호학 분야에서 살짝 어부지리로 특별상을 수상할 수 있었습니다. 끝나고나서 풀이를 들어보니 Coppersmith attack을 이용하는 문제였습니다. 찾아보다가 저 공격을 접하기는 했는데 제대로 이해를 하지 못해서 못 풀어낸게 아쉽네요.


다른 CTF와 비교해보았을 때 Jeopardy-style임에도 불구하고 주어진 코드의 취약점을 패치하는 방어 카테고리의 문제가 있었다는 것이 큰 특징이자 장점이라고 생각합니다. 출제진도 카이스트 GoN이었기 때문에 충분히 문제의 신뢰성이 있었고 상금도 꽤 컸고 참가자의 편의를 많이 생각해주었고 대회 진행도 매끄러운 편이었습니다.


그렇지만 조건이 자세하지 않거나, 설명이 모호해서 읽었을 때 의미가 잘 와닿지 않는다거나 하는 문제가 소량 있었고 실시간으로 참가자의 의견을 반영해서 수정이 됐긴 했지만 그럼에도 불구하고 문제 검수를 조금만 더 꼼꼼하게 하면 괜찮지 않았을까 하는 아쉬움이 있습니다. 그리고 본선에 나왔던 코딩 문제 2개는 해킹과의 연관성이 없는 문제가 아닌가 하는 생각이 들었습니다. 차라리 적당한 난이도의 포렌식과 묶어서 따로 시상을 하지는 않는 MISC 카테고리를 만들거나 아니면 예선의 CAPTCHA 문제와 같이 해킹과 연관이 있는 코딩 문제가 출제되면 좋았을 것 같습니다.


그리고 개인전에서 대회시간 24시간은 너무 긴 것 같습니다. 저 같은 경우도 한 새벽 2시까지는 의욕적으로 했지만 새벽 5, 6시가 되면서부터는 잠도 쏟아지고 머리도 안돌아가 거의 한게 없었고 끝나기 3시간 전부터는 아예 손을 뗐습니다. 저 뿐만 아니라 다른 분들도 마지막 두 시간 정도는 굉장히 힘들어보였습니다. 아마 단체전이면 다른 사람이 못푼 것에 대해 같이 고민을 해보고, 내가 막힌 부분의 실마리를 도움받을수도 있어서 계속 자극이 들어오지만 개인전은 어느 정도 쉬운 문제들을 다 풀고난다면 다른 문제들에서는 진행이 잘 안될 때 막막함이 이루 말할 수가 없을 정도라 더 그런 것 같습니다. 오후에 시작해서 다음날 오전까지 15~18시간 정도로 하면 조금 더 괜찮지 않을까 싶습니다.


첫 대회임을 감안했을 때 잘 진행된 대회였다고 생각합니다. 내년에는 공부를 더 해서 참가해야겠습니다!

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

카카오 코드 페스티벌 2018 본선 후기  (2) 2018.08.25
SCPC 2018 본선 후기  (2) 2018.08.01
UCPC 2018 후기  (0) 2018.07.29
Codegate 2018 예선 후기 + 간략한 풀이  (0) 2018.02.06
2017 삼성 육목대회 결선 후기  (7) 2018.01.16
SCPC 2017 본선 후기  (0) 2018.01.16
  Comments