728x90
728x90
728x90
728x90

DES

DES는 미국의 국가 안보국 NSA에서 IBM의 루시퍼 알고리즘을 개량하여 만든 대칭키 암호입니다.

DES는 루시퍼에서 128비트 키를 사용했던 것과 달리 키 길이를 56비트로 줄였고, 내부에서 사용하는 알고리즘도 일부 변경하였습니다.

미국 국립표준기술연구소 NIST는 DES를 1976년부터 2002년까지 표준 블록 암호로 인정했습니다만 현대에는 DES에 대한 공격 기법이 많이 연구되어 DES를 더이상 블록 암호의 표준으로 사용하지 않습니다.

 

DES는 혼돈 성질을 만족하기 위해 치환을, 확산 성질을 만족하기 위해 순열을 사용합니다.

치환과 순열을 매우 단순한 연산이므로 평문에 이들을 한 번 적용한다고 해서 암호학적 효과를 기대할 수는 없습니다. 그러나 이들을 여러 번 교차해서 반복 적용하면 혼돈과 확산의 성질을 모두 만족하게 된다고 알려져 있습니다.

이런 특성을 이용하여 치환이나 순열 같은 단순한 연산들로 한 라운드로 구성하고, 각 라운드를 여러 번 반복하여 암호학적 안전성을 확보하는 암호를 곱 암호(Product Cipher)라고 합니다.

 

DES는 8바이트(64비트)를 한 블록으로 하는 블록 암호이며, 전체 구조는 초기 순열, 최종 순열, 페이스텔 구조의 16 라운드, 그리고 각 라운드에 사용되는 48비트의 키를 생성하는 키 생성 함수(Key Generation)로 구성되어 있습니다.


DES 구조

 

페이스텔 구조

DES에서 라운드 함수를 적용하는 전체 과정은 페이스텔 구조를 이루고 있습니다.

페이스텔 구조는 데이터를 두부분으로 나누어 좌, 우 두부분에 교대로 비선형 변환을 적용시키는 구조를 말하며 이를 3단계로 나누면

입력으로 들어온 블록을 동일한 길이의 왼쪽 블록과 오른쪽 블록으로 나눕니다.

각 라운드마다 오른쪽 블록은 다음 라운드의 왼쪽 블록으로 입력됩니다.

왼쪽 블록은 오른쪽 블록에 라운드 함수를 적용한 결과와 xor되어 다음 라운드의 오른쪽 블록으로 입력됩니다.

 

수식으로 표현하면

1. \( L_{0} = P[:len(P)/2], R_{0} = P[len(P)/2:] \)

2. \( L_{n+1} = R_{n} \)

3. \( R_{n+1}​=L_{n} ​\bigoplus F(R_{n}, K_{n}​) \)

 

블록 암호는 평문을 복호화 할 수 있어야 하므로, 일반적으로 암호화를 구성하는 각 함수들에 역함수가 존재합니다.

그러나 페이스텔 구조를 사용하면 \(​\bigoplus\)의 특성상 역함수가 존재하지 않아도 됩니다.

또한 암호화와 복호화의 구조가 동일하므로, 암호화에 사용한 라운드 키를 역순으로 입력하면 복호화가 이뤄집니다.

한편, 오른쪽 블록은 다음 라운드의 왼쪽 블록으로 어떠한 처리도 없이 입력됩니다.

이런 특성으로 인해 페이스텔 암호는 비페이스텔 암호와 같은 안전성을 갖기 위해 두 배 정도 라운드를 사용해야한다는 단점이 있습니다.


Step1 초기 순열 & Step 3 최종 순열

DES는 시작할 때 초기 순열을, 마지막에는 최종 순열을 수행하며 초기 순열과 최종 순열은 서로 역관계에 있습니다.
임의의 64비트 데이터에 초기 순열을 적용하고, 최종 순열을 적용하면 입력 값이 그대로 출력됩니다.
초기 순열과 최종 순열은 정해진 테이블을 이용하여 64비트 입력을 비트 단위로 전치합니다.
테이블의 n번째 값이 m일 때, 출력의 n번째 비트는 입력의 m번째 비트가 됩니다.
초기 순열과 최종 순열은 각각 초기 순열 테이블과 최종 순열 테이블을 이용합니다.

