NCS보안3기/암호2017. 3. 27. 23:22

- 블록암호는 평문 블록 전체를 가지고 동일한 길이의 암호문을 블록을 생성하는 암/복호화 방식

- 많은 블록암호가 Feistel 구조를 띄고 있다.

* 동일한 라운드 수로 구성되어 동작

* 각 라운드는 데이터의 절반이 치환으로 수행, 이후 데이터의 두 개의 반을 교환하는 순열 수행

* 원본의 키는 확장되어 각 라운드마다 다르게 사용


1. 스트림 암호

- 한번에 1비트 혹은 1바이트의 디지털 데이터 스트림을 암호화한다.

- 키 스트림은 평문 비트 스트림 만큼의 길이를 갖는다.




2. 블록 암호

- 평문 블록 전체를 가지고 같은 크기의 암호문 블록 생성한다.

- 전형적으로 64비트 또는 128비트를 사용한다.


3. Feistel 암호 구조의 동기

- 블록암호는 n비트 암호문 블록을 생성하기 위해 n비트 평문 블록을 이용하여 연산한다.

- 2ⁿ 가지의 서로 다른 평문 블록이 존재한다.

- n비트-n비트 블록치환 (n = 4인 경우)

  -> 4비트 입력으로 16개 값 중 하나 선택하고, 내부 치환에 의하여 16개 출력 값 중 하나에 대응하여 4비트 출력


4. 블록 암호의 원리

- 두 개이상의 기본 암호 연속적 수행(치환, 순열 번갈아 수행)

- 치환 : 평문의 각 원소 또는 원소의 그룹을 다른 원소에 사상

- 순열 : 평문 원소의 순서는 순열의 순서대로 재배치

- 확산과 혼돈 : 통계적 분석에 기초한 암호 해독 방지

- 확산 : 평문의 통계적 구조가 암호문에 광범위하게 분산(평문과 암호문 관계 복잡)

     각 평문 숫자가 다수의 암호문 숫자 값에 영향

- 혼돈 : 암호문의 통계적 구조와 암호 키 값 사이의 관계 복잡

     키를 이용한 암호문 생성 방법 복잡(키 추론 어려움)


5. Feistel 암호 구조

- 처리구조

* 길이 2w 비트인 평문 블록(L0, R0) 분할처리

* K로부터 유도된 n개의 키(ki) 사용

* n회의 동일한 반복 구조 실행

- 하나의 반복 구조

* 오른쪽 반 R0에 반복함수 F 적용

반복 서브키 K1 적용(K ≠ Ki)

* 왼쪽 반 L0와 XOR(치환 작용)

* 좌우 양쪽 결과를 교환(순열 작용)


* Feistel 암호 설계의 고려사항

- 빠른 소프트웨어 암/복호화

* 어플리케이션 또는 유틸리티 함수에 내재

* 알고리즘의 실행속도가 중요

- 분석의 용이성

* 암호 해독의 취약성에 대한 알고리즘의 분석이 쉬움

* 고도의 신뢰성과 보안 강도를 위한 개발 용이


6. 설계 특성

- 블록 크기(64비트)

* 큰 블록은 보안 강화하지만 암/복호 속도는 저하

* 암/복호 속도를 고려 64비트 일반적

- 키 크기(128비트)

* 큰 키는 보안 강화하지만 암/복호화 속도는 저하

* 암/복호 속도를 고려하여 128비트 일반적(64비트 이하는 해독 용이)

- 반복 수

* 다중 반복과정은 보안성 강화

* 16회 반복이 일반적

- 서브키 생성 알고리즘

* 서브키 생성 방법이 복잡할수록 강력

- 반복함수

* 적용되는 반복함수가 복잡할수록 강력


7. Feistel 복호 알고리즘

- 암호화와 복호화에 같은키 사용을 위하여 서브키 ki를 역순으로 사용


8. DES(Data Encryption Standard)

* 특징

- 1977년 미국 표준국에서 미 연방 정보처리 표준46으로 채택

- 64비트 블록 암호 알고리즘

- 56비트 키를 사용

* 64비트 중 8비트는 parity check로 사용

- 기본구조

* round 수 : 16 round

* 복호화는 암호화의 역순

- 최근에는 DES암호화를 세 개의 키로 세 번 반복함으로써 암호의 강도를 높인 Triple-DES를 사용


9. DES 암호화

- 64비트 순열 입력

- 56비트 키 사용




- 초기 순열


- S-Box



* DES의 복호화 알고리즘

- 암호화 알고리즘을 동일하게 적용

- 부분키 ki는 역으로 적용시킨다.


* 쇄도 효과 (avalanche effect)

- 평문 또는 키 값의 소량의 변화가 암호문에 매우 큰 변화를 가져와야 한다.


10. DES의 운영모드

* ECB 모드

- 특징

* 에러 전이 없음

* 하나의 평문을 한 번 암호화 사용 권고됨

* 세션키 암호화와 강티 애무 특별한 용도로만 사용

* 암호화, 복호화 병렬처리 가능

- 단점

* 동일 암호문은 동일한 평문 생성

* Database 응용에 부적당

- 암호화와 복호화


* CBC 모드

- 특징

* 에러전이 발생

* 초기치는 메시지별로 선택, 비밀일 필요는 없으나 무결성 요구됨

* 암호화시 암호문 블록에 에러가 발생하면 이후의 모든 암호문에 에러 발생

* 복호화 병렬처리 가능

* 인증에 사용


- 암호화와 복호화


* CFB 모드

- 특징

