2014 순천향대학교 정보보호 페스티벌 예선 풀이 이름 : 이시훈 학교 : 선린인터넷고등학교 아이디 : push0ebp 닉네임 : 치트엔진차냥 자기 점수: 2000 등수 : 1위
내 생애 첫대회다. (Write up이 좀 서툴으니 양해부탁드립니다 ) 시작과동시에 심장이 벌렁벌렁 뛰었다. ㅠ 로그인하고 Challenge를 눌렀는데 이런 문제가 나왔다. (페이지 진짜 멋있었습니다.) 입장 문제 이제 막 해킹을 배우기 시작한 대한민국의 초짜 해커 유 모군(22 세)은 최근 한 온라인 커뮤니티 게시판에서 우연히 취약점을 발견하였다. 첫 해킹에 들뜬 유 모군은 해당 취약점을 이용하여 서버에 관리자 권한으로 접속을 하였지만, 별다른 공격 없이 살짝 구경만하고 접속을 종료하였다.
대회 참가자들에게 꼭 필요한 문제같은 문제가 나왔다. 어쩌다가 충분히 이럴수 있는 상황이 법률 위반이라는걸 알려주려는 의도가 매우 좋았다. 풀이 먼저 네이버에 정보통신망 이용 촉진 및 정보보호 등에 관한 법률 을 검색했다. 이런 법령이 나왔고 조항을 찾아야되는데 학교 수업시간에 정보윤리를 배웠던터라 키워드가 생각나 침입 을 검색했다. Key : 48_30000000
WEB 100 어리버리 심슨 회사를 운영 중인 사장 호머 심슨, 평소에 게을러 홈페이지 개발을 대충하게 된다. 특정 IP(192.168.0.22)에서만 접속 가능하게 한 관리 페이지에 사업 비밀이 숨어있다던데.. 비밀을 파헤쳐라!!?page=를 보고 LFI RFI인줄 알고 계속 넣으려고 삽질했다. No Hack. 뭘 넣어도 되지가 않았다. 멘붕이 왔다. 생각을 하던참에 특정 IP 192.168.0.22에서만 접속이 가능하게 해뒀다는 걸보고?page=대신 ip에 관련된 변수들 $_SERVER['REMOTE_ADDR'] $ip 등등?192.168.0.22를 막 넣어보니 키가 나왔다. Key : root_5imps0ns
CRYPTO 100 마법진 너는 보일듯 보이지 않아... 안타까운 마음에 쳐다만 봤네... 풀이 뭐지 이게.. 대체 어쩌란거지... 하면서 봤다. 표로 준 이유가 있을거라고 생각했지만 하도 안나오길래 포기하고 다른문제를 풀고있었는데 마침 힌트가 나왔다. 가로==세로==대각선을 검색해보니 마방진이 보였다. 제목도 검색해보니 마방진을 마법진이라고도 불린다는걸 보고 확신했다. 네이버에 쳐보니 마방진 암호에 관한 내용이 있었다. 그대로 5*5마방진을 검색했는데 여러 마방진이 나왔다. 대응시켜보니 이상한 키가 나왔는데 SYSTEM100의 키가 Key_is_로 시작한걸 보고 적절한 마방진을 찾았다. key_is_bwfnmwnfc3f1nhjl== 가나왔다. ==이 있길래 base64 Decode를 해보았다. Key : mag1c_squ4re
SYSTEM 100 GDB IS MY LIFE 암호문을 풀어주는 툴이 고장나서 출력을 안해주네... 직접 툴을 분석하여 평문을 얻어내자! 풀이 제목만 보고 다짜고짜 gdb로 열었는데 안된다.. 트레이스를 써볼까했는데 그래서 다 써봤다. Ltrace쓰니 바로 보였다. ㅠㅠ key_is_라길래 빼고 인증했는데 안되서 뭐지 하다가 포기할뻔했는데 key_is_까지 넣으니까 됬다 ㅠ Key : key_is_5ch10v3
MISC 100 YISF의 궁궐에 당도한것을 환영하오 낯선이여 역사상 하늘의 뜻을 따랐던 해커는 모두 몇명인가? 풀이 이 문제가 제일 어려웠다 ㅠㅠ 처음에 역사, 하늘, 해커 키워드를 검색해보았는데 <하늘이여 땅이여2> 라는 해커들이 나오는 소설을 찾았다. 그래서 3을 인증해보니 되지않았다. 그런데 힌트가 나와서 순천향대 수상자들을 보았다. 수상자들을 다 더했더니 >>> 6+8+6+3+3+3+3+3+3+8+8 54 인증했더니 안됬다 ㅠㅠ 자꾸 뭘 빼보고 더해고도 했는데 안됬다. 그런데 와 연속으로 수상을하네 하면서 감탄을 하다가 중복을 빼면 될래나? 해서 빼보았다. 하동주 이광우 유용우 구자연 문영조 최현우 김우현 이광우 신정훈 하동주 김진우 김형준 류용우 전지원 박찬암 이광형 김진우 김영곤 신정훈 정태영 이병윤 박찬암 방승원... 생략 코딩을 하려했지만 이렇게 다적어서 Ctrl+F로 검색해보면서 중복을 빼왔다. 하동주2 이광우2 신정훈2 김진우2 박찬암3 임동욱2 이정훈2 권혁2 강인욱2 권혁주2 임정원2 이선엽2 이분들이 중복됬다. >>> 1+1+1+1+2+1+1+1+1+1+1+1 13 54-13=41 을 넣어봤지만 안됬다 잘못 뺐나하고 다시찾아도 똑같았다. 대회 때와 라이트업을 쓸 때 결과가 좀 다르게 나와서 당황했다. 근데 임동욱 이분들이 동명이인인걸 까먹었다 ㅠㅠ 그래서 12로 놓고 빼서 42를 인증했다. Key : 42
FORENSIC 100 다 남아있어... 대회 도중 카톡으로 연락을 하고 있던 친구에게 답 공유를한 PSY. 킷값이 써있는 이미지를 캡쳐해 보내놓고 아무 일 없었던 듯 대회를 계속하는데... 넌 딱 걸렸어...!! 풀이 F100 파일을 헥스 에디터로 열었다 저게 헤더는 아닌것같아 ADSEGMENTEDFILE를 검색해봤다. AD헤더만 남겨두고 앞에 지워서.ad1 저장한후 FTK Imager로 파일을 추출했다. 카톡 이미지이므로 당연히 임시 파일에 저장될 것 같아 Temp폴더 부터 봤다. \AppData\Local\Temp 이곳이고 사진들을 찾아보니 이런 사진이 있었다. ㅠㅠ 너무 착하시다. 헥스에디터로 열어보니 EOF에 이런게.. http://210.124.110.197/f4999069631245bcfd6cca26a1731623/67c52bb0163f224092274fe479c59808.php 로 가보면 Key : DAP_0_U_N@N0!!
BINARY 100 세's코딩 내가 만든 프로그램에 버그가 얼마나 있나 테스트해보기 위하여 코딩 천재인 세 에게 프로그램 제작을 의뢰했다. 맛보기 버전으로 일부 기능만 지원한다고 하는데 도대체 이것은 어떻게 쓰는 물건인고? 풀이 IDA의 어드레스 대응이 쉽도록 모든 문제들의 ASLR플래그를 제거했다. 자꾸 error가 뜨길래 401770으로가 봤다. fseek으로 EOF 를 찾아 ftell로 파일포인터를 얻어 파일사이즈를 구한후 <=1000000 체크를 한다. 그런데 Nt함수이름을 보니 디버깅 탐지를 하고있엇다. jmp 시켜서 우회했다.
b e e t l e 를 보자마자 파일에 넣고 읽었다. 그런데 ftell!= 10 에서 자꾸 밖으로 나갔다. 읽은 파일포인터가 10 일경우인데 위를 다시보니 아무리 해도 10이 나올수가 없었다. 계속 삽질하다가 디버거로 다시 봤는데 Hex-ray가 잘못된 것이였다. LABEL_28이 if 위에 올라가있어야되는데 ㅠㅠ 그래서 beetle의 b앞 9자리에 아무문자든 패딩을 넣어준후 딱 b가 맞는 시점에 파일포인터가 10이 되도록 했다. 파일내용 : ispaddingbeetle 이렇게 넣고 읽어보니 Key : Just_5+rin9_Bug
CRYPTO 200 Weird Square 아들 셋을 둔 한 억만장자가 있었다. 억만장자는 아들들에게 "너희 앞에 상자가 있다. 여기에는 내 재산의 80%가 들어있으니 비밀을 풀어 내 재산을 물려 받거라" 라고 말하며 종이 2장을 건네주는데.. 풀이 이거 푸는데 미치는줄알았다... 이게뭐지?? 이미지 힌트를 보니 rkjfnp가 1시방향에서 채워지는걸 알았다. 선을 그어라 라는 힌트가 있었다. 순차적으로 결합 이라는 걸 보고 무슨 순서일것이라고 생각하여 알파벳 순서대로 선을 그어봤다. 알파벳 S가 나왔다 ㅠㅠ 그래서 스트링을 넣으면 알파벳 순서와 모양대로 출력해주는 파이썬 스크립트를 짜보았다.
def c2(a): print " print "" print " "+a[0] "+a[1] def c3(a): print a[2]+" print "" print " "+a[1] "+a[0] def c4(a): print a[3]+" print "" print a[2]+" "+a[0] "+a[1] def c5(a): print " "+a[4] print "" print "" print " "+a[3]+" "+a[0] print " "+a[2]+" "+" "+a[1] def c6(a): print " "+a[5]+" "+" "+a[0] print "" print " "+a[4]+" "+a[1] print "" print " "+a[3]+" "+" "+a[2] def c8(a): print " "+a[7]+" "+" "+a[0] print " "+a[6]+" "+a[1] print "" print " "+a[5]+" "+a[2] print " "+a[4]+" "+" "+a[3] while 1: s=raw_input() l=[] for i in s: l.append(i) eval("c"+str(len(s))+"("+str(l)+")") l.sort() print l
차례대로 i v u c d g이다. 머리속에서 그리다보니 c를 o로 봤다. ` dg는 그려도 찾기어려웠다.ㅜ 한곳 틀리면 많은 부분을 다시 찾아야 되서 너무 힘들었다 ㅠㅠ 반복해서 찾으면 succ essn ever neve rnev erre sign rund eerbi rduru seg grib sric erev erse success never never never resign run deer bird uruseggribsrice reverse 이 나온다. 띄어쓰기를 빼고 파이썬.upper()를 이용하여 대문자를 만들어준후 인증을 했다. Key : SUCCESSNEVERNEVERNEVERRESIGNRUNDEERBIRDURUSEGGRI BSRICEREVERSE
MISC 200 왜 읽지 못하니!!! 집 비밀번호를 바꿨는데 잊어버렸다. 이럴 때를 대비하여 비밀번호를 적어놨는데 가려 보이지 않는다. 비밀번호가 있는데 왜 읽질 못하니... 풀이 스트링이 메모리상에 꼭 적재되있을거라고 확신하고 치트엔진으로 Key is를 스캔해 보았다. 풀이2 한쇼로 열고 복붙하면 바로 보인다 ㅠ. Key : 1l0v3h4mbuG3rs
FORENSIC 200 다 남아있다고...!! 시험지가 유출되어 돌아다니고 있다. 유출자의 컴퓨터 자료에서 증거를 찾아 시험지의 유출을 막자 풀이 헤더를 보니 또.ad1이다 FTK Imager로 파일 추출을 해본다. 쿠키를 뒤져보고 index.dat 기록도 뒤져보고 모든 파일을 다뒤져보았는데 단서가 아무것도 없었다. 그래서 파일내 스트링을 찾아주는 프로그램을 이용해 jpg png gif hwp 다 찾아 봤고 pdf를 검색해보니 이런게 나왔다. 파일내에 있을것으로 생각하고 pdf헤더고 ZIP헤더고 뭐고 다 찾아보았지만 아무것도 들어있는게 없었다. (HINT) [Forensic 200] : 시험지는 현재 유출되어 돌아다니고 있다. (tistory) 를 보고 파일명을 검색해 보았다.
열어보니 이 있었다. 접속해서 testpaper.hwp라는 한글파일을 하나 더 받았다. 암호가 걸려있었다. 처음엔 암호가 뭔지 툴도 찾아보고 문제도 풀어보려했다. 그런데 안나온다. ㅠ 다시 살펴보니 댓글을 참조하라고한다. ㅠㅠ 여기있었다니 저걸로 입력하니 된다. 나온다. 을 복사하면 T1JlT19PckVv 이 base64 디코딩을 하면 OReO_OrEo Key : OReO_OrEo
BINARY 200 GIF 잠깐, 무언가 지나간 것 같은데... 풀이 분석하기 싫은 ASLR은 기본으로 떼주었다. 사진이 순서대로 5장씩 1000ms로 반복된다. sub_401000 의심이 되어 이쪽에 브레이크 포인트를 걸어도 아무리 멈추지 않아서 다시 분석을해보았다. sub_401610 이쪽인데. 405B9C==100 일 때 저함수를 실행하게 된다. 이변수는 글자가 하나씩 바뀔때마다 증가하며 총 100*1s=100초가 지나야한다. 항상 401000함수를 거치도록 nop 패치를 했었는데 sub_401000(dword_405b9c); 인자 때문에 함수안에서 Write하고있던 값이 달라져서 그냥 SetTimer의 인터벌을 1ms로 바꿔주었다..
이쪽으로 잘 실행이 되었다. 그런데 401100이 의심스럽다. 들어가보니 앗 이게 왠일... 헥스레이도 그래프뷰도 안보인다 ㅠ 디버거로 봤더니 난독화라닝ㅜ 자네 어디가시게... 이상한데로 점프했다. 사이에 nop로 2바이트 패치했다. 그렇게 같은 방법으로 쭉하다가 살짝 다른 방식이 나왔다. 최종적으로 점프하는곳이 72니까 거기까지 nop때리고 저장해서 IDA로 열어보니 잘열렸다. 오옹 잘 보인다. ㅎ
진짜 복잡하다.. 사실 이거보고 포기하고 다른문제 풀었는데 다시 풀어보려고 Step Over를 계속 해보니 우연히 뭐 하나를 발견했다. 와아.. MZ다 ㅎㅎㅎ 자신의 emagic을 가져오는것 같아서 쭉 돌려보다가 자신 바이너리와 비교하였더니 달랐다. 매우 기뻐서 보자마자 추출을 시도했다. dword_405b84 < 0x800이 3개 있었다. 0x800*3= 총 0x1800바이트 크기의 바이너리이다. 패치(후킹)할부분은 sub_401100 sub_401220 sub_401350 딱 3개 fclose로 핸들 닫기위해 추가로 후킹할것이다.
저기 405B7C에서 파일포인터를 가지고왔다.. 코드를 패치해주어야 해서 치트엔진 스크립트를 짜보았다. globalalloc(fprint1,128) globalalloc(fprint2,128) globalalloc(fprint3,128) globalalloc(fclos,128) alloc(str,10) alloc(buf,4) //메모리 할당 VirtualAllocEx와 같음 str: db '%c' //스트링 선언 004011FB: call fprint1 //fprint1로 후킹 nop 0040120B: jmp fclos //fclos로 e9 인라인 후킹 fprint1: mov [00405B90],cl pushad //레지스터 백업 pushfd //플래그 백업 push [00405B90] //출력할 데이터 (MZ) push str //%c 문자열 주소 push [00405B7C] //파일 포인터 call msvcr100.fprintf add esp,c //가변인자 cdecl 이므로 스택정리 popfd //플래그 복원 popad //레지스터 복원 ret //원래 흐름으로 되돌아감 00401332: call fprint2 nop fprint2: mov [00405B90],dl pushad pushfd push [00405B90] push str push [00405B7C] call msvcr100.fprintf add esp,c
popfd popad ret 004014FE: call fprint3 fprint3: mov [00405B90],al pushad pushfd push [00405B90] push str push [00405B7C] call msvcr100.fprintf add esp,c popfd popad ret fclos: //파일 핸들을 닫지 않을경우 출력이 안됬다. push eax push ebx add eax,11 pushad pushfd mov eax,[00405b7c] push eax //파일포인터 넣고 call msvcr100.fclose //핸들 클로즈 add esp,4 popfd popad jmp 00401210 파일이 6 KB 이쁘게 잘나왔는데 UPX가... 그냥 동적 디버깅을 했다.
또 안티디버깅이다 csrss.exe 프로세스핸들을 이용한 기법이다. 살포시 jmp 시켜서 넘겨주고 이런 곳에 InternetOpen/Url 등을 썻는데 자꾸 응답이 없길래 그냥 키로 추정되는 곳으로 jmp 시켜주었다. 이쪽으로 이렇게 짠! 이 문제 풀이 쓰는데 5시간이나 걸렸다. ㅠㅠ 힘들긴해도 제일 재미있었다ㅋ Key : What_!s_T0d@ys_lUnCh??
FORENSIC 300 M1F2T3 이동식 디스크 속 숨겨진 파일의 전체경로와 생성시간과 크기(byte단위)를 찾아주십쇼 키 형식(md5): 전체경로_시간(1995.02.02.12:12:12)_크기 풀이 파일을 받아 열었다. 처음보는 헤더라 검색해도 잘나오지않았다. 밑에 이런게 있었고 제목 M1F2T3 와도 연관성이 있어 검색해보았다. Master File Table 에 관한 파일이여서 MFT를 분석할수 있는 툴을 검색했다. 숨겨진 파일 이라는걸 보고 파일 속성이 나타나는 툴을 사용했다. 구글링 맨처음 나오는 mft2csv를 썼는데 마침 찾아보던 중에 숨김 파일 속성이 부여되어 있었다. \PRIVACY\sec\urity\CbVkqCbqtM.jpg_2014.08.03.10:04:26_114627 을 md5시키고 인증했는데. 안됬다. 여러파일을 인증하던 온갖 방법을 써봤는데도 안되길래 헤더를 수정해서 레코드를 숨긴문제인가 싶어 헥스로 다봤는데도 아니였다 ㅠ 힌트 중 F:\ 와 파일 할당크기를 보라고해서 F:\PRIVACY\sec\urity\CbVkqCbqtM.jpg_2014.08.03.10:04:26_114688 을 인증해도 안됬다. 그래서 다른 툴인 analyzemft 를 썼다. 날짜만 바꿔서 F:\PRIVACY\sec\urity\CbVkqCbqtM.jpg_2014.08.03.19:04:26_114688 을 인증했더니 성공했다. ㅠㅠ 이거 때문이였다니 Key : ed4dec0b41895a811a86178470355b6c
BINARY 300 Binary Brothers 오 부라더 풀이 바이너리가 2개있다. 이쪽에서 걸리길래 nop 시켜줬다. 401150 함수인데 파이프를 생성한다 그래서 Brothers1을 실행시켜주었다. 같이 실행하지 않으면no를 띄운다. 통신을 기다리고 처리하는 쓰레드를 생성한다. 밑을 보면 이런게 있다 바로 523390을 넣어본다. 이렇게 3개씩 있다. 523390이 보이니까 이렇게 넣어주면 다른 쪽에 저렇게 출력된다. 234367 130098을 넣으면 숫자 그대로 나오는데 스트링이 나오는걸보면 뭔가 수상해서 저쪽을 집중적으로 공략했다.
523390 버퍼를 401D70에 넣어주는데 분석해보니 이바이트를 바탕으로 ICE문자열을 만들었다. 함수하나가 이만큼이나 길다. 쭉쭉쭉 내리다가 이런걸 리턴한걸 보았다. 처음에 Fake라길래 다른 스트링을 찾으려다가 멘붕이와서 Brothers1을 분석했다.
C#이길래 디컴파일러로 디컴파일 해서 쭉 분석해보니 이쪽이 의심스러웠다. 바로 Decrypt 할수 있도록 VS로 옮겨 a에 61782450\0 을 넣고 Decrypt2를 돌렸더니 가 나왔다. 키 인증을 했는데 Fail이 뜬다. 아무리 봐도 이게 맞는거 같은데 관리자께 문의 드려보니 키가 잘못됬다고 한다. Like를 보니 뒤에 뭔가 있는것 같다. 아까 찾은 ICEF1ke를 뒤에 붙여서 인증했더니 또 Fail이 뜬다. 삽질을 하다가 또 관리자님께 문의 드렸는데 키가 짤렸다고 한다. 혹시나 해서 다시 해보니 됬다. F1ake 가 빠지고 인증했었던것이다 ㅠㅠ 근데 이제보니까 Fake가 아니라 Ice Flake였다 ㅋ Key : HakB4byiSLikeICEF1ake 수고 많으셨습니다. 풀이보고서는 yisf.sch@gmail.com 으로 보내주시면 됩니다.