Page tree
Skip to end of metadata
Go to start of metadata

문서 작성 요령

Witeups는 팀원들간의 정보 공유 및 본인의 기록을 관리하는 용도 입니다.
조금은 귀찮더라도 훗날 큰 재산이 될 거라 믿고, 성실하게 작성을 부탁드립니다.

  1. 기본적으로 기존 작성 포맷을 따라 작성해 주시기 바랍니다.
  2. Writeups는 대회 진행 중에는 비공개로 작성되며, NoMoreACL팀원만 로그인 후 열람/편집 가능합니다.
  3. 폰트: 각 목차는 [제목1], 그외의 지문은 모두 [제목2] 사이즈로 통일해 주시기 바랍니다.
  4. 이미지: 이미지를 클릭하여 가급적이면 900px,700px,350px중에 선택 후, 테두리를 적용하여 통일해 주시기 바랍니다.
  5. 코드: 코드를 입력하고 싶을땐 "{코드 블럭" 이라고 입력하면 코드 블럭이 생성되고, 해당 박스를 누르면 편집이 가능합니다.



Contents


Outline


1) 대회일정
2018-09-07 01:00 KST ~ 2018-09-14(금) 01:00 KST



출제 분야는 아래와 같이 Web,, Forensics, Steganography, Cryptography, Reverse Engineering, Miscellaneous 있다.
문제를 풀때마다 돈!?이 지급되는 방식이고, Hint를 사용하면 차감되며 순위 또한 차감된다.