* 문자나 비트 단위 취급( 통신프로토콜 하위계층 )

* 암호화 과정만 필요

* 복호화는 병렬처리 가능

- 암호화와 복호화


* OFB 모드

- 특징

* 에러전이 없음 ( 암호문 1비트 에러는 평문 1비트 에러 )

* 키 수열은 평문과 무관( 사전계산 가능 ), 스트림 암호로 사용

* 키 수열의 동기화 필수적

* 위성과 같은 noisy 채널에 사용

- 암호화와 복호화




'NCS보안3기 > 암호' 카테고리의 다른 글

[Encryption] 해쉬 함수  (0) 2017.03.28
[Encryption] 고전 암호 기법  (0) 2017.03.27
[Encryption] 컴퓨터 보안과 암호  (0) 2017.03.27
Posted by Imp3rio
NCS보안3기/암호2017. 3. 27. 17:46

- 대칭암호 : 암호화와 복호화 과정에 동일한 키를 사용하는 암호 시스템.

- 대칭 암호는 비밀키와 암호화 알고리즘을 사용하여 평문을 암호문으로 바꾼다. 또한 동일한 키와 복호화 알고리즘을 사용하여 암호문으로부터 평문을 얻는다.

- 암호 알고리즘의 두가지 공격혀애

1. 암호 알고리즘의 특성에 기반을 둔 암호 분석학

2. 모든 가능한 키 값을 사용하는 전사적 공격

- 회전자 기계 : 치환 기법을 사용하는 정교하게 미리 계산된 하드웨어 장치

- 스테가노 그래파 : 어떤 규모가 큰 대상에 비밀 메시지를 숨기는 기법


* 대칭 암호 방식의 구성 요소


- 평문( Plaintext )

- 암호 알고리즘( Encryption algorithm )

- 비밀키( Secret key)

- 암호문( Ciphertext )

- 복호 알고리즘( Decryption algorithm )


* 암호문 Y, 메시지( 평문 ) X, 암호키 K 일때:


* 암호 시스템의 특성

- 평문을 암호문으로 변환하는데 사용되는 동작

- 치환

- 전치

- 사용한 키의 수

- Single key : 대칭키/비밀키 암호, 관용 암호

- Two-key : 비대칭키/공개키 암호

- 평문이 처리되는 방법

- 블록 암호

- 스트림 암호


* 암호 해독 및 전사적 공격

- 암호 해독

암호 알고리즘 본질에 대한 공격

평문-암호문쌍에 대한 지식 등을 활용한 평문 혹은 키 값 추론 공격

- 전사적 공격

특정 암호문에 대해 이해할 수 있는 평문으로 전환될 때까지 모든 키에 대해 시도함


* 절대 안전성 vs 계산상 안전성

- 절대 안전성

해당 암호 기법으로 생성된 암호문을 아무리 많이 사용하더라도 해당 암호문에 평문을 알아낼 수 있는 충분한 정보를 포함하지 않을 경우

One-time pad

- 계산상 안전성

아래 두 가지 조건을 만족할 경우

1. 암호 해독 비용이 암호화된 정보의 가치 초과

2. 암호 해독 시간이 정보의 유효 기간 초과


* 치환 기법

- 치환 기법과 전치는 모든 암호 기술의 기초

- 치환 암호 방식

평문의 문자( 비트열 )를 다른 문자( 비트열 ), 숫자 혹은 심벌로 바꿈

Caesar 암호가 대표적


* Caesar 암호

- 각 알파뱃 문자를 두 문자 건너의 알파뱃 문자로 치환

- 각 문자에 대해 아래와 같은 숫자 배정

- caesar 함호의 암호화 알고리즘은 다음 수식으로 표현 가능

C = E(3,p) = (p + 3)mod 26

- 키 값을 일반화 하면 다음과 같음

C = E(k,p) = (p + k)mod 26    1 ≤ k ≤ 25

- 복호화 알고리즘

p = D(k,C) = (C - k)mod 26


- 암호화 및 복호화 알고리즘을 알고 있다.

- 가능한 키는 25개뿐이다.

- 평문의 언어를 알고 있으며 쉽게 인식 가능 --> 전사적 키 해독 기법에 취약


* 단일 문자 치환 암호 기법

- 각 평문 문자를 임의의 문자로 치환하는 경우

- 총 가능한 키의 수: 26! 


* 단일 문자 치환 암호 기법에 대한 공격

- 평문의 특성( 언어의 규칙성 )을 사용한 공격 기법


* Playfair 암호

- 다중문자 치환 암호 기법

- 단일 문자가 아닌 다중 문자를 암호화 함으로써 안전도 높임

- 특정 키워드를 기반으로 하여 5X5 matrix 만듦

- 해당 키워드를 사용하여 matrix를 채우고 해당 키워드를 구성하는 문자가 아닌 다른 문자로 나머지 matrix 공간을 채움

- Ex) 키워드가 MONARCHY 인 경우

* Playfair 암호화 방법

1. 평문을 2개의 알파뱃 묶음으로 나눈다.

2. 묶어진 두개의 알파뱃을 위에 만든 행렬로 치환한다.

 - 묶인 두 개의 알파뱃이 같은 행에 있을 경우, 오른쪽으로 한칸씩 shift한다.

 - 묶인 두 개의 알파뱃이 사각형을 그릴 경우, 그 사각형을 기준으로 왼쪽과 오른쪽에 있는 알파뱃으로 치환한다.

 - 묶인 두 개의 알파뱃이 같은 열에 있을 경우, 아래쪽으로 한칸씩 shift한다.