IPT = [58, 50, 42, 34, 26, 18, 10, 2,
       60, 52, 44, 36, 28, 20, 12, 4,
       62, 54, 46, 38, 30, 22, 14, 6,
       64, 56, 48, 40, 32, 24, 16, 8,
       57, 49, 41, 33, 25, 17, 9, 1,
       59, 51, 43, 35, 27, 19, 11, 3,
       61, 53, 45, 37, 29, 21, 13, 5,
       63, 55, 47, 39, 31, 23, 15, 7]
FPT = [40, 8, 48, 16, 56, 24, 64, 32,
       39, 7, 47, 15, 55, 23, 63, 31,
       38, 6, 46, 14, 54, 22, 62, 30,
       37, 5, 45, 13, 53, 21, 61, 29,
       36, 4, 44, 12, 52, 20, 60, 28,
       35, 3, 43, 11, 51, 19, 59, 27,
       34, 2, 42, 10, 50, 18, 58, 26,
       33, 1, 41, 9, 49, 17, 57, 25]

 

Step2. 라운드 함수

라운드 함수에는 오른쪽 블록만 입력되므로, 입력의 길이는 32비트입니다. 라운드 함수는 확장 순열, 라운드 키 결합, 치환 테이블 그리고 고정 순열로 이루어져 있습니다.

 

Step 2.1. 확장 순열과 라운드 키 결합

확장 순열은 입력을 비트 단위로 전치하는 동시에, 전체 길이를 48비트로 확장합니다.

이 과정에서 32비트의 입력값을 4비트씩 8개의 부분으로 나누고, 테이블을 참조하여 각각을 6비트로 확장합니다.
이 과정은 테이블만 다를 뿐, 초기 순열, 최종 순열과 같은 방식으로 이뤄집니다.

라운드 키 결합은 확장 순열로 나온 출력을 라운드 키와 \(​\bigoplus\) xor 하는 것입니다.

 

Step2.2. S-Box와 고정 순열

S-Box는 라운드 키 결합에서 출력된 48비트 결과 값을 32비트로 축소합니다.

S-Box는 4개의 행과 16개의 열로 이루어진 표를 사용하는데, 표의 각 값은 4비트로 표현되는 수입니다.

S-Box가 적용되는 과정은 다음과 같습니다.

먼저, 입력을 6비트씩 8개의 부분으로 나눕니다. 여섯 비트 중 첫 번째와 마지막 비트로 행을 결정하고, 나머지 네 개의 비트로 열을 결정합니다. 그 뒤, S-Box의 표에서 행과 열을 참조하여 값을 반환합니다. DES에서는 여섯 비트로 자른 부분마다 다른 S-Box를 사용합니다.

S-Box로 길이를 축소하고 나면, 고정 순열(Straight P-Box)로 다시 비트 단위 전치가 이뤄집니다.


키 생성 함수

키 생성 함수는 64비트의 입력을 받아 각 라운드에 필요한 48비트 라운드 키를 생성하는 함수입니다. 

이 함수는 패리티 비트 제거, 쉬프트, 압축 순열로 구성되어 있습니다.

 

패리티 비트 제거

패리티 비트 제거는 입력에서 패리티 비트를 제거하고, 남은 56비트에 순열을 적용하는 과정입니다.

DES의 비밀키에서 각 바이트의 가장 오른쪽 비트는 자신이 속한 바이트의 나머지 7비트에 대한 홀수 패리티 비트입니다. 홀수 패리티 비트란 한 바이트를 이진수로 표현했을 때, 1의 개수가 홀수가 되도록 덧붙인 비트를 말합니다. 예를 들어, 1010101에는 1이 4개 있습니다. 홀수 패리티 비트를 적용하면 끝에 비트 1을 덧붙여서, 10101011을 전송해야 합니다.

