저는 GMW(Give Me Wi-Fi) 팀이였는데요.

문제를 많이 풀어 3위(1위랑 동점이지만 늦게풀어서)까지 갔는데,

막판에 nano 문제 힌트가 나가고 nano를 푼 팀이 세 팀이 생겨서 4위로 떨어진 불운의 팀입니다. ㅠ_ㅠ


저는 optimize, recovery를 풀었는데요.

저희 팀은 FindKey.pcap, pyc_pcap, nano 문제를 못 풀었습니다.ㅜㅜ

문제풀이 시간에 들은 문제를 포함해 제가 아는 문제들 풀이를 모두 적어볼게요.


문제: 

e.txt

문제파일:

HC_files.7z.001

HC_files.7z.002


--- KeyIs ---

다음과 같은 bmp파일이 주어집니다.

key.zip

문제에서 헤더의 1byte가 수정이 되었다고 주어집니다.

열어보면 다음과 같이 사진이 회전된 것을 볼 수 있습니다.


width가 변조되어서 저렇게 이상하게 뜨는 것을 볼 수 있습니다.

BMP의 width는 0x12에 저장되므로, 21로 되어있는 이 값을 23으로 바꾸면 제대로 뜨는 것을 볼 수 있습니다.


flag: CanUCThi5Key


--- nano ---

zlib으로 압축된 파일이 주어집니다. 이는 파이썬 스크립트로 풀 수 있습니다.

import zlib
s = open('nano_zlib', 'rb').read()
open('nano', 'wb').write(zlib.decompress(s))

이렇게 압축을 풀면 x86 boot sector가 나오는데, 이를 VMware의 가상머신중 하나에 Floppy Disk device를 추가하고 부팅합니다.

Edit virtual machine settings를 누른 뒤 Add를 누르고 다음과 같이 진행합니다.



그리고 부팅하면 flag를 볼 수 있습니다.


flag: D0_Y0u_Kn0w_R34lM0d3?


--- optimize ---

파이썬 코드가 주어지는데 실행을 하면 계산 량이 너무 커서 아무 것도 출력하지 않습니다.

이 코드를 최적화시켜 무엇이 출력되는지 알아내야 합니다.

pow_plus 함수를 보면, 주어진 \(x\)와 \(n\)에 대하여 \(x^0+x^1+x^2+...+x^n\)을 계산하고 return하는 것을 볼 수 있습니다.

이는 등비수열의 합으로써, \(\sum\limits_{i=0}^{n} x^{i} = \frac{(x^{n+1}-1)}{x-1}\)임을 이용해 pow_plus(x, 3133701) = \(2^{3133702}-1\)임을 알 수 있습니다.

그 다음 after_align을 호출하는데, 이 함수는 10진수 x의 각 자리수의 합을 출력합니다.

제 컴퓨터로 돌렸을 때 after_align함수가 매우 느려서 이 함수도 최적화(?)를 했는데, 지금 서버컴으로 돌려보니깐 15초정도밖에 안 걸리는군요...-_-;; after_align(2**3133702-1)을 넣어주면 4247061이 나옵니다.

좋은 컴을 씁시다...ㅠㅠ


flag: 4247061


--- recovery ---

input 파일을 table 길이만큼 나누고, 각 part를 돌면서 table을 이용해 byte의 순서를 바꿔 암호화를 합니다.

ENC.py에서 table_inverse를 추가하고, table을 table_inverse로 바꿔주면 됩니다.

#!/usr/bin/python
from struct import unpack,pack

table = [48, 27, 50, 8, 47, 73, 12, 4, 66, 0, 14, 77, 56, 26, 63, 67, 17, 11, 68, 22, 72, 69, 60, 64, 74, 58, 54, 42, 65, 32, 33, 40, 39, 37, 51, 59, 24, 35, 38, 61, 21, 31, 57, 20, 76, 13, 10, 43, 9, 78, 46, 44, 45, 49, 3, 75, 23, 2, 19, 25, 28, 41, 29, 6, 30, 53, 70, 7, 16, 18, 34, 1, 62, 52, 5, 55, 36, 79, 71, 15]

table_inverse = []
for i in xrange(len(table)):
	table_inverse.append(table.index(i))

lt = len(table_inverse)
f = open("./ENCRYPTED","rb")
f2 = open("./DECRYPTED","wb")
d = f.read()
f.close()
a = ""
result = ""
for i in range(0,len(d),lt):
	a = d[i:i+lt]
	for j in range(0,lt):
		result += a[table_inverse[j]]
	
f2.write(result)
f2.close()

이렇게 DECRYPTED를 구한 뒤 hex editor로 열어보면 flag가 바로 보입니다.

참고로 이 파일은 Frozen의 dubstep remix버전 mp3파일이네요.


flag: To_test_the_limit_and_breakthrough



FindKey.pcap와 pyc_pcap 문제는 모든 팀이 못 푼 것 같아요.

handray는 눈 크게 뜨고 열심히 분석하다보면 나올 거에요... 저희 팀도 세네 번의 시행착오를 겪었네요.


web이나 pwnable 등 서버 쓰는 문제가 안 나와서 좀 아쉽긴 하네요. 저희 팀원들도 주분야가 시스템인 분들이 많았는데ㅠ_ㅠ

아무튼 두 시간 반정도 되는 시간동안 재밌게 풀었습니다~

+ Recent posts