반응형

이번 코드게이트 대학부 예선에는 아주대학교 Whois 팀으로 참가했다.

우리 학교의 기말고사 기간이 다른 학교들 보다 조금 늦은 편이라 대회 일정이 시험기간 중간에 끼어버렸다.

시험기간 중에 대회에 참여하다 보니 참여 인원이 적었고, 대부분 온라인으로/극소수의 인원만 오프라인으로 모여 참여하였다.

동아리 지원금으로 큰 공간을 대여해서 팀원들과 밥도 같이 먹으면서 대회하고 싶었는데 아쉬웠다.

 

 


대회 중에 내가 계속 붙잡고 있었던 misc 카테고리의 n3 문제의 공개된 write-up들을 보면서 풀어본 풀이를 작성해 보았다. 

onnx 파일이 주어지는데, onnx 파일은 하나의 딥러닝 모델이다.

https://netron.app/ 에서 시각적으로 구조를 볼 수 있다.

 

input이 1*3*48*768로 설정되어 있는데, 이것은 768 * 48 크기의 하나의 RGB 이미지를 의미한다.

 

다음 If_0_then_branch

각 Conv 레이어는 최대 가중치 1*3*48*256 = 36864를 가진다.

첫번째 Conv 레이어의 Weight는 모두 1로 채워져 있다. 그러나 두번쨰 Conv 레이어의 Weight는 0과 1의 조합으로 채워져 있다.

less than 300  AND less than 32500 AND greater than 32300 조건에 따라서 합은 32400정도가 되어야 하며, 해당 값에 근접할만한 레이어는 두번째 Conv 레이어다. 해당 텐서  값을 다운받아서 시각화할 수 있다.

 

from PIL import Image
import numpy as np

t1 = np.load("t1.npy")
t1_img = (t1 * 255).astype(np.int8).squeeze(0).transpose(1, 2, 0)
Image.fromarray(t1_img, "RGB").save("t1.png")

 

플래그 한 조각을 얻었으므로 다음 If_0_then_branch__If_0_then_branch으로 넘어간다.

(((Input * 255) + Add tensor weight) * 137) %257 (A-A//257*257 나머지 계산임) -> concat(axis = 1) -> conv

 

conv의 텐서를 보면

[

[[[1]],[[0]],[[0]],[[-1]],[[0]],[[0]]],

[[[0]],[[1]],[[0]],[[0]],[[-1]],[[0]]],

[[[0]],[[0]],[[1]],[[0]],[[0]],[[-1]]]

]

첫번째 conv은 채널 0과 3 사이의 차이를 계산

두번째 conv는 채널 1과 4 사이의 차이를 계산

세번째 conv는 채널 2와 5 사이의 차이를 계산

각 차이의 합의 제곱이 작아야 하는데, concat(axis=1)처리된 것에 따라서 채널 0부터2는 concat 레이어의 input값이었고

채널 3부터 5는 concat의 weight 텐서값이었으므로, input값과 concat의 weight 텐서값이 같을 것이라고 보고 최초 input을 찾기 위해 역연산을 진행한다.

A * 137 = C (mod 257) 역원 구하기 -> pow(137,-1,257) => 242

 

from PIL import Image
import numpy as np

tc2 = np.load("tc2.npy")
ta2 = np.load("ta2.npy")

t2 = ((tc2 * 242 - ta2) % 257) / 255
t2_img = (t2 * 255).astype(np.int8).squeeze(0).transpose(1, 2, 0)
Image.fromarray(t2_img, "RGB").save("t2.png")

 

다음 If_0_then_branch__If_0_then_branch__If_0_then_branch

는 다음에 이어서...

https://party4bread.github.io/writeupfyi.html

 

마지막 조각 If_0_then_branch__If_0_then_branch__If_0_then_branch__If_0_then_branch

Input * 2 -1 -분할-> [,,,0:256] * [,,,256:512] * [,,,512:768] * Mul() <= 0

 

반응형

+ Recent posts