패리티 비트는 통신 중에 비트 반전이 일어나지 않았음을 보증하는 역할을 합니다. 홀수 패리티 비트를 사용하여 통신할 때, 수신한 바이트 중 1의 갯수가 짝수인 바이트가 있다면 그 바이트에서 임의의 비트에 반전이 일어났음을 수신자가 알 수 있습니다. 이를 확인한 수신자는 손상되지 않은 데이터를 얻기 위해 재전송을 요구할 수 있습니다.

 

쉬프트

쉬프트는 입력을 왼쪽 28비트와 오른쪽 28비트로 나누어 각각을 1비트나 2비트만큼 왼쪽으로 순환 쉬프트하는 과정입니다. 1, 2, 9, 16 라운드에서는 1비트, 나머지 라운드에서는 2비트만큼 쉬프트합니다.

10101111을 왼쪽으로 1비트 순환 쉬프트하면, 왼쪽 끝의 비트가 오른쪽 끝으로 이동하여 01011111이 됩니다. 마찬가지로 2비트를 왼쪽으로 순환 쉬프트하면 왼쪽 끝의 '10'이 오른쪽으로 이동하여 10111110이 됩니다.

 

압축 순열

압축 순열은 56비트의 입력을 48비트 길이로 압축하는 과정입니다. 수행 방법은 앞서 설명한 순열들과 같습니다.


 

 

728x90
728x90

'암호학' 카테고리의 다른 글

중국인의 나머지 정리  (0) 2022.03.01
공개키암호 RSA  (0) 2022.02.06
블록암호 AES  (0) 2022.01.25
암호화 종류  (0) 2021.12.04
암호의 역사  (0) 2021.11.04
728x90
728x90

AES

AES는 연산 능력의 향상으로 DES가 더 이상 안전하지 않게 되자, 새롭게 표준으로 선정된 블록 암호 알고리즘입니다.
내부적인 논의만으로 표준으로 선정된 DES와 달리, AES는 전세계에서 암호 알고리즘을 공모받고, 전문가들의 심사를 거쳐 그 중에서 가장 뛰어난 알고리즘이 선정되었습니다.

당시 공모에 제안된 21개의 암호 알고리즘들 중, 보안성, 효율성, 하드웨어 이식의 적합성, 유연성 등을 고려하여 심사한 결과, Vincent Rijmen, Joan Daemen이 제안한 Rijndael 구조가 채택되었습니다.

표준으로 선정된 이후부터 지금까지, AES에는 기밀성을 위협하는 치명적인 취약점이 발견되지 않았습니다. 또한 CPU 제조사들이 AES 연산을 위한 명령어를 따로 정의해 주어서 암호화, 복호화의 성능도 뛰어납니다. 이런 이유로 현대에는 대칭키 암호 알고리즘을 사용할 때, 일반적으로 AES가 사용됩니다.

 

AES는 SPN(Substitution Permutation Network)이라는 암호 구조를 사용합니다. SPN은 곱 암호의 일종으로,

S-Box를 사용하는 치환(Substitution)과 P-Box를 사용하는 순열(Permutation)을 여러 라운드에 걸쳐 반복합니다.

페이스텔 구조와 달리 라운드마다 입력 전체에 라운드 함수를 적용하므로,

같은 수의 라운드를 사용할 때 SPN이 페이스텔 구조에 비해 암호학적으로 두 배 더 안전합니다.


AES 구조

AES는 라운드마다 128비트 크기의 블록을 암호화하는 블록 암호입니다.

키의 길이는 128, 192, 256비트 중 하나를 선택할 수 있고, 라운드 수는 키의 길이에 따라 10, 12, 14로 결정됩니다.

키의 길이가 128비트이면 AES-128, 192비트이면 AES-192, 256비트이면 AES-256이라고 부릅니다.


AES는 암호화를 할 때, 가장 먼저 각 블록을 4행 4열의 상태 배열(State)로 재구성합니다.

State의 각 칸에는 8비트(1바이트)가 저장됩니다.