[https://platform.icec.tf/subjects/campaign/1]




Web


1. Toke Relaunch
- Description: We've relaunched our famous website, Toke! Hopefully no one will hack it again and take it down like the last time.


[https://static.icec.tf/toke/]


- Writeup: 다시 웹 사이트를 오픈했고, 더이상 해킹 당하지 않도록 예전과는 다르게 조치를 한 듯 하다.
사실 이 문제를 풀려고 여러가지 시도를 해봣지만, 풀리지 않았는데... Web 02번 문제가 공개되었는데...
너무 쉬웠다. 그래서 가장 낮은 수준에서의 보안 조치란 무었을 했다는걸까...??
정답은 바로 robots.txt 에 있었다. 아래 경로를 따라가면 flag를 확인 할 수 있다.

IceCTF{what_are_these_robots_doing_here}



2. Lights Off

- Description: Help! We're scared of the dark!


[https://static.icec.tf/lights_out]


- Writeup: 지문이 누가 불을 껏나!!??
너무 쉽다. 장난하나 싶을 정도로... -,.-;;
Css에서 background-color에서 black에서 white로 변경한다.

=

변경 후 백그라운드가 하얗게 변하는 모습을 볼 수 있다.

추가로 css각 섹션의 display가 none;로 되어 있어, 0 값으로 변경하면 flag가 보인다.


IceCTF{styles_turned_the_lights}



3. Fridfinnur

- Description: Eve wants to make the hottest new website for job searching on the market! An avid PHP developer she decided to use the hottest new framework, Laravel! I don't think she knew how to deploy websites at this scale however....


[ https://3gxx71fzlzcrln8-fridfinnur.labs.icec.tf/ ]

- Writeup: 웹이나 시스템 문제들이 페이지 안에 구현되어 있어서 신기했다. 본 웹 문제는 iframe으로 구현되어있다. url을 복사해서 다른창에서 시도하였다.


딱히 다른 클릭 가능한 것들이 보이지 않는다.

독특하게 하단에 f12를 누른 것처럼 디버깅 창이 자체적으로 구현되어있다.

Jobs항목을 보았다.

여러 직업을 선택하는 항목이 있는데, 임의의 직업을 선택하여 아무거나 제출해보았다.


https://3gxx71fzlzcrln8-fridfinnur.labs.icec.tf/jobs/

https://3gxx71fzlzcrln8-fridfinnur.labs.icec.tf/jobs/retail

위 주소의 다음 항목에 jobs 목록이 들어가는데, 실제 내가 풀때는 이것저것 눌러보다가 풀었다. (뭐 이래....)

출력되는 php소스 코드는 다음과 같다.

/laravel/routes/web.php


https://3gxx71fzlzcrln8-fridfinnur.labs.icec.tf/jobs/임의의 값

jobs/아래에 지정된 직업 목록이 아닌것을 넣었을 때 플래그를 출력하는 에러페이지로 리다이렉트된다.
IceCTF{you_found_debug}



Forensics


1. Modern Picasso

- Description: Here's a rendition of some modern digital abstract art. Is it more than art though?

[https://static.icec.tf/picasso/picasso.gif]


- Writeup: 위 gif와 같이 촐싹 대는 이미지가 하나 주어진다.
아무래도 저 이미지를 모두 오버레이 시켜야하는 문제 같다.
먼저 gif를 split 하여 저장한다. https://ezgif.com/split
split 된 이미지를 아래 코드를 통해 오버레이 시키면, flag 이미지가 보인다.

img_overlay.py
import os 
from pprint import pprint 
from PIL import Image

files = []
for dirname, dirnames, filenames in os.walk('./picasso'):
    # print path to all subdirectories first.
    for subdirname in dirnames:
        files.append(os.path.join(dirname, subdirname))

    # print path to all filenames.
    for filename in filenames:
        files.append(os.path.join(dirname, filename))



for x in range(len(files)):
	background = Image.open("./picasso/flag.png")
	overlay = Image.open(files[x])
	background = background.convert("RGBA")
	overlay = overlay.convert("RGBA")
	new_img = Image.blend(background, overlay, 0.1)
	new_img.save("./picasso/flag.png","PNG")

오버레이 결과

IceCTF{wow_fast}


Writeup: 위 문제와 동일하지만, 포토샵 전문가의 견해로 풀어낸 결과이다.


포토샵에서 첫번째 이미지 output-0 오픈  [File] - [Open]

 

나머지 이미지들을 모두 선택 후 포토샵에 열어 놓은 첫번째 이미지 output-0 위에 드래그 앤 드롭한다.

드래그 앤 드롭하면 이런 모양이 나온다. 
가져오는 이미지들 수 만큼 엔터키 누른다. (66장이니까 그냥 계속 엔터키 누르고있으면 됨)


오른쪽 LAYERS 탭을 보면,

아래부터 위로 레이어들이 생성되었고 각 레이어들에는 가져온 이미지들이 한장 한장 들어가있다. (모든 이미지들을 한 곳에 쌓아놓음)


이제 한장 한장 쌓아 올려진 이미지의 어두운 부분들만 겹쳐 보여지게끔 블렌딩 값을 Darken으로 바꿔준다.

(1)각 레이어를 선택하고 (2)값을 Darken으로 바꾸면 글씨 조각이 하나씩 보이게 된다.

(66개 하나하나 해야함..한꺼번에 설정 불가능..ㅜㅜ.. 레이어 클릭하고 아래 방향 키 두번 누르면 좀 더 빨리 바꿀 수 있음...;;)

플래그가 나온다.  IceCTF{wow_fast}




2. Hard Shells

- Description: After a recent hack, a laptop was seized and subsequently analyzed. The victim of the hack? An innocent mexican restaurant. During the investigation they found this suspicous file. Can you find any evidence that the owner of this laptop is the culprit?


[https://static.icec.tf/hardshells/hardshells]


- Writeup: 파일을 받아보니, zip 파일 포맷이며, 암호가 걸려있다.
fcrackzip 으로 비밀번호를 취득하여 unzip 후 진행한다.


unzip 후 확인해 보니 d라는 파일이 존재한다.
d 는 Minix Filesystem이라서 리눅스에서 mount 하였다.


mount 시킨뒤 해당 디렉토리 확인결과 dat라는 data파일이 존재하였다.
strings으로 확인해 보니 header와 footer를 보니 png파일 임을 알았고, 뭔가 헤더가 깨져서 data로 표시되었을 것이라 생각함.



010editor로 해당 파일을 열어 깨진 헤더 PUG >> PNG로 변경 하여 보면 flag가 보인다.



IceCTF{look_away_I_am_hacking}



3. Lost in the Forest
- Description: You've rooted a notable hacker's system and you're sure that he has hidden something juicy on there. Can you find his secret?


[https://static.icec.tf/forest/fs.zip]


- Writeup: 해커가 남긴 흔적을 찾아라...;; 일단 제공하는 파일은 fs.zip이며, 압축을 풀면 위 그림과 같이 리눅스 파일들이 보인다.
홈디렉토리의 .bash_history를 확인해보면 해커는 wget으로 tool.py를 통해 secret파일을 암호화 하여, hzpxbsklqvboyou 라는 파일을 남긴뒤 tool.py를 삭제했다.
hzpxbsklqvboyou 파일 내용은 "8NHY25mYthGfs5ndwx2Zk1lcaFGc4pWdVZFQoJmT8NHY25mYthGfs5ndwx2Zk1lcaFGc4pWdVZFQoJmT8NHY25mYthGfs5ndwx2Zk1lcaFGc4pWdVZFQoJmT8NHY25mYthGfs5ndwx2Zk1lcaFGc4pWdVZFQoJmT8NHY25mYthGfs5ndwx2Zk1lcaFGc4pWdVZFQoJmT" 라고 적혀 있다. 아마 암호화된 값인것 같다.

tool.py 다운로드 경로에서 다시 해당 스크립트를 다운로드 받은뒤, 해당 스크립트를 분석 후 역으로 복호화 스크립트를 작성하여 풀어내면 된다.

decrypt_base64.py
#/home/hkr/.bash_history를 보면 tool.py으로 secret파일을 인코딩하여 hzpxbsklqvboyou 으로 저장한 흔적을 확인

#cat /home/hkr/hzpxbsklqvboyou 확인 시 다음과 같은 인코딩된 data확인 됨.
#8NHY25mYthGfs5ndwx2Zk1lcaFGc4pWdVZFQoJmT8NHY25mYthGfs5ndwx2Zk1lcaFGc4pWdVZFQoJmT8NHY25mYthGfs5ndwx2Zk1lcaFGc4pWdVZFQoJmT8NHY25mYthGfs5ndwx2Zk1lcaFGc4pWdVZFQoJmT8NHY25mYthGfs5ndwx2Zk1lcaFGc4pWdVZFQoJmT

#.bash_history에서 wget으로 다운로드한 tool.py의 git 경로에서 tool.py 인코더 다운로드
#wget https://gist.githubusercontent.com/Glitch-is/bc49ee73e5413f3081e5bcf5c1537e78/raw/c1f735f7eb36a20cb46b9841916d73017b5e46a3/eRkjLlksZp(tool.py)

# tool.py 코드는 아래와 같으며, 해석은 주석을 참고
#!/usr/bin/python3
import sys
import base64

def encode(filename):
    with open(filename, "r") as f:
        s = f.readline().strip()
        return base64.b64encode((''.join([chr(ord(s[x])+([5,-1,3,-3,2,15,-6,3,9,1,-3,-5,3,-15] * 3)[x]) for x in range(len(s))])).encode('utf-8')).decode('utf-8')[::-1]*5

        #파일 내 문자열 한줄을 읽어와, 양쪽 공백을 제거한다.
        # 읽어온 문자열을 한 글자씩 단어 갯수만큼 반복문(for)을 돌려 아스키 코드 값으로 치환한 배열에, 출제자가 난독화를 위한 감가산을 산술한다.
        # 산술한 아스키 코드 값은(ord), 다시 아스키 값(chr)으로 치환한뒤 해당 배열을, 한 줄로(join) 합친다.
        # 합친 뒤에 base64로 encoding을 하며, encode된 값을 다시 역순으로 배열한다. 배열한 값의 5배수만큼 덧붙여 최종적으로 저장 후 실행한다.


if __name__ == "__main__":
    print(encode(sys.argv[1]))


# 문제를 푸는 방법은 위 난독화 및 인코딩을 역순으로 진행하면 된다.

import os
import base64

flag=''
enc = base64.b64decode("TmJoQFZVdWp4cGFacl1kZ2xwdn5sfGhtYm52YHN8")
# 위 에서 설명한 대로, 5배수 만큼 반복되기 때문에 4번 반복되는 문자열 제거, 문자열 역순 정렬, base64 decode를 진행한다. (문자열 제거, 역순정렬은 시스템에서 진행 후 코딩 함.)

for i in range(len(enc)):
 flag += ''.join(''.join(chr(ord(enc[i])+([-5,1,-3,3,-2,-15,6,-3,-9,-1,3,5,-3,15] * 3)[i])))
# encode시 사용한 아스키 코드 값의 변경을 준 난독화 감가산을(+/-) 역산술 적용하여, 배열을 합쳐 print하면 flag를 확인 할 수 있다.
print flag


IceCTF{good_ol_history_lesson}



Steganograph


1. Drumbone
- Description: I joined a couple of hacking channels on IRC and I started recieving these strange messages. Someone sent me this image. Can you figure out if there's anything suspicous hidden in it?


[https://static.icec.tf/drumbone/drumbone.png]


- Writeup: bitmap으로 변경 후 코딩을 통해 풀어낼수도 있지만, 본 라업은 포토샵 전문가가 풀어낸 결과이다. (대단함...)

다운로드한 .png파일을 StegSolve에서 열어본다.

옆으로 계속 넘겨가며 메세지나 이상한점이 있는지 보다보니 QR 코드 비슷한것 이 나왔다.


크게 확대해서 보니 

점 하나가 가로 1px 세로 1px이다.

각각의 점들 사이의 공백을 채워 넣거나 빼야하는데 나는 포토샵에서 점들을 복사해서 공백을 채웠다.

일단 부족한 캔버스를 늘려준다. [Image] - [Canvas Size]

Move tool 선택, Alt키를 누른채 드래그앤드롭 하면 복사해서 원하는 위치에 둘 수 있다.(Duplicate) 

(1) Background 레이어를 복사한다.

(2) 복사된 레이어 선택

(3) 복사된 레이어의 블렌딩 값을 Darken으로 바꿔준다.

(4) 복사된 레이어를 끌어당겨 점 사이부분에 위치시켜 공백을 채운다.

(1) Alt키를 누른채 드래그앤드롭 

(2) 새로운 레이어 생성됨.

(3) 세로 공백이 채워질때까지 (1),(2)반복

점 사이에 있떤 위아래 공백이 채워짐. 한 셀의 세로 길이 완성

레이어를 클릭한다. Ctrl+E 로 모든 레이어를 합친다.

세로 공백을 채웠으니 가로에 있는 공백을 채운다.

(1) Background 레이어를 복사한다.

(2) 복사된 레이어 선택

(3) 복사된 레이어의 블렌딩 값을 Darken으로 바꿔준다.

(4) 복사된 레이어를 끌어당겨 가로에 있는 공백을 채운다.

Alt키를 누른채 드래그앤드롭하면서 나머지 공백을 채우면 QR 코드가 완성된다.

QR 코드를 스캔하면 플래그가 다온다. 
IceCTF{Elliot_has_been_mapping_bits_all_day}



2. Hot or Not
- Description: According to my friend Zuck, the first step on the path to great power is to rate the relative hotness of stuff... think Hot or Not.


[https://ymsir.com/icectf2018/hotornot.jpg]


- Writeup: 엄청나게 많은 사진을 합친 이미지 파일이 주어진다. 이 문제 역시 포토샵 전문가의 견해로 풀어낸 문제이다.

크게 확대해보면 핫도그와 개 사진 뿐이다.

전체 이미지를 보면 녹색부분과 빨간색 부분이 보인다. 그리고 어렴풋이 QR 코드의 특징이 보인다.

3개의 큰 검정색 사각형을 확대해 보니 모두 개 사진들 뿐이다.

조그만 검정색 사각형 부분 가운데 |  빨간 네모 : QR 코드의 최소 셀 1칸  | 9개의 사진 모음 : 핫도그 칸은 검정색, 개 칸은 흰색

 

포토샵에서 이미지를 연다. 전체 이미지에는 가로 87 x 세로 87개의 사진이 있다. 

사진 하나의 가로 세로가 각각 100px이 되도록 이미지 사이즈를 가로 세로 8700px 으로  축소한다 [Image]-[Image Size]

셀 한 칸은 가로3개 x 세로 3개 총 9개의 사진이다.  셀 한 칸은 가로 300px 세로 300px이다.

그리드로 셀을 나눈다. [Edit]-[Preferences]-[Guides, Grid, & Slices]

그리드를 보이게 한다. [View]-[Show]-[Grid]

그리드에 스냅시킨다.[View]-[Snap To]-[Grid]

Guides, Layers Document Bounds 체크 되어 있으면 해제

네모선택툴(Rectangular Marquee Tool) 사용법

(1) 단독 선택

(2) 추가하며 선택

(3) Style

-Normal: 선택 범위 자유롭게 드래그 가능

-Fixed Size: 정확히 원하는 사이즈로 선택 가능

(4) Fixed Size 설정시 가로 세로 값 입력

빨간 네모를 클릭해서 새 레이어를 만든다. 

세 레이어에 검정색으로 채워야 하는 셀들을 선택하고 브러쉬 툴로 검정색을 채운다.

무브툴로 Alt를 누르고 복사해서 붙여넣는다.

나머지 공간은 네모 선택툴 Fixed Size 300px 300px 으로 하고 브러쉬로 검정색을 채운다.

 Ctrl + 로 줌인을 하고 SpaceBar 누르고 드래그로 옮겨가면서 무브툴로 Alt 누른채 드래그 하면서 핫도그 셀들을 다 검정색으로 채운다.

빨간 네모를 클릭해서 새 레이어를 만든다. 

브러시툴을 클릭하고 하얀색으로 색을 바꿔서 레이어 전체에 색을 칠한다.

] 을 계속 누르고 있으면 브러쉬 크기가 커진다.

당황하지 말고 꼼꼼하게 하얀색으로 칠한다.이때 꼭 새로 생성된 빈 레이어에 하얀색을 칠해야한다.

지금 상태는 새로 만들어진 레이어가 제일 위에 올라가 있으니 하얀색을 칠해놓으면 지금까지 했던게 없어지는것 처럼 보일 수 있다. 

만약 검정색을 채우던 레이어에 바로 흰색 칠을 했다면 Ctrl+Alt+z를 함께눌러서 이전단계로 돌아갈 수 있다.

흰색종이로 만든 레이어를 검정색 큐알코드 레이어 아래로 드래그해서 끌어내린다.

[View]-[Show]-[Grid] 에서 그리드를 해제한다.

완성된 QR코드를 앱에서 스캔해서 플래그를 확인한다.
IceCTF{h0td1gg1tyd0g}



Cryptography


1. Toke Relaunch
- Description: garfeld


- Writeup: 시저 암호처럼 ASCII를 치환해야하는 문제이다.
그림 하단의 문자를 위 07271978 이라는 숫자처럼 감가산하여 루프를 돌려야 하며, 특문은 예외이다.
또한, 감가산의 결과가 ASCII 코드중 알파벳 범위를 벗어날 경우에 ASCII 코드 테이블 맨 끝으로 이동하여 감가산 해야한다.

import os
import sys


enc="IjgJUO{P_LOUV_AIRUS_GYQUTOLTD_SKRFB_TWNKCFT}"
key= [0,7,2,7,1,9,7,8,0,7,2,7,1,9,7,8,0,7,2,7,1,9,7,8,0,7,2,7,1,9,7,8,0,7,2,7,1,9,7,8,]
special=[123,125,95]
flag = ''
no = 0
print "enc=",enc

for i in range(len(enc)):	
	x = ord(enc[i])
	ikey=key[no]

	if x in special:
		xx = x

	else:
		xx = x-ikey		
		if xx < 65:
			k=x-65
			ikey = ikey-k
			xx = 91-ikey
		no+=1
	flag+=''.join(chr(xx))
print "\nflag=",flag,"\n"


IceCTF{I_DONT_THINK_GRONSFELD_LIKES_MONDAYS} 

Binary Exploitation


1. Simple Overflow
- Description: 튜토리얼 식의 진행 방식임

     

버퍼에 Hello World! 를 한번 저장해보라는 소리이다

이렇게 넣으면 buf 버퍼에 Hello World! 가 삽입되면서 1단계 클리어

16 바이트의 문자열보다 더 많이 버퍼를 넣을수 있는가?를 물어 본다.

16바이트보다 더 많이 넣으면 다른 영역의 스택을 침범하게되면서 버퍼를 더 많이 넣을수있다

이와같은 취약점이 발생하는 이유는 strcpy때문.. 왜냐면 문자열을 복사할때 길이를 묻지않고 더 많이 복사할수있기 때문이다

secret변수의 값을 0x61616161로 세팅하라는 소리이다.

buf 바로 아래에 secret변수가 위치되어있으므로 buf영역을 넘어서 할당하게되면 secret까지 조작 할수있다.

이런식으로 하면 클리어

리틀엔디안으로 정렬해서 넣을수 있는지를 묻는소리이다. 

이런식으로 거꾸로넣으면 정렬되면서 넣어진다. 

secret변수를 0xcafebabe로 설정할수있는지 묻는다. \xbe\xba\xfe\xca로 넣으면 될듯하다

이러면 클리어되고 점수가 올라간다!





  • No labels

2 Comments

  1. 포토샵도 잘해야겠네요...;

    1. -_ - 그래야할것 같아요.. 스테가노는;;ㅎㅎㅎㅎㅎ