코드 8문제? 정도 풀었는데 그 중 2개를 쓰겠다.
We Need an Emulator
MOV DRX "LemonS"
XOR TRX DRX
MOV DRX "caviar"
REVERSE DRX
XOR TRX DRX
REVERSE TRX
MOV DRX "vaniLla"
XOR TRX DRX
REVERSE TRX
XOR TRX DRX
REVERSE TRX
MOV DRX "tortillas"
XOR TRX DRX
MOV DRX "applEs"
...
문제에서 TRX값과 MOV, XOR, REVERSE 명령어들의 규칙을 알려준다.
TRX에 "GED\x03hG\x15&Ka =;\x0c\x1a31o*5M" 값을 세팅하고
저 명령어들을 실행하면 TRX에 FLAG가 담긴다고 한다.
파이썬으로 구현했다.
DRX = []
TRX = []
def debug(msg):
print('------------------------')
print(msg)
print('------------------------')
def mov(des,src):
global DRX, TRX
exec(f'{des} = list({src})',globals())
def xor(des,src):
global DRX, TRX,a,b
if des == src:
mov(des,'[]')
return
tmp = des
exec(f'a = {des}',globals())
exec(f'b = {src}',globals())
res = []
for i in range(0,len(b)):
res.append(chr(ord(a[i]) ^ ord(b[i])))
#debug(list(res))
exec(f'{tmp} = {str(res)} + a[len(b):]',globals())
def reverse(operand):
global DRX, TRX
exec(f"{operand} = list(reversed({operand}))",globals())
f = open('./Crypto.txt','r')
opcodes = f.readlines()
TRX = list("GED\x03hG\x15&Ka =;\x0c\x1a31o*5M")
#TRX = list("UL\x03d\x1c'G\x0b'l0kmm_ ")
for code in opcodes:
code = code[:-1]
debug(code)
tmp = code.split(' ')
if tmp[0] == 'MOV':
mov(tmp[1],tmp[2])
elif tmp[0] == 'XOR':
xor(tmp[1],tmp[2])
else:
reverse(tmp[1])
print(f'DRX : {"".join(DRX)} TRX : {"".join(TRX)}')
#print(f'DRX : {"".join(DRX)} TRX : {"".join(TRX)}')
처음에 DRX와 TRX를 문자열로 뒀는데 중간에 널값이 들어있어서 exec하는데 오류가 났다.
그래서 list로 바꿨다.
또 eval에서 "a=1+2" 같은 식이 먹힐 줄 알았는데
eval 은 "1+2" 같은 것만 되고 exec에서 명령어를 실행할 수 있다고 한다.
또 exec에서 전역이든 지역이든 변수를 갖다 쓸 수 있는줄 알았는데
exec('',globals())
이런식으로 해야한다.
Find Largest Triangle
3차원 좌표(x,y,z)를 n개 받아서 이 좌표들로 만들 수 있는 삼각형의 크기중 최댓값을 구하라는 문제다.
(사면체가 아니라 2차원 삼각형)
어떻게 구해야하나 생각했는데
구글링 해보니 여러 식들 중 수1 삼각함수의 활용에서 배운 헤론의 공식을 봤다.
from itertools import combinations
from math import *
# points is a list of 3D points
# ie: [[2, 9, -15], [0, 33, -20], ...]
def GetTriangleArea(d1,d2,d3):
s = (d1+d2+d3)/2
return sqrt(s*(s-d1)*(s-d2)*(s-d3))
def GetDistance(p1,p2):
return sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2 + (p2[2] - p1[2])**2)
def FindLargestTriangleArea(points):
com = list(combinations(points,3))
areas = []
for i in com:
com2 = list(combinations(i,2))
d = []
for j in com2:
d.append(GetDistance(j[0],j[1]))
areas.append(int(round(GetTriangleArea(d[0],d[1],d[2]))))
areas.sort(reverse=True)
return areas[0]
# return largest area
# Reading space delimited points from stdin
# and building list of 3D points
#points_data = raw_input()
points_data = input()
points = []
for point in points_data.split(' '):
point_xyz = point.split(',')
points.append([int(point_xyz[0]), int(point_xyz[1]), int(point_xyz[2])])
# Compute Largest Triangle and Print Area rounded to nearest whole number
area = FindLargestTriangleArea(points)
print(int(round(area)))
그리고 좌표들이 여러개가 입력되는데 모든 경우의수를 계산해야해서 어떻게해야 할까
했는데 생각해보니 고1 순열과 조합에서 조합을 쓰면 되겠다 싶었다 ㅋㅋ
그래서 파이썬에서 조합 라이브러리를 봤고 바로 써먹었다.
'CTF Writeup' 카테고리의 다른 글
2021 Incognito CTF Writeup (0) | 2021.08.28 |
---|---|
2021 전국 고등학생 보안 경진대회 WriteUp - ANUSEC 안동대 (0) | 2021.08.28 |
DarkCON CTF - PWN Writeup (2) | 2021.02.21 |
2020 Layer7 CTF Writeup - MISC (0) | 2020.11.19 |
2020 Layer7 CTF - Layer7 VM pwn/rev Writeup (0) | 2020.11.19 |