입력 1F3CF203B211C5AA6EB27A45E4D98130은 다음과 같은 state로 재구성됩니다.

$$\begin{bmatrix} 1F&3C&F2&03\\B2&11&C5&AA\\6E&B2&7A&45\\E4&D9&81&30 \end{bmatrix}$$

이후에는 재구성된 입력에 대해 AddRoundKey 함수를 적용하고,

마지막 라운드 전까지 매 라운드마다 SubBytes, ShiftRows, MixColumns, AddRoundKey 함수를 반복하여 적용합니다.

마지막 라운드에서는 MixColumns를 제외한 나머지 함수들만 적용합니다.

 

AES의 라운드 함수들은 역함수가 존재하므로, 역함수를 이용하여 AES 복호화가 이뤄집니다.

이제부터는 라운드를 구성하는 각 함수들에 대해 알아보겠습니다.


AES 라운드 함수

SubBytes

SubBytes는 State의 각 바이트를 S-Box를 참조하여 치환하는 함수입니다. 바이트의 상위 4비트가 행, 하위 4비트가 열을 결정합니다. 예를 들어 어떤 바이트가 2A라면, 해당 바이트는 S-box의 2행 A열을 참조하여 E5로 치환됩니다.

$$SubBytes \begin{pmatrix}
\begin{bmatrix}
D7 & 32 & 97 & 71 \\
12 & AA & F2 & EC \\
04 & 00 & CA & F9 \\
5E & 13 & B1 & 16 \\
\end{bmatrix}
\end{pmatrix} = 
\begin{bmatrix}
0E & C9 & F2 & 58 \\
23 & AC & 63 & 7D \\
88 & 89 & 74 & C8 \\
A3 & CE & 99 & 47 \\
\end{bmatrix}$$

 

ShiftRows

ShiftRows는 State의 각 행을 구성하는 바이트들을 쉬프트하는 함수입니다. 이 함수는 4가지 함수 중에서 유일하게 순열의 역할을 수행합니다. 아래와 같이 2행은 왼쪽으로 1칸, 3행은 왼쪽으로 2칸, 4행은 왼쪽으로 3칸을 밉니다. 복호화할 때는 반대로 2행, 3행, 4행을 각각 오른쪽으로 1칸, 2칸, 3칸씩 밉니다.

$$ShiftRows \begin{pmatrix}
\begin{bmatrix}
AE & 72 & 3C & 7E \\
83 & 1A & 32 & D3 \\
97 & 18 & 6A & C1 \\
56 & 0C & 29 & 86 \\
\end{bmatrix}
\end{pmatrix} = 
\begin{bmatrix}
AE & 72 & 3C & 7E \\
1A & 32 & D3 & 83 \\
6A & C1 & 97 & 18 \\
86 & 56 & 0C & 29 \\
\end{bmatrix}$$

 

MixColumns

MixColumns는 열 단위로 치환을 수행하는 함수입니다.

$$\begin{bmatrix}
b_{0} \\
b_{1} \\
b_{2} \\
b_{3} \\
\end{bmatrix} = 
\begin{bmatrix}
02 & 03 & 01 & 01 \\
01 & 02 & 03 & 01 \\
01 & 01 & 02 & 03 \\
03 & 01 & 01 & 02 \\
\end{bmatrix}
\begin{bmatrix}
a_{0} \\
a_{1} \\
a_{2} \\
a_{3} \\
\end{bmatrix}$$

 

AddRoundKey

이 함수는 키 생성 함수(Key Schedule)로 생성된 라운드 키의 state를 각 바이트별로 XOR합니다. 복호화할 때는 XOR의 성질을 이용하여 동일한 키를 state에 XOR합니다.