* Playfair 암호 분석

- 보안수준 : 26 X 26 = 676

- 단일 문자 암호보다 상대적으로 공격하기 어려움


* Hill 암호

- 동작 원리

m개의 평문을 m개의 암호문으로 치환한다.

이때, m개의 선형 방정식에 의해 치환된다.

m = 3인 경우 다음과 같은 선형 방정식을 생각할 수 있다.


이를 matrix로 표현하면 다음과 같다. 즉, C = PK mod 26


* 다중 문자 암호

- 평문에 대해 서로 다른 방식의 단일 문자 치환 기법 사용

- Ex: Vigenere 암호 기법


예 : keyword deceptive



* Vernam 암호

- 암호학적 공격에 안전하기 위해선 평문과 동일한 길이의 키를 가져야 하며, 평문과 통계적 연관성이 없어야 한다.


* One Time Pad 암호

- J.Mauborgne는 random한 key 값을 사용하면서 메시지 길이와 동일한 key를 가정한다.

- One Time Pad는 perfect security를 제공하지만 다음과 같은 문제점을 갖는다.

1. 대용량의 random한 key를 다루기 어렵다.

2. key 분배 및 보호의 문제가 발생한다.


* 전치 기법

* Rail fence 기법

- 평문을 대각선으로 쓰고 열로 읽음


* Row Transposition 기법

- 열 순으로 읽으면서, 열의 순서를 바꿈 ( 열의 순서 : 키 )

'NCS보안3기 > 암호' 카테고리의 다른 글

[Encryption] 해쉬 함수  (0) 2017.03.28
[Encryption] 블록암호와 DES  (0) 2017.03.27
[Encryption] 컴퓨터 보안과 암호  (0) 2017.03.27
Posted by Imp3rio
NCS보안3기/암호2017. 3. 27. 17:26

1. 컴퓨터 보안 개념


* 컴퓨터 보안에 대한 정의(NIST95)

- 정보 시스템 자원( 하드웨어나 소프트웨어, 펌웨어, 정보/데이터, 통신 )에 대한 무결성과 가용성, 기밀성 유지와 같은 목적을 달성을 위해 자동화된 정보시스템에 적용되는 보호


* 컴퓨터 보안의 세가지 주요 목적

1. 기밀성( Confidentiality )

- 데이터 기밀성 : 개인적이거나 비밀스러운 정보를 권한이 없는 자에게 노출되거나 소유할 수 없도록 한다. 


- 프라이버시 : 개인과 관련된 어떤 정보가 수집 및 저장되는지, 그리고 누구에 의해 누구에게 해당.정보가 노출되는지를 통제하거나 영향력을 발휘할 수 있도록 한다.


  --> 권한이 있는 경우에만 개인 프라이버시와 사설 정보보호를 포함하는 정보에 대한 접근과 노출을 허용한다.

기밀성 손실 : 정보에 대한 불법적 노출을 의미한다.


2. 무결성( Integrity )

- 데이터 무결성 : 정보와 프로그램이 오직 특정 인가된 방법에 의해서만 변경될 수 있도록 보장한다.


- 시스템 무결성 : 시스템이 원하는 기능을 손상되지 않은 형태로 수행되거나 고의적 혹은 우연에 의해 시스템에 대한 비인가 조작없이 원하는 기능을 수행할 수 있도록 보장한다.


  --> 정보에 대한 부인방지와 진정성 뿐만 아니라, 부적절한 정보 수정 및 파괴를 방지하는 것을 의미한다.

무결성 손실 : 메시지에 대한 불법적 수정과 파괴를 의미한다. 


3. 가용성( Availability )

- 시스템이 적절한 시점에 동작할 수 있도록 하며, 인가된 사용자에게는 서비스가 잘 제공되도록 보장한다.


  --> 정보를 적시에 그리고 안정된 접근 및 사용을 보장한다.

가용성 손실 : 정보 혹은 정보 시스템에 대한 접근 실패 혹은 사용 실패를 의미한다.


* OSI 보안 구조

- 보안 요구사항에 대한 정의와 요구 사항을 만족하기 위한 체계적인 접근방법이다.

- ITU-Y X.800에서 정의

- 세가지 주요 구성

1. 보안 공격( Security Attack )

- 조직이 소유한 정보의 안정성을 손상시키는 제반 행위


2. 보안 기법( Security Mechanism )

- 보안 공격을 탐지, 예방하고 그로부터 복구하기 위한 제반 기법


3. 보안 서비스( Security Service )

- 조직의 데이터 처리 시스템 및 정보 전송에 대한 보안을 강화하기 위한 제반 서비스


* 보안 공격( Security Attack )

- 소극적 공격( passive attack )

전송 정보에 대한 도청 및 감시를 의미한다.

공격자는 전송중인 정보를 취득한다.

소극적 공격의 유형으로는 메시지 내용 공개와 트래픽 분석이 있다.


- 적극적 공격( active attack )

데이터 스트림의 불법 수정이나 거짓 데이터 스트림 생성

적극적 공격의 유형으로는 신분 위장, 재전송, 메시지 불법 수정, 서비스 거부 공격이 있다.


* 보안 서비스( Security Services )

- X.800은 통신 시스템의 프로토콜 계층에서 제공되는 하나의 서비스로서, 보안 기능을 정의한다.

- 5개 영역

인증, 접근제어, 데이터 기밀성, 데이터 무결성, 부인방지

- 14개 세부 서비스

