왜 writeup 이 여기 올라와있냐면 몇명이서 1일 1폰 스터디 만들었는데 1폰한게 세콘이라서 여따가 올린다 ㅎㅋ...
Vigenere3d
![](https://t1.daumcdn.net/cfile/tistory/995C12335A2BFCA403)
이런 코드와 함께 실행 결과를 준다.
빙그레는 뭐다? Brute force다.
먼제 빙그레 할떄 쓰는 키 2개가 서로 리버스 된 결과임을 염두해야 하고, 키의 길이가 14자리 임으로 7자리만 구하면 리버스 해서 키의 원문을 구해낼 수 있다.
import sys
import string
def _l(idx, s):
return s[idx:] + s[:idx]
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}"
t = [[_l((i+j) % len(s), s) for j in range(len(s))] for i in range(len(s))]
i1 = 0
i2 = 0
p = "SECCON{"
k = [0,0,0,0,0,0,0,0,0,0,0,0,0,0]
ENC = "POR4dny"
count =0
fl = 0
for a in p:
if count==8:
break
for i in s:
for j in s[::-1]:
tmp = t[s.find(a)][s.find(i)][s.find(j)]
print tmp
if((tmp == ENC[count])and i==j ):
print '----------------------------------'
print i
print j
print '----------------------------------'
k[count] = i
k[13-count] = j
fl = 1
count +=1
break
if(fl == 1):
fl=0
break
print ''.join(k)
.고로 다음과 같은 코드를 만들어서 돌려주게 되면
5FeOjS55SjOeF5
과 같은 키가 나온다.
이젠 FLAG 를 Brute force 해서 구해주면 된다.
import sys
import string
def _l(idx, s):
return s[idx:] + s[:idx]
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}"
t = [[_l((i+j) % len(s), s) for j in range(len(s))] for i in range(len(s))]
i1 = 0
i2 = 0
k = "5FeOjS55SjOeF5"
k2 = k[::-1]
ENC = "POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9"
count =0
flag = ""
fl = 0
for i in range(0,34):
for a in s:
tmp3 = t[s.find(a)][s.find(k[i1])][s.find(k2[i2])]
print a
if(tmp3 == ENC[count]):
print '--------------------------------------'
print a
print '--------------------------------------'
flag += a
count += 1
i1 = (i1 + 1) % len(k)
i2 = (i2 + 1) % len(k2)
break
print flag
print t[s.find("S")][s.find(k[0])][s.find(k2[0])]
Flag : SECCON{Welc0me_to_SECCON_CTF_2017}
![](https://t1.daumcdn.net/cfile/tistory/99110F335A2BFDB31A)
음 그렇다.
엄청난 수의 재귀를 돌리는데 저걸 C 로 해도 느린데 python 으로는 진짜 너무 너무 너무 너무 오래걸릴것이다.
고로 수열의 규칙을 찾자.
먼저 f(n) 의 값을 몇개 나열해 보자.
f(0) : 0
f(1) : 1
f(2) : 1
f(3) : 2
f(4) : 3
f(5) : 5
f(6) : 8
f(7) : 13
f(8) : 21
f(9) : 34
=> f(n) = f(n-1) + f(n-2) (단, n>=3)
사실 이건 코드에서도 찾을수 있다.
우리가 원하는 답은 f(11009) + f(11008) + ... + f(3) + f(2) + f(1) 이다.
그럼 그냥 f(n) = f(n-1) + f(n-2) (단, n>=3) 라는 식을 for 문 돌려서 f(11011) 까지 구하고
다 더해서 출력해주면 될것이다.
근데 다하고 보니 f(n) 같은거 나열 안하고 식 안찾고 그냥 코드 보고 할수 있는 거였다 젠장.
f=list()
f.append(0)
f.append(1)
f.append(1)
for i in range(3,11111):
f.append(f[i-1] + f[i-2])
res = 0
for i in range(11009,-1,-1):
res += f[i]
print "SECCON{" + str(res)[:32] + "}"
SECCON{65076140832331717667772761541872}
BabyStack
GO 언어 인거 같다.
eip 도 바꿀수 있는거 같고, rop 도 어캐짤지 잡히는데 잘 모르겠다
이번주 안에 익스짜는게 목표