$$AddRoundKey\begin{pmatrix}
state = 
\begin{bmatrix}
63 & A9 & 24 & 0D \\
5C & 2A & 74 & B6 \\
A3 & 30 & 5D & 11 \\
C5 & 2C & 34 & 7C \\
\end{bmatrix},
key = 
\begin{bmatrix}
21 & 3C & C5 & 71 \\
CC & 6A & 82 & C1 \\
75 & 20 & 53 & 9C \\
15 & 7C & 63 & 1E \\
\end{bmatrix}
\end{pmatrix} = 
\begin{bmatrix}
42 & 95 & E1 & 7C \\
90 & 40 & F6 & 77 \\
D6 & 10 & 0E & 8D \\
D0 & 50 & 57 & 62 \\
\end{bmatrix}$$


키 생성 함수는 입력된 키로부터 각 라운드에 쓰일 라운드 키를 생성합니다. AES는 암복호화를 시작할 때와 매 라운드마다 AddRoundKey를 적용합니다. 따라서 AES-128에서는 라운드 키가 11개 필요합 합니다.
각 라운드 키는 4행 4열의 행렬이므로, 4행 44열의 키 행렬을 하나 만들고, 이를 4열씩 나눠서 매 AddRoundKey마다 사용하면 됩니다.

첫번째 AddRoundKey에서는 입력된 키를 그대로 사용합니다.

\(w_{i\geq4}\)는 \(W_{i-1}\)에 RotWord, SubWord, Rcon을 적용하고, 이를 \(W_{i-4}\)와 XOR하여 생성합니다.


참고문헌

wikipedia - Advanced Encryption Standard

educative - What is the AES algorithm?

728x90
728x90

'암호학' 카테고리의 다른 글

중국인의 나머지 정리  (0) 2022.03.01
공개키암호 RSA  (0) 2022.02.06
블록암호 DES  (0) 2022.01.31
암호화 종류  (0) 2021.12.04
암호의 역사  (0) 2021.11.04

728x90
728x90

SSTI(Server Side Template Injection)

SSTI(Server Side Template Injection) 취약점은 서버측의 기본 템플릿 구문을 이용하여 악성 페이로드를 삽입, 실행되면서 생기는 취약점이며 웹 템플릿 엔진마다 사용되는 페이로드가 다릅니다.

 

웹 템플릿이란?

웹 템플릿 엔진은 웹 템플릿과 웹 컨텐츠 정보를 처리하는 목적으로 설계된 소프트웨어를 뜻합니다.

웹 서버를 구축할 때 코드에 자주 보이는 {{ content }}, {% content %} 이러한 형식으로 되어있는 대부분이 템플릿 엔진을 사용하기 위해 작성된 템플릿 구문입니다.

Flask 서버를 구축하여 index.html에 {{ 7*7 }}를 작성하고 render_template 메서드로 index.html 파일을 리턴하면 49라는 결과가 웹 페이지에 나오게되는 것 처럼 Flask에서도 템플릿 엔진을 사용하기 때문에 7*7 구문이 정상적으로 실행이 됩니다.

 

SSTI 취약점을 이용한 템플릿 구분

기본적으로 모든 서버는 제각각 다른 서버와 다른 템플릿을 사용하기 때문에 언어와 템플릿 엔진에 따라 취약점을 발생시키기 위한 페이로드가 달라지게 됩니다.

어떤 템플릿 엔진을 쓰고 있는지 알기 위해서는 하단의 사진 처럼 일일히 페이로드를 삽입하여 구별할 수 있습니다.

만약 에러가 나거나 원하는 대로 작동하지 않으면 밑으로, 잘 작동하면 위로 이동하면서 어떠한 템플릿을 사용하고 있는지 어떠한 페이로드를 사용해야되는지 빠르게 파악할 수 있습니다.

 

Flask.config

기본적으로 Flask의 경우 app.n에 들어가는 대부분의 정보들이 config 클래스에 들어가게 됩니다.

만약 app.secret_key에 중요한 정보를 넣었을 때 {{ config }} 해당 페이로드를 삽입하여 config 정보를 출력하게 만들면 app.secret_key에 들어간 중요한 정보들이 나오게 됩니다.


참고문헌

me2nuk - SSTI(Server Side Template Injection) 취약점이란?

728x90
728x90