- 대등개체 인증, 데이터 근원 인증

- 접근 제어

- 연결형 기밀성, 비연결형 기밀성, 선택 영역 기밀성, 트래픽 흐름 기밀성

- 복구 기능이 있는 연결형 무결성, 복구 기능이 없는 연결형 무결성, 선택 영역 연결형 무결성, 비연결형 무결성, 선태 영역 비연결 무결성

- 출발지 부인 방지, 목적지 부인 방지


* 보안 메커니즘( Security Mechanism )

- 특정 프로토콜에 구현되는 보안 메커니즘

- 암호화

- 디지털 서명

- 접근 제어

- 데이터 무결성

- 인증 교환

- 트래픽 패딩

- 라우팅 제어

- 공증

- 특정한 프로토콜 계층이나 보안 서비스에 관련이 없는 메커니즘

- 신뢰할 수 있는 기능

- 보안 레이블

- 이벤트 탐지

- 보안 감사 추적

- 보안 복구


* 네트워크 보안 모델



'NCS보안3기 > 암호' 카테고리의 다른 글

[Encryption] 해쉬 함수  (0) 2017.03.28
[Encryption] 블록암호와 DES  (0) 2017.03.27
[Encryption] 고전 암호 기법  (0) 2017.03.27
Posted by Imp3rio

1. OSI 7계층



- 응용프로그램 계층 (Application Layer) 

사용자가 네트워크에 접근할 수 있도록 해주는 계층. 사용자 인터페이스, 전자우편, 데이터베이스 관리 등 서비스를 제공한다.

- 표현 계층 (Presentation Layer)

운영체제의 한 부분으로 입력 또는 출력되는 데이터를 하나의 표현 형태로 변환한다. 필요한 번역을 수행하여 두 장치가 일관되게 전송 데이터를 서로 이해할 수 있도록 한다.

- 세션 계층 (Session Layer)

통신 세션을 구성하는 계층으로, 포트 연결이라고도 할 수 있다. 통신장치 간의 상호작용을 설정하고 유지하며 동기화한다.

- 전송 계층 (Transport Layer)

전체 메시지를 발신지 대 목적지(종단 대 종단)간 제어와 에러를 관리한다. 패킷들의 전송이 유효한지 확인하고 실패한 패킷은 다시 보내는 등 신뢰성 있는 통신을 보장하며, 머리말에는 세그먼트가 포함된다.

- 네트워크 계층 (Network Layer)

다중 네트워크 링크에서 패킷을 발신지로부터 목적지로 전달할 책임을 갖는다. 2계층은 노드 대 노드 전달을 감독하는 것이고 3계층은 각 패킷이 시작 시점에서 최종 목적지까지 성공적이고 효과적으로 전달되도록 한다.

- 데이터 링크 계층 (Data Link Layer)

오류없이 한 장치에서 다른 장치로 프레임을 전달하는 역할. 스위치 같은 장비의 경우 MAC 주소를 이용하여 정확한 장치로 정보 전달. 3계층에서 정보를 받아 주소와 제어정보를 시작(헤더)와 끝(테일)에 추가

- 물리 계층 (Physical Layer)

물리적 매체를 통해 비트흐름을 전송하기 위해 요구되는 기능들을 조정. 케이블, 연결 장치 등과 같은 기본적인 물리적 연결기의 전기적 명세를 정하고 네트워크의 두 노드를 물리적으로 연결시켜주는 신호방식을 다룸


* 물리 계층 (Physical Layer)



- 기능 : 전기적, 기계적 특성을 이용하여 통신 케이블로 전기적 신호를 전송한다.

- 비트, 1/0의 인코딩 전압 및 케이블 사양 핀의 수 등을 정의한 계층이다.

- 단지 데이터 전달의 역할을 한다.

- 1계층의 장비로는 케이블, 리피터, 허브가 있다.


* 데이터 링크 계층 (Dtat-Link Layer)

- 기능 : 물리적인 연결을 통하여 인접한 두 장치간의 신뢰성 있는 정보 전송을 담당한다.

- 프레임은 2계층에서의 전송단위이며, 주소와 제어정보를 가지고 있다.

- 정보의 오류와 흐름을 관리하여 안정된 정보를 전달한다.

- 2계층 장비로는 비리지와 스위치가 있다.


* 네트워크 계층 (Network Layer)



- 기능 : 중계 노드를 통하여 전송하는 경우 어떻게 중계할 것인가를 규정한다.

- 패킷은 3계층 전송단위이며, 패킷을 목적지까지 경로 설정을 한다.

- 데이터를 목적지까지 가장 안전하고 빠르게 전달하도록 한다. 이것을 라우팅이라 한다.

- 3계층 장비는 라우터와 L3 스위치가 있다.


* 전송 계층 (Transport Layer)


- 기능 : 종단 간(End-to-End)에 신뢰성 있고 정확한 데이터 전송을 담당한다.

- 4계층에서 전송되는 단위는 세그먼트이며, 종단 간의 에러복구와 흐름제어를 담당한다.

- 4계층 장비로 L4 스위치를 두는 경우가 있는데, 3계층에서 온 트래픽을 분석하여 서비스 종류를 구분해주는 역할을 한다.


* 세션 계층 (Session Layer)



- 기능 : 통신장치 간 상호작용 및 동기화를 제공한다.

- 연결 세션에서 데이터 교환과 에러 발생 시의 복구를 관리한다. 즉, 논리적 연결을 담당한다.

- 포트를 생각할 수 있으나, 4계층과 5계층의 경계 사이의 모호한 위치이다.


