RNN은 Recurrent Neural Network의 약자이다. RNN은 입력과 출력을 시퀀스 단위로 처리해준다.

RNN은 은닉층 노드의 활성화 함수를 통해 나온 결과값을 출력츨 방향으로 보내면서 다시 은닉층 노드의 다음 계산의 입력으로 보내는 특징이 있다. 이 과정을 그림으로 표현하면 다음과 같다.

RNN의 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노드를 셀(cell)이라 한다. 이 셀은 이전 값을 기억하는 메모리의 역할도 수행하므로 메모리 셀 또는 rnn셀 이라 표현한다.

은닉층의 메모리 셀은 각각의 시점에서 이전 시점의 은닉층의 메모리 셀에서 나온 값을 자신의 입력으로 이용하는 재귀적 활동을 하고 있다.

RNN은 다음과 같이 입력과 출력의 길이를 다르게 설계 할 수 있다.

다음은 케라스의 SimpleRNN을 이용하여 RNN을 구현한 코드이다. 데이터셋을 학습시켜 다음에 올 숫자를 예측하는 프로그램이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from keras import layers
from keras import models
import numpy as np
 
# make dataset
# 0.1 단위의 실수 배열, x : 학습할 수열, y: 답
= []
= []
for i in range(6):
        li = list(range(i, i+4))
        x.append(list(map(lambda c: [c/10], li)))
        y.append((i+4/ 10)
 
= np.array(x)
= np.array(y)
 
# SimpleRNN : RNN레이어를 만든다. input_shape는 수열 4개 이후 나올 답을 구하기 때문에 [4,1]로 한다. 
# Dense : output layer
model = models.Sequential([
                            layers.SimpleRNN(units=10,
                                            return_sequences=False,
                                            input_shape=[41]),
                            layers.Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.fit(x, y, epochs=10000, verbose=1
 
print(model.predict(x))
 
# 테스트용 배열
x_te = np.array([[[0.6],[0.7],[0.8],[0.9]]])
print(model.predict(x_te))
cs

x의 각 배열마다 다음에 올 값인 0.4, 0.5, 0.6, 0.7, 0.8, 0.9에 근접하는 값이 출력 되었고, 테스트 배열의 다음에 올 값인 1.0에 근접하는 값이 출력되었다. 학습 횟수를 10000번으로 설정했지만 이 횟수를 더 늘리면 목표 값에 더 근접한 값이 나올 것이다.

'AI' 카테고리의 다른 글

CNN(합성곱 신경망)  (0) 2021.03.31
DNN(심층신경망)  (0) 2021.03.29
Keras(케라스)  (0) 2021.03.28
Tensorflow(텐서플로우)  (0) 2021.03.28

CNN은 Convolutional Neural Network의 약자로 주로 이미지 인식에 많이 사용된다. 이미지를 작은 특징에서 복잡한 특징으로 추상화하는 방식이다. 컬러 사진의 데이터는 3차원 형태로 들어오게 되는데, 사진 데이터를 픽셀값을 가진 2차원 행렬로 표현한다. 한 개의 픽셀은 RGB를 의미하는 3개의 색상값을 가지므로 1개의 픽셀은 3차원으로 구성된다.

CNN모델의 구조는 다음과 같다.

Convolution Layer에서 입력 데이터에 필터 적용후 활성화 함수를 반영하여 특징을 추출한다. Pooling Layer에서 Convolution Layer의 출력 데이터를 입력으로 받아서 크기를 줄이거나 특정 데이터를 강조하는 용도로 사용된다.

cnn으로 mnist 데이터셋을 학습시킨 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from keras.datasets import mnist
from keras.utils import to_categorical
from keras import layers
from keras import models
 
 
(x_train, y_train), (x_test, y_test) = mnist.load_data()
 
# reshape : 배열 차원 변경
x_train = x_train.reshape((6000028281))
x_train = x_train.astype('float32'/ 255
 
x_test = x_test.reshape((1000028281))
x_test = x_test.astype('float32'/ 255
 
# 배열을 2진 배열로 바꿈
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
 
 
 
model = models.Sequential()
# Conv2D : 컨볼루션 레이어 종류중 하나, 첫번째 인자 : 필터 수, 두 번째 인자 : 커널 행열, 세번째 : 활성화 함수, 네번째 : 이미지 크기, 흑백사진(1)
# MaxPooling2D : 이미지 크기를 2,2로 줄임(과적합을 막기 위함) 
model.add(layers.Conv2D(32, (33), activation='relu', input_shape=(28281)))
model.add(layers.MaxPooling2D((22)))
model.add(layers.Conv2D(64, (33), activation='relu'))
model.add(layers.MaxPooling2D((22)))
model.add(layers.Conv2D(64, (33), activation='relu'))
 
# 2차원 행렬을 다시 1차원으로 바꿔주는 코드, 결과 출력을 위한 레이어
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
 
# 모델 컴파일, 학습
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=2, batch_size=64)
model.evaluate(x_test, y_test)
cs

 

'AI' 카테고리의 다른 글

RNN(순환 신경망)  (0) 2021.03.31
DNN(심층신경망)  (0) 2021.03.29
Keras(케라스)  (0) 2021.03.28
Tensorflow(텐서플로우)  (0) 2021.03.28

문제에 접속하여 파일 목록을 보면 col과 flag, col.c 파일이 있고, flag 파일은 col 계정으로 읽을 권한이 없으며 col에 setuid가 걸려있기 때문에 col을 통해 flag파일을 읽을 수 있을 것 같다. col의 소스 파일은 다음과 같다.

hashcode 변수에 0x21DD09EC로 설정되어 있다.

check_password 함수를 보면 인자를 정수로 형변환하고 있고, 4번 반복하여 res에 하나씩 더한다. 정수형 변수이기 때문에 4바이트 이다. res = ip[0] + ip[1] + ip[2] + ip[3] + ip[4]로 총 20바이트가 된다.

프로그램을 실행할 때 인자가 없으면 usage로 시작하는 문자열이 출력되면서 종료되고, 인자 크기가 20이 아니면 passcode 가 꼭 20바이트가 되야 한다는 내용의 문자열이 출력되며 프로그램이 종료된다. 

hashcode의 값(0x21DD09EC)과 check_password 함수에 인자를 넣은 값이 같다면 시스템 함수로 flag 파일을 읽는다.

0x21DD09EC를 5로 나누면 0x6C5CEC8가 나오므로  0x6C5CEC8 * 4 + 0x6C5CECC 는 0x21DD09EC가 된다. col을 실행시키면서 저 값을 리틀 엔디언으로 넣으면 다음과 같이 플래그를 얻을 수 있다.

 

'Project H4C Study Group' 카테고리의 다른 글

[Project H4C][pwnable.kr] flag  (0) 2021.04.02
[Project H4C][pwnable.kr] bof  (0) 2021.04.01
[Project H4C][pwnable.kr] fd  (0) 2021.03.30
[Project H4C] FTZ 12  (0) 2021.03.29
[Project H4C] FTZ (8 ~11)  (0) 2021.03.27

+ Recent posts