'해킹' 카테고리의 다른 글

sql injection  (0) 2023.04.01
Cross Site Scripting (XSS)  (0) 2021.12.22
Same Origin Policy & Cross Origin Resource Sharing  (0) 2021.12.20
OWASP top 10 / 2021 업데이트 한글 번역  (0) 2021.11.22
구글 도크 (Feat. 디렉토리 리스팅)  (0) 2021.10.14
728x90
728x90

Cross Site Scripting (XSS)

XSS는 클라이언트 사이드 취약점 중 하나로, 공격자가 웹 리소스에 악성 스크립트를 삽입해 이용자의 웹 브라우저에서 해당 스크립트를 실행하여 세션 정보를 탈취하고 해당 계정으로 임의의 기능을 수행할 수 있습니다.

 

해당 취약점은 SOP 보안 정책이 등장하면서 서로 다른 오리진에서는 정보를 읽는 행위가 이전에 비해 힘들어졌습니다. 그러나 이를 우회하는 다양한 기술이 소개되면서 XSS 공격은 지속되고 있습니다.

더보기

Cross Site Scripting의 약어는 CSS라고 불리는 것이 옳습니다. 그러나 스타일시트를 정의하는 언어인 CSS와의 중복으로, 혼동되어 사용될 수 있기 때문에 XSS로 명명되었습니다.

 

XSS 종류

Stored XSS : XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS
Reflected XSS : XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS
DOM-based XSS : XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSS
Universal XSS : 클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로 SOP 정책을 우회하는 XSS

 

Stored XSS

대표적으로 게시물과 댓글에 악성 스크립트를 포함해 업로드하는 방식이 있습니다. 게시물은 불특정 다수에게 보여지기 때문에 해당 기능에서 XSS 취약점이 존재할 경우 높은 파급력을 가집니다.

 

Reflected XSS

대표적으로 게시판 서비스에서 작성된 게시물을 조회하기 위한 검색창에서 스크립트를 포함해 검색하는 방식이 있습니다. 이용자가 게시물을 검색하면 서버에서는 검색 결과를 이용자에게 반환합니다. 일부 서비스에서는 검색 결과를 응답에 포함하는데, 검색 문자열에 악성 스크립트가 포함되어 있다면 Reflected XSS가 발생할 수 있습니다.

Reflected XSS는 Stored XSS와는 다르게 URL과 같은 이용자의 요청에 의해 발생합니다. 따라서 공격을 위해서는 타 이용자에게 악성 스크립트가 포함된 링크에 접속하도록 유도해야 합니다. 이용자에게 링크를 직접 전달하는 방법은 악성 스크립트 포함 여부를 이용자가 눈치챌 수 있기 때문에 주로 Click Jacking 또는 Open Redirect 등 다른 취약점과 연계하여 사용합니다.


참고문헌

 

728x90
728x90

'해킹' 카테고리의 다른 글

sql injection  (0) 2023.04.01
SSTI 취약점  (0) 2022.01.11
Same Origin Policy & Cross Origin Resource Sharing  (0) 2021.12.20
OWASP top 10 / 2021 업데이트 한글 번역  (0) 2021.11.22
구글 도크 (Feat. 디렉토리 리스팅)  (0) 2021.10.14
728x90
728x90

Same Origin Policy

한 출처로 로드된 문서 또는 스크립트가 다른 출처의 리소스와 상호 작용을 제한하는 보안 메커니즘

 

쿠키에는 인증 정보가 보관되며, 브라우저 내부에 저장됩니다. 그리고 웹 서비스에 접속할 때 브라우저는 쿠키를 헤더에 포함시켜 요청을 보냅니다. 이 덕분에 우리는 한 번 로그인하면 일정 기간동안 로그인하지 않고 바로 서비스를 사용할 수 있습니다.

 