* 표현 계층 (Presentation Layer)


- 기능 : 데이터 표현에 차이가 있는 응용처리에서의 제어 구조를 제공한다.

- 데이터 표현의 차이란 ASCII, JPEG, MPEG 등의 번역을 말한다.

- 전송하는 데이터의 인코딩, 암호화, 코드 변환 등을 수행한다.


* 응용 계층 (Application Layer)


- 기능 : 응용 프로세스 간의 정보 교환

- 사용자와 가장 밀접한 계층이며, 인터페이스 역할을 한다.


* 데이터 패킷 구성



Application 계층에서 데이터를 생성해 Transport 계층으로 보낸다. 이때 데이터를 자르고(Segmentation) 각 데이터 앞에 TCP 헤더를 붙여 네트워크 계층에 보낸다. 네트워크 계층에서는 각 패킷에 앞에 출발지 주소와 목적지 주소에 대한 정보 등을 앞에 붙인다(IP 헤더). 그리고 데이터 링크 계층으로 보내며 이 계층에서는 MAC 주소를 앞에, CRC 코드를 뒤에 붙여 물리계층으로 보낸다.

MAC 주소는 다음에 보낼 곳(라우터) 의 주소를 갖는다. CRC 코드는 데이터에 문제가 있는지를 판단하는 코드이다.



Posted by Imp3rio

파이썬은 1991년 프로그래머인 귀도 반 로섬이 발표한 고급 프로그래밍 언어로, 플랫폼 독립적이며 인터프리터식, 객체지향적, 동적 타이핑 대화형 언어이다.

파이썬은 비영리의 파이썬 소프트웨어 재단이 관리하는 개방형, 공동체 기반 개발 모델을 가지고 있다. C언어로 구현된 C파이썬 구현이 사실상의 표준이다.


1. 개요

파이썬은 초보자부터 전문가까지 사용자층을 보유하고 있다. 동적 타이핑 범용 프로그래밍 언어로, 펄 및 루비와 자주 비교된다. 다양한 플랫폼에서 쓸 수 있고, 라이브러리(모듈)가 풍부하여, 대학을 비롯한 여러 교육 기관, 연구 기관 및 산업계에서 이용이 증가하고 있다. 또 파이썬은 순수한 프로그램 언어로서의 기능 외에도 다른 언어로 쓰인 모듈들을 연결하는 풀언어(glue language)로써 자주 이용된다. 실제 파이썬은 많은 상용 프로그램에서 스크립트 언어로 채용되고 있다. 도움말 문서도 정리가 잘 되어 있으며, 유니코드 문자열을 지원해서 다양한 언어의 문자 처리에도 능하다.


2. 특징

- 파이썬은 인간다운 언어이다.

프로그래밍이란 이낙ㄴ이 생각하는 것을 컴퓨터에 지시하는 행위라고 할 수 있다. 파이썬은 사람이 생각하는 방식을 그대로 표현할 수 있는 언어이다. 따라서 프로그래머는 굳이 컴퓨터의 사고 체계에 맞추어서 프로그래밍을 하려고 애쓸 필요가 없다.


- 파이썬은 문법이 쉬워 빠르게 배울 수 있다.

파이썬은 문법 자체가 아주 쉽고 간결하며 사람의 사고 체계와 매우 닮아 있다. 유명한 프로그래머인 에릭 레이먼드(Eric Raymond)는 파이썬을 공부한 지 단 하루 만에 자신이 원하는 프로그램을 작성할 수 있었다고 한다.


- 파이썬은 무료이지만 강력하다

오픈 소스인 파이썬은 당연히 무료이다. 사용료 걱정없이 언제 어디서든 파이썬을 다운로드하여 사용할 수 있다.

또한 프로그래머는 만들고자 하는 프로그램의 대부분을 파이썬으로 만들 수 있다. 물론 시스템 프로그래밍이나 하드웨어 제어와 같은 매우 복잡하고 반복 연산이 많은 프로그램은 파이썬과 어울리지 않는다. 하지만 파이썬은 이러한 약점을 극복할 수 있게끔 다른 언어로 만든 프로그램을 파이썬 프로그램에 포함시킬 수 있다.

파이썬과 C는 찰떡궁합이란 말이 있다. 즉, 프로그램의 전반적인 뼈대는 파이썬으로 만들고, 빠른 실행 속도를 필요로 하는 부분은 C로 만들어서 파이썬 프로그램 안에 포함시키는 것이다.


- 파이썬은 간결하다

귀도는 파이썬을 의도적으로 간결하게 만들었다. 만약 펄(Perl)과 같은 프로그래밍 언어가 100가지 방법으로 하나의 일을 처리할 수 있다면 파이썬은 가장 좋은 방법 1가지만 이용하는 것을 선호한다. 이 간결함의 철학은 파이썬 문법에도 그대로 적용되어 파이썬 프로그래밍을 하는 사람들은 잘 정리되어 있는 소스 코드를 볼 수 있다. 다른 사람이 작업한 소스 코드도 한눈에 들어와 이해하기 쉽기 때문에 공동 작업과 유지 보수가 아주 쉽고 편하다.



Posted by Imp3rio

다음 어셈블리 코드를 한줄씩 살펴보고 C코드를 추측해본다.

 

1.

 

- push ebp, mov ebp, esp : 이 부분은 Prolog 영역으로 스택프레임을 생성하는 부분이다.

- sub esp, 0x14 : esp가 가리키는 주소를 0x14 만큼 뺌으로써 스택 사용을 준비한다.

