DongDD's IT

[2017 SECCON CTF Quals] Write-up & 후기 본문

CTF/Write-up

[2017 SECCON CTF Quals] Write-up & 후기

DongDD 2017. 12. 10. 17:03

[2017 SECCON CTF Quals] Write-up & 후기


1. Run Me!


Point : 100 point

Category : Programming


Problem :

Run me!

-----  RunMe.py

import sys

sys.setrecursionlimit(99999)

def f(n):

    return n if n < 2 else f(n-2) + f(n-1)

print "SECCON{" + str(f(11011))[:32] + "}"

-----



이 문제는 단순히 프로그래밍을 하는 문제였다. 피보나치 수열(11011)값을 구하기만 하면 되는 문제였다. 코드를 그대로 붙여 실행시켰더니 재귀호출이라 그런지 시간이 엄청 오래걸렸다. 그래서 재귀가 아닌 값을 저장해서 피보나치를 구하는 방법으로 구현했다.

Python으로 코딩을 해본 경험이 많지 않아 처음에는 C++로 값을 구해 피보나치(11011)값을 구한 후 해결하려 했으나 값이 너무 커서 C++로 구현하기 어려웠다. 그래서 그냥 python으로 구현했고 flag를 얻을 수 있었다.


Answer & Flag


1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sys
 
sys.setrecursionlimit(99999);
= 1
= 1
chk = 0
for i in range(3,11012);
    if chk == 0:
        a = a+b
        chk = 1
    else:
        b = a+b
        chk = 0