하지만 이용자가 악의적인 페이지를 접속했을 때, 페이지가 자바스크립트를 사용해 SNS 웹 서비스로 요청을 보낸다면 브라우저는 헤더에 해당 웹 서비스 쿠키를 포함시킬 것이고 페이지는 로그인 된 이용자의 SNS로 응답을 받을 것입니다. 이렇게 되면 해커는 마음대로 페이지 사용자의 SNS에 글을 올리거나, 삭제하고, SNS 메신저를 읽는 것이 가능하게 될 것입니다.

이와 같은 문제를 방지하기 위해 동일 출처 정책, Same Origin Policy (SOP) 보안 메커니즘이 탄생했습니다.

Origin

URL구조

URL 구조에서 프로토콜 (Protocol, Scheme), 호스트 (Host), 포트 (Port)가 같으면 Same Origin

https://caffeine-melon.tistory.com의 경우

Scheme : "https:"

host: "caffeine-melon.tistory.com"
port: "443"

URL 결과 이유
https://caffeine-melon.tistory.com/manage/ Same Origin /manage/          Path만 다름
http://same-origin.com/frame.html Cross Origin "https" != "http"  Scheme 다름
https://cross.same-origin.com Cross Origin caffeine-melon.tistory.com !=
cross.same-origin.com         Host 다름
https://caffeine-melon.tistory.com:1234 Cross Origin 443 != 1234        Port 다름

 

Same Origin Policy은 같은 Origin일 경우에만 리소스를 요청하고 사용할 수 있습니다.


Cross Origin Resource Sharing (CORS)

Origin이 다르더라도 서로 리소스를 공유해야하는 상황이 생기기 마련이다.