- mov DWORD PTR [ebp-0x4], 0xa : ebp가 가리키는 주소로부터 0x4만큼 떨어진 곳에 0xa를 저장

- mov DWORD PTR [ebp-0x8], 0x14 : ebp가 가리키는 주소로부터 0x8만큼 떨어진 곳에 0x14를 저장

- mov DWORD PTR [ebp-0xc], 0x0 : ebp가 가리키는 주소로부터 0xc만큼 떨어진 곳에 0x0을 저장

- mov eax, DWORD PTR [ebp-0x8] : eax레지스터에 ebp-0x8 주소에 저장된 데이터를 복사

- mov edx, DWORD PTR [ebp-0x4] : edx레지스터에 ebp-0x4 주소에 저장된 데이터를 복사

- add eax, edx : eax레지스터에 eax에 저장된 데이터와 edx에 저장된 데이터의 합을 저장

- mov DWORD PTR [ebp-oxc], eax : eax에 저장된 데이터를 ebp-oxc 주소에 복사

- mov eax, DWORD PTR [ebp-0xc] : ebp-0xc 주소에 저장된 데이터를 eax에 복사

- mov DWORD PTR [esp+0x4], eax : esp+0x4 주소에 eax에 저장된 데이터를 복사

- mov DWORD PTR [esp], 0x80484f0 : esp가 가리키는 주소에 0x80484f0을 복사

- call 0x80482f0 <printf@plt> : 0x80482f0 주소를 호출하며 해당 주소는 printf 함수이다.

- leave : leave는 move esp, ebp; pop ebp의 두 명령어를 하나의 어셈블리어로 합친 것이다.

- ret : ret는 pop eip 를 수행하며 이전의 함수로 돌아간다.

 

위 어셈블리 코드를 보면 4바이트 데이터 3개를 스택에 저장(<+6>, <+13>, <+20>)하며 printf 함수를 호출(<+52>)하는 것을 알 수 있다.

이를 바탕으로 C코드를 추측해 보면 다음과 같다.

 

int main()

{

int a = 10, b = 20, c;

c = a + b;

printf("%d", c);

return 0;

}

 

2.

 

- and esp, 0xfffffff0 : esp레지스터를 최적화 하는 코드

- sub esp, 0x20 : esp가 가리키는 주소를 0x20만큼 빼 스택을 준비한다.

- mov DWORD PTR [esp+0x1c], 0x0 : esp+0x1c 주소에 0을 저장

- jmp 0x8048450 <main+51> : 0x8048450 주소로 점프

- cmp DWORD PTR [esp+0x1c], 0x2 : esp+0x1c 주소에 저장된 데이터와 0x2와 비교

- jne 0x804844b <main+46> : esp+0x1c 주소에 저장된 데이터와 0x2가 같지 않으면 0x804844b 주소로 점프

- mov eax, DWORD PTR [esp+0x1c] : eax레지스터에 esp+0x1c 주소에 저장된 데이터를 복사

- mov DWORD PTR [esp+0x4], eax : esp+0x4 주소에 eax레지스터에 저장된 데이터를 복사

- mov DWORD PTR [esp], 0x80484f0 : esp레즈서터가 가리키는 주소에 0x80484f0를 복사

- call 0x80482f0 <printf@plt> : 0x80482f0 주소를 호출하며 해당 주소는 printf()함수의 주소이다.

- add DWORD PTR [esp+0x1c], 0x1 : esp+0x1c 주소에 저장된 데이터에 1을 더함

- cmp DWORD PTR [esp+0x1c], 0x4 : esp+0x1c 주소에 저장된 데이터와 0x4를 비교

- jle 0x8048430 <main+19> : 비교 결과 esp+0x1c가 0x4보다 작거나 같으면 0x8048430 주소로 점프

- mov eax, 0x0 : eax 레지스터 초기화

 

위 어셈블리 코드를 보면 데이터를 비교하여 되돌아가는(<+51> <+56>) 부분이 반복되는 것을 알 수 있으며 데이터를 비교하여 처리하는(<+19> <+24) 부분이 있는 것을 알 수 있다.

이를 바탕으로 C코드를 추측해 보면 다음과 같다.

 

int main()

{

int i;

for( i = 0; i < 5; i++ )

{

if( i == 2 )

printf("%d", i);

}

return 0;

}

 

3.

- sub esp, 0x20 : esp가 가리카는 주소를 0x20만큼 빼 스택을 준비

- mov DWORD PTR [esp+0x18], 0xa : esp+0x18 주소에 0xa를 저장

- mov DWORD PTR [esp+0x1c], 0x14 : esp+0x1c 주소에 0x14를 저장

- mov eax, DWORD PTR [esp+0x1c] : eax에 esp+0x1c에 저장된 데이터를 복사

- DWORD PTR [esp+0x4], eax : esp+0x4 주소에 eax에 저장된 데이터를 복사

- mov eax, DWORD PTR [esp+0x18] : eax에 esp+0x18에 저장된 데이터를 복사

- mov DWORD PTR [esp], eax : esp가 가리키는 주소에 eax 데이터를 저장

- call 0x804841d <addVal> : 0x804841d 주소를 호출하며 addVal() 함수의 주소이다.

- mov DWORD PTR [esp+0x4], eax : addVal() 함수의 리턴값을 가진 eax의 데이터를 esp+0x4 주소에 복사

- mov DWORD PTR [esp], 0x8048500 : esp가 가리키는 주소에 0x8048500을 저장