print "SECCON{" + str(a)[:32+ "}"
cs


Flag : SECCON{65076140832331717667772761541872}


2. SHA1 is dead


Point : 100 point

Category : Crypto


Problem :

SHA-1 is dead

http://sha1.pwn.seccon.jp/

Upload two files satisfy following conditions:


1. file1 != file2

2. SHA1(file1) == SHA1(file2)

3. SHA256(file1) <> SHA256(file2)

4. 2017KiB < sizeof(file1) < 2018KiB

5. 2017KiB < sizeof(file2) < 2018KiB

* 1KiB = 1024 bytes



조건을 만족시키는 두 개의 파일을 업로드해서 조건을 만족한다면 flag를 얻을 수 있는 문제였다.


해당 링크로 들어가니 다음과 같은 형태로 되어있었다. 암호학에 대해 잘 몰라 어려움이 많았던 것 같다.

값이 달라도 SHA-1이 같게 나오는 문자열은 접해보았지만 파일로 이것을 해결하는 문제는 처음 접해보았다.

SHA-1에 대한 문제점을 찾기 위해 검색을 했는데 구글에서 발표한 자료를 보고 문제를 해결할 수 있었다.

두 개의 다른 파일인 pdf파일이 SHA-1값이 같게 나오는 발표자료였다. 이 자료를 이용해 문제를 해결하기로 했다.




구글에서 발표했던 두 개의 pdf파일을 이용해 다른 파일이지만 SHA-1값이 다르게 나오는 것을 확인했다. 일단 첫 번째 조건인 file1 != file2 조건과 두 번째 조건 SHA1(file1) == SHA1(file2)과 세 번째 조건 SHA256(file1) != SHA256(file2)는 만족시킬 수 있었다. 다음으로는 size를 변경해도 그 값이 변경되는지 확인하는 과정을 거쳤다.

두 pdf의 끝 부분에 data를 추가해도 위 3조건이 변경되지 않는 것을 알았다.


두 pdf파일의 size는 422435(413k) bytes 였다. 조건을 만족시키기 위해 fallocate를 이용해 2018k-413k쯤의 size를 갖는 file을 생성해주었다. 그 후에 pdf file에 나머지 size를 채우는 file을 덧붙혀서 해당 size를 만족하게 만들었다.

두 pdf파일을 조건에 모두 만족시킨 후 업로드 하니 flag를 얻을 수 있었다.



Answer & Flag


Flag : SECCON{SHA-1_1995_2017?}



3. Log Search


Point : 100 point

Category : Web


Problem :

Log search

Search the flag on Elasticsearch.

http://logsearch.pwn.seccon.jp/



Log search라는 이름을 가진 문제였다. 문제만 보고는 어떤 문제인지 감이 잡히지 않았다.



문제에 들어가니 Find The Flag라는 message가 띄워져있었고 밑에 부분에 Log search라는 link가 있었다.

일다 이 link로 들어가보았다.



링크에 들어가니 다음과 같은 화면을 볼 수 있었다. Search라는 부분과 Result라는 결과 부분이 있었다. 아마 Search는 POST방식으로 전송하는 것을 쉽게 해주려고 만들어 놓은 것 같았다. 아무거나 검색해보았는데 그냥 다른 사람들, 내가 검색한 것들에 대한 Log가 밑에 나왔다.

문제를 해결할 방법을 찾는 데 꽤나 어려웠다.



일단 flag라는 단어로 검색해보니 여러 결과가 나왔다. 그 중에서 응답코드가 200번인 것을 찾아 그 URL로 들어가니 flag를 얻을 수 있었다.

뭔가 이 문제는 이 방법으로 푸는게 맞나 싶을 정도로 이상하게 풀렸다. 다른 방법이 있는 것 같은데 다른 사람이 해결한 LOG를 보고 문제를 통과한 것 같다.

이게 대회측에서 LOG를 꾸준히 보여주게 하는 건지 아니면 다른 방법으로 사람들이 푸는 건지 잘 이해가 가지 않았다.


Answer & Flag



Flag : SECCON{N0SQL_1njection_for_Elasticsearch!}



4JPEG file


Point : 100 point

Category : Binary


Problem :

JPEG file

Read this JPEG is broken.

It will be fixed if you change somewhere by 1 bit.

tktk-892009a0993d079214efa167cda2e7afc85e6b9cb38588cba9dab23eb6eb3d46



JPEG file이라는 문제였다. JPEG 파일을 읽을 수 없게 되었는 1 bit만 수정하면 고칠 수 있다고 되어있었다.

file이 하나 주어져 있었다. 이것을 다운받아 확장자를 변경해 실행시켜보았다.



다음과 같은 그림이 출력되었다. 아마 특정 bit를 수정해야 답을 보여주는 것 같았다. Hex editor를 통해 이 파일을 분석해보았지만 큰 사이즈의 파일이였기 때문에 어떤 bit를 수정해야되는지 모르겠었다.

그래서 검색을 하다보니 문제가 생긴 JPEG 파일을 고쳐주는 사이트를 찾았다.


Link : http://www.jpeg-repair.org/vg-jpeg-repair/


위의 사이트를 활용해 파일을 업로드해보니 손상된 JPEG파일을 어느 정도 복구해줘서 flag를 얻을 수 있었다.


Answer & Flag


Flag : SECCON{jp3g_study}


5. Putchar music

Point : 100 point

Category : Programming


Problem :

putchar music
This one line of C program works on Linux Desktop. What is this movie's title? 
Please answer the flag as SECCON{MOVIES_TITLE}, replace all alphabets with capital letters, and spaces with underscores.

main(t,i,j){unsigned char p[]="###<f_YM\204g_YM\204g_Y_H #<f_YM\204g_YM\204g_Y_H #+-?[WKAMYJ/7 #+-?[WKgH #+-?[WKAMYJ/7hk\206\203tk\\YJAfkkk";for(i=0;t=1;i=(i+1)%(sizeof(p)-1)){double x=pow(1.05946309435931,p[i]/6+13);for(j=1+p[i]%6;t++%(8192/j);)putchar(t>>5|(int)(t*x));}}


putchar music이라는 이름을 가진 Programming 문제였다. 한줄로된 C program을 동작시켜 영화의 제목을 알 수 있는지 물어보는 문제였다.


이 문제는 대회에서 가장 많은 시간을 투자했던 것 같다.

Programming이라고 되어있어 단순히 소스 코드를 복사해 실행해보았지만 이상한 문자만 출력되고 program이 종료되지 않았다. 그래서 그 문자열에서 flag를 찾는 문제인줄 알고 시간을 많이 소모했다. 아무리 찾아도 flag라고 생각되는 것은 보이지않았다.


오랜 시간을 투자하다가 한줄로 된 C code로 음악을 재생할 수 있다는 것을 알게 되었다. 그래서 혹시 이 문제가 음악을 재생해서 영화 제목을 맞추는 문제인가 싶어서 소스코드로 음악을 재생하는 방법을 찾았고 시도해보았다.



pacat이라는 프로그램을 통해 파일을 재생할 수 있었다. 소스 코드를 복사하고 compile한 후 해당 파일을 pacat으로 실행해보았다. 처음에는 무슨 이상한 소리가 들렸다. rate를 올리면서 들어보니 무슨 노래같은 것이 들리기 시작했다.

평소에 영화를 많이 안보던 사람이라 그런지 노래를 들어도 무슨 영화인지 도저히 파악할 수 없었다. 그래서 노래를 찾아주는 사이트를 이용해 영화제목을 알 수 있었다.


Link : midomi.com



pacat으로 재생해 나오는 소리를 해당 사이트에서 녹음해보니 Star Wars main title 노래가 검색되었다.

이 영화를 flag로 입력하니 통과할 수 있었다.



Answer & Flag


Flag : SECCON{STAR_WARS}








후기



CTF에 참여하기 시작한지 얼마되지 않았는데 여태까지 참여했던 CTF중에 가장 많은 문제를 풀었다.

처음 보는 유형도 많았고 많은 사실을 새로 알아가는 것 같았다.

600점을 획득에 369/1028이라는 성적을 거둘 수 있었다. 팀을 찾는다는 의미로 FindTeam이라는 팀이름으로 출전하고 있는데 아직 실력이 많이 모자란 것 같다. 좀 더 실력을 키워 앞으로 열리는 많은 CTF에 출전해 좋은 성적을 거두고 싶다.

putchar music이라는 문제는 정말 신기하고 흥미로웠던 문제인 것 같다. C code로 음악을 재생할 수 있다는 것을 처음 알게되어 풀고나서 정말 재미를 느꼈다. 앞으로도 재밌고 신기한 문제들을 많이 만날 수 있었으면 좋겠다.

Comments