예를 들어 수신한 메일의 개수를 메인 페이지에 출력하려면 메인 페이지(https://www.naver.com)에서 메일 서비스(https://mail.naver.com)에 관련된 리소스를 요청해야 한다.

이 때, 두 사이트는 오리진이 다르므로 SOP를 적용받지 않고 리소스를 공유할 방법이 필요합니다.

 

CORS는 HTTP 헤더에 기반하여 Cross Origin 간에 리소스를 공유하는 방법입니다. 발신측에서 CORS 헤더를 설정해 요청하면, 수신측에서 헤더를 구분해 정해진 규칙에 맞게 데이터를 가져갈 수 있도록 설정합니다.


참고문헌

mozilla - Same-origin policy

mozilla - Cross Origin Resource Sharing

728x90
728x90

'해킹' 카테고리의 다른 글

sql injection  (0) 2023.04.01
SSTI 취약점  (0) 2022.01.11
Cross Site Scripting (XSS)  (0) 2021.12.22
OWASP top 10 / 2021 업데이트 한글 번역  (0) 2021.11.22
구글 도크 (Feat. 디렉토리 리스팅)  (0) 2021.10.14
728x90
728x90

mov dest, src

src에 있는 데이터가 dest로 복사된다. 이때, 두 피연산자의 크기가 같아야 한다.

예를 들어, AX(16 비트)에 있는 값을 BL(8 비트)로 저장될 수 없다.
mov bx, ax : bx = ax

 

lea dst, addr

lea명령어는 Load Effective Address로, dst에 주소(addr)를 저장한다.

lea dst, addr : dst = addr

 

inc dst : dst값 1 증가

dec dst : dst값 1 감소
neg dst : dst = dst값의 부호 변경
not dst : dst = dst값 비트 반전

 

add dst, src : dst += src
sub dst, src : dst -= src
imul dst, src : dst *= src
and dst, src : dst &= src
or dst, src : dst |= src
xor dst, src : dst ^= src


shl dst, k : dst << k
shr dst, k : dst >> k
sal dst, k : dst << k 
sar dst, k : dst >> k

 

test dst, src

AND 논리 연산을 하지만, 결괏값을 피연산자에 저장하지 않는다.

test rax, rax : ZF=1 if rax = 0
                : SF=1 if rax < 0

test의 연산 결과는 FLAGS 레지스터에 저장된다. 두 피연산자의 AND 연산 결과가 음수이면(최상위 비트가 1이면) SF에 1을, 0이면 ZF에 1을 저장한다.

 

cmp dst, src

dst에서 src를 빼지만, 그 결괏값이 FLAGS 레지스터의 ZF와 CF 플래그에 영향을 미친다는 점에서 test와 유사하다.
dst=src일 때에는 ZF=1, CF=0이 되고, dst<src일 때에는 ZF=0, CF=1, 반대로 dst>src일 때에는 ZF=0, CF=0이 된다.

cmp rax, rdi : ZF=1 if rax = rdi
                : ZF=0 if rax != rdi
                : CF=1 if rax < rdi
                : CF=0 if rax > rdi

 

더보기

CF(Carry Flag) : 연산 수행하면서 자리올림(carry), 자리 내림(borrow) 발생하면 1이 된다.
                     unsigned 변수의 오퍼 플로우 발생 시 1로 세팅된다.
ZF(Zero Flag) : 연산 결과가 0이면 1로 세팅됨. if문 같은 조건문 만족 시 세팅된다.

PF(Parity Flag) : 패리티 체크하는 데 사용된다.
                     연산 결과 최하위 바이트의 값이 짝수일 경우에 1이 된다.
AF(Adjust Flag) : 연산결과 carry나 borrow가 3bit 이상 발생할 경우 1이 된다.
SF(Sign Flag) : 연산 결과 최상위 비트 값과 같다. Signed 변수일 경우, 양수이면 0, 음수이면 1이다.
OF(Overflow Flag) : Signed(부호 있는) 변수의 오버플로우가 발생했을 때, 1로 세팅된다. MSB(최상위 비트)가 변경될 때, 1로 세팅된다.
DF(Direction Flag) : 문자열 처리할 때, 1일 경우 문자열 처리 instruction이 자동으로 감소, 0일 경우 자동으로 증가한다.

 

jmp, jcc

jmp는 피연산자가 가리키는 곳으로 점프하는 명령어이다. jmp은 무조건 점프하고 jcc는 조건에 따라 점프를 한다는 차이가 있다. jcc는 명령어를 수행하기 전에 산술 연산을 하거나, test, cmp명령어로 바뀐 플래그를 바탕으로 점프의 수행 여부를 결정한다. jcc는 명령어가 아니라 je, jne, jg, jge, jl, jle 등 조건부 jmp를 묶어서 이르는 말이다.

jmp location
je location : equal (ZF=1)
jne location : not equal (ZF=0)
jg location : > signed
jge location : >= signed
jl location : < signed
jle location : <= signed
ja location : > unsigned
jb location : < unsigned
js location : negative (SF=1)
jns location : not negative (SF=0)

 

cmp dword ptr [rbp-0x2c], 0x47
jle   400a31

rbp 레지스터가 가리키는 주소에서 -0x2c만큼 떨어진 곳에 들어있는 값과 0x47을 비교하여, 이 값이 0x47보다 작거나 같으면(less or equal) 0x400a31로 점프한다.

 

push, pop

push와 pop 명령어는 스택에 새로운 데이터를 추가하거나 뺄 때 사용한다.

push rdi : sub rsp, 8
           : mov [rsp], rdi
스택에 새로운 데이터를 넣는 명령어는 push. 새로운 데이터가 들어가면 rsp 레지스터도 새로운 데이터가 들어간 주소를 가리켜야 하므로 rsp가 가리키는 주소에서 들어갈 데이터의 사이즈만큼 빼서 (sub rsp, 8) 데이터가 들어갈 크기를 확보한 뒤 데이터를 복사하는 과정(mov [rsp], rdi)과 동일하다.

 

pop rdi : mov rdi, [rsp]
           : add rsp, 8

pop은 push와 반대로 스택의 최상단에 있는 데이터를 빼내는 명령어이므로, 그 반대 순서로 진행하는 것과 동일한 효과이다.


참고문헌

 

 

728x90
728x90

'어셈블리어' 카테고리의 다른 글

어셈블리어 [2] 범용 레지스터  (0) 2021.11.16
어셈블리어 [1] 기초  (0) 2021.10.20
728x90
728x90