- call 0x80482f0 <print@plt> : 0x80482f0 주소를 호출하며 printf() 함수의 주소이다.

 

- mov eax, DWORD PTR [ebp+0xc] : eax 레지스터에 ebp+0xc에 저장된 데이터를 복사( 첫번째 인자)

- mov edx, DWORD PTR [ebp+0x8] : edx 레지스터에 ebp+0x8에 저장된 데이터를 복사( 두번째 인자)

- add eax, edx : eax에 저장된 값과 edx에 저장된 값을 더해 eax에 저장

- pop ebp : 함수 종료

 

위 2개의 어셈블리 코드를 바탕으로 C코드를 추측해보면 다음과 같다.

 

#include <stdio.h>

 

int addVal(int a, int b);

 

int main()

{

int a = 10, b = 20, c = 0;

c = addVal(a, b);

printf("%d", c);

 

return 0;

}

 

int addVal(int a, int b)

{

return a + b;

}

Posted by Imp3rio

1. 개요

 

어셈블리어 또는 어셈블리 언어는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.

컴퓨터 구조에 따라 사용하는 기계어가 달라지며, 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다. 컴퓨터 CPU마다 지원하는 오퍼레이션의 타입과 개수는 제각각이며, 레지스터의 크기와 개수, 저장된 데이터형의 표현도 각기 다르다. 모든 범용 컴퓨터는 기본적으로 동일한 기능을 수행하지만, 기능을 어떤 과정을 거쳐 수행할지는 다를 수 있으며, 이런 차이는 어셈블리어에 반영되게 된다.

 

어셈블러는 니모닉 기호를 opcode로 변환하고 메모리 위치와 기타 존재물에 따라 식별자를 다시 분석함으로써 목적 코드를 만들어낸다. 고급 언어와는 달리 어셈블리어는 간단한 문장에 대해 기계어와 일대일 대응관계가 있지만, 자주 쓰이는 몇 명령은 둘 이상의 기계어 명령을 묶어 하나의 어셈블리 명령어에 대응시키기도 한다.

 

어셈블리 명령어 종류는 기능으로 분류하면 다음과 같다.

 

어셈블리 명령어의 구조는 다음과 같다.

 

Opcode는 ADD, SUB 등과 같은 명령어들을 의미하고 Operand는 피연산자이다. 명령어에 따라 Operand의 개수가 정해져 있다.

예를 들면 다음과 같다.

 

Posted by Imp3rio

1. 레지스터


1) 개요

레지스터는 컴퓨터의 프로세서 내에서 자료를 보관하는 아주 빠른 기억장소이다.

레지스터는 메모리 계층의 최상위에 위치하며, 가장 빠른 속도로 접근 가능한 메모리이다. 최신 프로세서에서 레지스터는 대개 레지스터 파일로 구현되지만, 과거에는 플립플롭, 마그네틱 코어, 박막 필름 메모리 등으로 구현되기도 했다.


2) 레지스터 종류

레지스터는 사용 용도에 따라 나뉜다.


범주

이름

용도

범용 

레지스터

EAX(Accmulator)

산술연산(함수의 결과값 저장)

EBX(Base Register)

특정 주소 저장

ECX(Count)

반복적 실행되는 특정 명령

EDX(Data)

일반 자료 저장

포인터 

레지스터

EBP(Base Pointer)

스택 내 가장 밑의 주소

ESP(Stack Pointer)

스택 내 가장 위의 주소

EIP(Instruction Pointer)

다음 실행할 명령의 주소

플래그 

레지스터

EFLAGS

연산 결과 및 시스템 상태와 관련된 플래그 값


위의 표는 컴파일러가 컴파일 할 때 주로 사용되는 것이다. 반드시 위의 용도에만 사용해야 하는 것은 아니다. 즉, 일종의 변수로 보는 것이 좋다.


3) 레지스터의 길이

EXA(Extend) : 32bits

AX : 16bits

AL(low), AH(high) : 8bits


2. 스택 (Stack)


1) 개요

스택은 제한적으로 접근할 수 있는 나열 구조이다. 그 접근 방법은 언제나 목록의 끝에서만 일어난다.

스택은 한쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형구조(LIFO - Last In First Out)으로 되어 있다. 자료를 넣는 것을 푸시(Push)라고 하고 반대로 넣어둔 자료를 꺼내는 것을 팝(Pop)이라고 한다. 이때 꺼내지는 자료는 가장 최근에 보관한 자료부터 나오게 된다.

Top(), Empty(), Push(), Pop() 등의 함수로 관리한다.


2) 스택의 용도

- 지역 변수의 저장

- 매개변수 전달

- 임시 데이터 백업

- 함수 호출, 복귀 정보 저장


3) Stack Frame

스택에 저장되는 함수의 호출 정보를 스택 프레임(Stack Frame)이라 하며, 이러한 스택 프레임에는 함수로 전달되는 인수와 함수 실행을 모두 마치면 돌아올 복귀 주소, 지역 변수 등의 정보가 들어간다. 

스택 프레임은 함수에 독립적인 메모리 영역이다.

함수 호출시 생성되고 복귀시 삭제한다.

함수는 Stack Frame을 독립적으로 사용한다.


4) Stack에서 사용되는 레지스터

- ESP : Stack의 가장 위의 주소를 가리킨다.

- EBP : Stack의 가장 밑의 주소를 가리킨다.

프로그램이  Stack안의 값을 참조할 때에는 ESP, EBP에 offset을 더하거나 빼서 참조한다.


5) Prolog & Epilog

