WireShark로 문제 파일을 확인해보면, HTTP 프로토콜에서 html을 확인해볼 수 있다. ECOPS.png와 EVISION.png 두 개의 파일이 보인다.
Export object로 두 개의 png 파일을 추출해보았다.
흠... 열어봤지만 그냥 이미지이다. 두 파일을 HxD로 열어보니
푸터 시그니처 뒤에 숫자가 더 있다. 의미있을 것 같아 복사하여 사이버셰프에 입력해봤더니
flag가 나왔다!
flag: EWHA{Isn't_It_A_Short_Shaaaark?}
x64dbg로 열어준다. 문자열참조를 해보니
정답을 입력했을 때 You solve a problem을 출력하는 것 같다.
bp 걸어둔 두 함수가 각각 id 확인하는 함수, pw 확인하는 함수이다. id는 ewhactf이다.
login 함수 내부이다. 실행하며 분석한 결과는
위에서 덤프에 특정 값들, 그리고 ewha를 저장한다. 그리고 입력값과 ewha를 XOR 연산한 값이 dump에 저장된 값과 같으면 된다. (말로 설명하는 건 왜케 어려운 거지)
아무튼 코드를 작성해본다.
public class rev {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] dump= {28, 24,29,62,2,24,28,62,4,40,3,4,28,40,11,14,11,16,26,0,17,2,4,
0,17,30,7,15,68};
String result = "";
int[] ewha= {'e','w','h','a'};
for(int i=0;i<dump.length;i++) {
for(int j=0;j<128;j++) {
if((j^v[i%4])==dump[i]) {
System.out.print((char)j);
}
}
}
}
}
16진수 값으로 저장되어 있는 값들을 10진수로 변환하여 dump 배열에 저장해주고, ewha에 'ewha'를 저장해준다. 아스키코드값이 128개이니 0부터 127까지 반복하며 아까 확인한 조건에 맞는 아스키코드값을 찾아주면 된다.
flag를 찾았다~!
flag: you_got_a_key_congratulation!
파이썬 코드가 주어진다.
elif cmp[0]=='E':
dest=int(cmp[1])
src=int(cmp[2])
if register[dest]!=flag[src]:
cnt=47
이 부분을 중요하게 봐야한다. E를 만났을 때, register[dest]==flag[src]여야 Wrong!을 출력하지 않고 똑바로 잘 넘어간다. file을 나눠서 보자.
'D.0.116', 'E.0.0',
'D.0.104', 'E.0.1',
'D.0.155', 'D.1.50', 'B.0.1','E.0.2',
'D.0.5', 'D.1.23', 'C.0.1', 'E.0.3',
'D.0.72', 'A.0.1','E.0.4',
'D.1.105', 'E.1.5',
'D.0.10', 'A.0.1', 'E.0.6',
'D.1.95','E.1.7',
'D.0.11', 'D.1.11', 'C.0.1', 'E.0.8',
'D.1.10', 'B.0.1','E.0.9',
'D.1.117', 'E.1.10',
'D.2.3', 'B.1.2', 'E.1.11',
'D.1.113','D.2.18', 'B.1.2', 'E.1.12',
'D.2.107', 'E.2.13',
'D.1.208', 'B.1.2',E.1.14',
'D.2.20', 'A.1.2', 'E.1.15',
"F.Correct!", "F.Wrong!"
E를 기준으로 나누었다. flag는 16자리라는 것을 유추할 수 있다. 한 줄씩 분석해보겠다.
1) 'D.0.116', 'E.0.0',
register[0]=116.
register[0]==flag[0]이어야 하므로 flag[0]==116, 즉 't'
2) 'D.0.104', 'E.0.1',
register[0]=104.
flag[1]==104, 즉 'h'
3) 'D.0.155', 'D.1.50', 'B.0.1','E.0.2',
register[0]=115, register[1]=50, register[0]-=register[1]. 즉 register[0]==105
flag[2]==105, 즉 'i'
4) 'D.0.5', 'D.1.23', 'C.0.1', 'E.0.3',
register[0]=5, register[1]=23, register[0]*=register[1]. 즉 register[0]==115
flag[3]==115, 즉 's'
5) 'D.0.72', 'A.0.1','E.0.4',
register[0]=72, register[0]+=register[1]. 즉 register[0]==95
flag[4]==95, 즉 '_'
6) 'D.1.105', 'E.1.5',
register[1]=105.
flag[5]==105, 즉 'i'
7) 'D.0.10', 'A.0.1', 'E.0.6',
register[0]=10, register[0]+=register[1]. 즉 register[0]==115
flag[6]==115, 즉 's'
8) 'D.1.95','E.1.7',
register[1]=95
flag[7]==95, 즉 '_'
9) 'D.0.11', 'D.1.11', 'C.0.1', 'E.0.8',
register[0]=11, register[1]=11, register[0]*=register[1]. 즉 register[0]==121
flag[8]==121, 즉 'y'
10) 'D.1.10', 'B.0.1','E.0.9',
register[1]=10, register[0]-=register[1]. 즉 register[0]==111
flag[9]==111, 즉 'o'
11) 'D.1.117', 'E.1.10',
register[1]=117
flag[10]==117, 즉 'u'
12) 'D.2.3', 'B.1.2', 'E.1.11',
register[2]=3, register[1]-=register[2]. 즉 register[1]==114
flag[11]==114, 즉 'r'
13) 'D.1.113','D.2.18', 'B.1.2', 'E.1.12',
register[1]=113, register[2]=18, register[1]-=register[2]. 즉 register[1]==95
flag[12]==95, 즉 '_'
14) 'D.2.107', 'E.2.13',
register[2]=107
flag[13]==107, 즉 'k'
15) 'D.1.208', 'B.1.2',E.1.14',
register[1]=208, register[1]-=register[2]. 즉 register[1]==101
flag[14]==101, 즉 'e'
16) 'D.2.20', 'A.1.2', 'E.1.15',
register[2]=20, register[1]+=register[2]. 즉 register[1]==121
flag[15]==121, 즉 'y'
...아악 노가다. 아무튼 조합해보면 this_is_your_key!
flag: EWHA{this_is_your_key}
커멘트인젝션 문제이다.
흠... 드림핵에서 비슷한 문제를 풀어봤던 것 같다. 일단 코드 확인해주면
입력을 그대로 cmd에 입력한다. ;로 닫고 커멘드 명령어 그냥 입력하면 될 것 같다.
뭘 cat 해야하나 싶어서 txt 입력했었는데 오류났다... py 입력해주니
flag를 출력해준다!
flag: ewha{where_change_begin}
(음... 이건가?)
제일 많이 푼 게 디지털포렌식 문제였다! 재밌당
EWHA{I_l1ke_cl@ss1c@l_mus1c_but_@ctu@lly_}... 클래식 좋아하는데 사실은? 다른 거 좋아하나보다. txt 파일에 RIFF가 왠지 익숙한 시그니처여서 HxD에 txt 파일을 그대로 붙여넣었다.
앞에 쓸데없는 글자들 지워주고 wav 파일로 만들어주었다. 실행해보니 음악이 나오다가 중간에 노이즈가 들린다. 이거...... 저번 ctf에서 잘못 시도했던 문제다~!! 오디오 스테가노 그래피! 신나게 audacity에 넣어보자.
중간에 저기 수상하다 수상해
스펙트로그램 해보면 flag가 보인다.
flag: ewha{I_l0v3_r0ck_n_r0ll}
모스부호 문제인가보다.
파일은 모스모스모스모스... HxD로 열어보자.
PNG 파일의 푸터 시그니처는 IEND이다. 찾아보면
푸터 시그니처 뒤에 RIFF가 숨어있다. 추출해서 wav 파일을 만들어주니
삐삐삐 한다. 오디오 모스부호 해독기에 넣고 돌려보자.
flag가 나왔다!
flag: ewha{wa5ite4syt0findmorsecod3}
파일 전송 프로토콜을 잘 보라고 했으니까 FTP를 잘 쳐다보자.
음... 일단 TCP Stream 먼저 해보았다. STOR은 FTP 명령어인데, 파일송신 명령어라고 한다. 수상!!!!!!
FTP-DATA 프로토콜을 발견했다. PNG가 보인다... 추출해야겠다.
모지. 일단 해본다.
확장자가 없는 파일이 저장되었다. 아까 PNG hex 코드를 확인했으니 HxD에 넣어서 확인해보자.
이번엔 푸터 시그니처 뒤에 PK가 있다. zip파일 시그니처이다. 수상하지만 일단 PNG 파일 먼저 확인해보자.
오잉? 숨겨놓은 파일이 docx 파일이라는 뜻인가보다. 이제 수상했던 zip 파일을 따로 저장해보면
flag가 docx 파일로 저장되어있다! 냅다 열어보자
flag 등장~!
flag: ewha{4n6_data_1ea4age_1004}
파일을 확인해보면 아래가 잘려있다. HxD로 확인해보자.
오잉. 푸터 시그니처가 두 개이다. 다른 문제는 없어보이니, 첫 번째 푸터 시그니처부터 두 번째 푸터 시그니처 사이에 잘린 이미지 내용이 있는 것 같다. 첫 번째 푸터 시그니처를 지워보자.
오! 깨진 이미지를 복구했다. 하지만 flag는 없어보이고... 파일 크기를 변경한 것 같지도 않다. 다시 HxD를 보니
또 PK이다! flag.txt도 있는 걸 보니 확실히 뭔가 있따. 따로 저장해보자.
flag 파일이 하나 있다.
흠 그런데 이상하다. 아무것도 보이지 않는데...
공백 문자가 잔뜩이다. 처음엔 탭과 스페이스가 섞여있길래, 탭을 -로 스페이스를 .으로 하는 모스부호인가 했는데... 아니었다. 구글링 하다보니 whitespace라는 프로그래밍 방식이라는 걸 깨달았다!
(뭐이런프로그래밍이다있나)
온라인 컴파일러를 찾아 입력해보았다.
문장이 나오긴 나왔는데... 이게 flag가 아니었다..... }가 뒤에만 있는 걸 보니 flag를 더 찾아서 합쳐야 하는 것 같은데, zip 파일도 더 없고 찾은 zip 파일 개수가 수정된 것도 아니었고... 이미지 자체에 숨어있는 것 같아서 이미지 스테가노그래피로 접근해보니!!
찾았다~! flag다!!
flag: ewha{4nd_a_h4ppy_n3w_y34r!}
사실 해결한 문제는 여기까지가 다고... 도전하다가 실패한 것도 일단 적어둔다.
신기한 문제라서 도전~!
이것저것 입력해보는데 틀리면 Wrong password!라고 뜨고 넘어가지도 않는다. 구글링해보니 개발자도구에서 뭔가 얻을 수 있는 것 같았다. F12 열어서 둘러보니
ewha를 검색했는데 pw를 찾았다. ㅎㅋ
넘어왔다! 이미지에서... 뭘 찾아야할까.
이미지 주소가 인코딩된 건가... 해서 보니까 그것도 아니구. 저장해서 HxD로 열었더니
헉... 푸터 시그니처가 두 개다.
이미지가 두 개였던 건가?! 바로 저장해보겠다!
엥.
...엥.
......엥
못 풀었다. 헤헤