Prolog : 함수 호출시 호출 받은 함수가 스택을 독립적으로 사용할 수 있도록 Stack Frame을 생성하는 작업

Epilog : 함수 복귀시 생성한 Stack Frame을 해제하고 함수 호출하기 이전의 Stack Frame을 되돌리는 작업


Posted by Imp3rio

1. 변수


C언어에서의 변수는 숫자의 표현에 관련해서 정수형과 실수형있다. 그리고 자료가 있는 위치값인 메모리 주소값으로 처리하는 포인터 변수가 있다. 이것은 CPU의 메모리 체계와 관련되어 있어 CPU 의존적이다. 


1) 정수형 변수

정수형의 표현은 char, int로 선언한다. char는 8비트(1바이트)로 규정되어 있어 변수의 범위가 결정되지만 int는 CPU와 OS에 의존적이다. 32비트 컴퓨터에서는 32비트(4바이트), 64비트 컴퓨터에서는 64비트(8바이트) 크기를 갖는다.


2) 실수형 변수

실수를 처리하기 위해 float와 double을 사용한다. 실수를 2진수로 표혆ㄹ 때는 부동소수점 방식을 사용한다.


3) 포인터 변수

포인터 변수는 메모리 주소를 저장하기 위한 변수이다.

포인터 변수 A안에 X의 주소가 들어있으면 'A는 X를 가리킨다' 라고 표현한다.


3) 배열

배열은 여러개의 데이터를 저장하기 위해 사용하며, []를 사용한다.

배열의 이름은 포인터이다.


2. 함수


1) 함수의 구조



Posted by Imp3rio

1. 개요

C언어는 1972년 켄 톰슨과 데니스 리치가 벨 연구소에서 일할 당시 새로 개발된 유닉스 운영체제에서 사용하기 위해 개발한 프로그래밍 언어이다. 하지만 지금은 게임이나 서버용 응용프로그램 뿐만 아니라 임베디드 시스템을 위한 프로그래밍에도 함께 쓰이고 있다.


2. 발전과정

ALGOL 60 → CPL → BCPL → B언어 → C언어 순으로 발전해 왔다.

C언어는 어셈블리어가 가진 많은 연산기능과 함께 고급언어가 가진 제어구조나 기능적인 모듈을 제공하기 때문에 유연하고 막강한 기능제공이 가능했다. 

1980년대 미국 표준을 제정하는 ANSI에서 ISO(국제표준화기구)와 함께 C의 준화작업을 시작했고, 1990년에 공식적으로 C90이라는 표준을 발표했다. 


3. C언어의 특징

- 이식성이 뛰어나다.

C언어는 운영체제와 같은 시스템 프로그래밍을 작성하기에 적합한 언어이므로 프로그램의 이식성이 높고 하드웨어에 대한 제어가 가능하다.

한 컴퓨터에서 C언어로 작성된 프로그램은 소스코드를 변경하지 않고 다른 컴퓨터나 운영체제에서 실행할 수 있다. 이는 모든 컴퓨터에서 동일하게 동작하는 표준 라이브러리 함수를 프로그래머에게 제공하기 때문이다. 즉, 특정 CPU를 가진 컴퓨터 시스템에서만 실행되는 기계 종속적인 프로그램이 아닌 어떤 하드웨어든지 지원이 가능흔 기계 독립적인 프로그램 개발이 가능한 언어다.


- 고급언어와 저급언어의 특징을 모두 가지고 있다.

저급언어인 어셈블리어가 가진 많은 연산 기능과 함께 고급언어가 가진 제어구조나 기능적인 모듈을 제공하기 때문에 저급언어 특성의 논리적 구조를 가진 고급언어이다.


- 논리적이고 구조적이며 함축적인 프로그래밍 가능

C언어는 하나 이상의 함수로 구성된 언어이기 때문에 함수를 활용한 논리적이고, 구조적이며, 함축척 프로그래밍 작성이 가능하다.

함수란 공통된 기능을 수행하기 위한 명령어들을 하나의 독립된 단위로 모아 놓은 모듈이라 할 수 있으며 복잡한 소스코드를 기능에 따라 함수 단위로 나누어 세분화시킴으로써 소스코드에 대한 중복사용을 최소화하고 재사용 가능성을 개선시킨 것을 모듈화라고 한다. 이렇게 모듈화된 기능을 각종 저에문들과 함께 사용함으로써 구조화된 프로그래밍 기법을 지원한다. 모듈화되고 구조화된 소스코드는 프로그램의 크기도 작고, 프로그램의 실행속도도 빠를 뿐만 아니라, 소스에 대한 이해가 쉽기 때문에 유지/관리가 편하다.


- 포인터를 이용한 메모리 관리

포인터는 자료가 저장된 메모리의 주소를 의미하는데 이러한 포인터는 C언어의 대표적인 기능이다. 포인터를 잘 활용하면 메모리 주소를 직접 제어할 수 있으므로 효율적인 메모리 관리와 더불어 실행속도를 향상시킬 수 있다. 하지만 포인터를 잘못 사용하면 디버깅하기 어려운 런타임오류가 발생하여 오히려 처리능력을 저하시킬 수 있다.


- 절차지향적 언어

프로그램 작성 순서에 따라 프로그램 내부를 순차적으로 실행한다.


4. C언어의 구조

C언어의 구조는 다음과 같다.


#include <헤더파일>

전역변수 선언부;

함수 선언부;

int main() {

    프로그램 처리부;

}


void 사용자함수부() {


}


Posted by Imp3rio