CS
[컴퓨터 SW] Buffer Overflow
이 글은 포스텍 김종 교수님의 컴퓨터SW시스템개론(CSED211) 강의를 기반으로 재구성한 것입니다. 이 글에서는 buffer overflow에 대해 알아본다. Buffer Overflow 정의 Calling Convention 게시글에서 어떤 procedure P가 procedure Q를 호출할 때 return address를 stack에 push한다고 했다. 그러나 입력 범위보다 더 큰 값이 입력되는 등 특정한 상황에서 return address가 다른 값으로 변경될 수 있다. return address가 위치해 있는 assembly는 무조건 실행되기 때문에 segmentation fault가 나거나, 또는 사용자가 원하는 instruction을 실행시킬 수도 있다. 이처럼 데이터의 크기가 할당된 범..
[컴퓨터 SW] Array/Structure/Union의 할당과 접근
이 글은 포스텍 김종 교수님의 컴퓨터SW시스템개론(CSED211) 강의를 기반으로 재구성한 것입니다. 이 글에서는 array와 structure가 선언되었을 때 메모리에 어떻게 저장하고 어떻게 접근하는지 알아본다. Array Allocation TYPE ARRAY[LENGTH]; 와 같이 선언된 경우, TYPE이 총 LENGTH개 있는 배열을 선언한 것이다. 이 때 메모리에는 LENGTH * sizeof(TYPE)만큼의 공간이 할당되며, ARRAY 안에 있는 값들은 연속되어 저장된다. Access 값들이 연속되어 저장된다는 점을 이용해 array의 시작 주소를 이용해 array의 특정 element에 접근할 수 있다. 위 예시에서, ARRAY[i]의 주소값은 [시작 주소값] + sizeof(TYPE) *..
[컴퓨터 SW] Calling Convention
이 글은 포스텍 김종 교수님의 컴퓨터SW시스템개론(CSED211) 강의를 기반으로 재구성한 것입니다. 이 글에서는 calling convention에 대해 알아본다. calling convention은 함수가 호출되었을 때 어떻게 parameter를 처리하고 결과를 return할지에 대한 규약이다. Stack의 구조 C언어나 Java 등을 배우면서 '메모리는 code, stack, heap 등으로 나뉘어져 있어요~'라는 내용을 한 번쯤은 들어봤을 것이다. stack에는 local variable과 parameter 등이 저장되며, 이 값들이 저장되고 반환되는 방식이 calling convention이다. intel 계열 중 하나인 x86에서는 stack memory가 더 작을수록 top에 위치한다. 즉 ..
[컴퓨터 SW] Byte Ordering
이 글은 포스텍 김종 교수님의 컴퓨터SW시스템개론(CSED211) 강의를 기반으로 재구성한 것입니다. 이 글에서는 byte ordering에 대해 살펴본다. * LSB : Least Significant Byte, 제일 작은 byte를 의미한다. Byte Ordering 모든 컴퓨터는 word라는 단위로 메모리에 접근한다. 32-bit 컴퓨터의 경우 4 byte, 64-bit 컴퓨터의 경우 8 byte이다. byte ordering이란 컴퓨터가 메모리에 값을 저장하는 방식이다. 크게 Big Endian과 Little Endian으로 나뉜다. 주소값은 0부터 시작하며, 값이 커질수록 higher address이다. Big Endian LSB가 high address에 저장되는 방식이다. Sun, PPC M..
[컴퓨터 SW] Bit를 이용한 컴퓨터의 정보 표현
이 글은 포스텍 김종 교수님의 컴퓨터SW시스템개론(CSED211) 강의를 기반으로 재구성한 것입니다. 이 글에서는 컴퓨터가 정보를 표현하는 방식인 bit와 연산에 대해 알아본다. Bit와 Bytes 컴퓨터는 모든 정보를 0과 1로 표현하며, 표현의 최소 단위를 하나의 bit라고 정의한다. byte는 8개의 bit로 구성되어 있으며 0과 1로 이루어진 수가 8자리로 이루어져 있으므로, 2진수로 숫자를 표현한다. 1byte == 8bit 1byte는 $00000000_2$부터 $11111111_2$까지 표현 가능하며, 10진수로는 0~255, 16진수로는 00$_{16}$부터 FF$_{16}$까지 표현할 수 있다. 일반적인 수들의 byte 개수는 다음과 같다. Data Type 32bit 64bit char..
[OOP] SOLID 정리
앞선 게시글에서 객체지향 설계 원칙인 SOLID Principle에 대해 알아보았다. 이 글에서는 SOLID Principle을 사용해야 하는 이유, 그리고 각각의 원칙들의 연관성에 대해 조금 살펴본다. 왜 설계 원칙이 중요할까? 사용자 요구사항의 변경은 정말 시시때때로 이루어진다. 요구사항이 바뀌면 한숨부터 나오는 것은 사실이다. 그렇지만 이러니저러니 해도 결국 그 요구사항을 받아들여 프로그램을 수정해야 한다. 왜? 결국 프로그램을 사용하는 건 사용자니까. 이런저런 요구사항을 전부 수정하다보면 코드가 꼬이는 일도 비일비재하다. 초기에는 깨끗한 설계도 이것저것 덧붙이다 보면 지저분해지기 마련이니까. 그래서 더더욱 유지보수성과 확장성이 높으면서도 버그가 적게 발생할 수 있는 좋은 설계가 중요하다. SOLI..
[OOP] SOLID - Dependency Inversion Principle
이 글은 객체지향 5대 원칙, SOLID principle 중 D인 Dependency Inversion Principle, 의존성 역전 원칙에 대해 알아본다. 정의 dependency를 가지는 component가 구현체가 아닌 추상화에 의존해야 한다는 원칙이다. 각 모듈들이 dependency를 가질 때(상위 module이 하위 module을 사용할 때) concretion이 아닌 abstraction에 의존해야 한다. abstraction은 concretion에 의존하면 안 된다. concretion은 abstraction에 의존해야 한다. 결국 모든 경우에 abstraction에 의존해야 한다. 예전의 설계는 상위 module이 하위 module의 concretion을 직접적으로 사용하며, 이 때 ..
[OOP] SOLID - Interface Segregation Principle
이 글은 객체지향 5대 원칙, SOLID Principle 중 Interface Segregation Principle에 대해 다룬다. 정의 Interface Segregation Principle은 object는 자신이 사용하지 않는 method를 포함한 interface에 의존하면 안 된다는 원칙이다. 이 원칙은 dependency와 overhead에 대한 이야기이다. 언제 사용해야 할까? 만약 어떤 class C가 interface I를 implement하는 예시를 생각해 보자. interface I에는 method A, B, C 등 여러 가지 method가 있다. 그러나 class C는 method A밖에 사용하지 않는다. 이 경우 class C에서는 사용하지 않는 method B, method ..
[OOP] SOLID - Liskov Substitution Principle
이 글은 객체지향 5대 원칙, SOLID principle 중 L인 Liskov Substition Principle을 다룬다. 정의 subtype이 항상 supertype로 치환할 수 있어야 한다는 원칙이다. 이 원칙은 polymorphism에 관련된 이야기이다. 다르게 설명하자면 supertype을 사용하는 위치에 subtype을 넣어도 프로그램 수행에는 변화가 없어야 한다는 말이다. 따라서 supertype에서 사용하는 method는 subtype에서도 사용할 수 있어야 한다. polymorphism을 공부했다면 method overriding과 upcasting에 대해 이미 알고 있을 것이다. Liskov Substitution Principle를 따른다면 upcasting한 상태에서 parent..
[OOP] SOLID - Open Closed Principle
이 글은 객체지향 5대 원칙, SOLID principle 중 O인 Open Closed Principle에 대해 알아본다. 정의 class, function, module 등 프로그램의 구성 요소는 확장에는 열려 있고 수정에는 닫혀 있어야 한다는 원칙이다. 조금 풀어 설명하면 코드를 변경하지 않으면서 기능 변경 또는 확장할 수 있도록 설계되어야 한다는 것이다. Open Closed Principle가 준수되지 않은 경우 요구사항이 변화하거나 새로운 요구사항이 생길 때 기존 코드를 수정해야 한다. 반면 완벽하게 준수되었다면 요구사항의 변화 또는 확장 시 기존 코드를 수정할 필요 없이 새로운 코드만 추가하면 된다. 따라서 이 원칙은 프로그램의 유지보수성을 높여주며 코드의 확장성을 높이는 데 크게 기여한다...
[OOP] SOLID - Single Responsibility Principle
이 글은 객체지향 5대 원칙, SOLID principle 중 S인 Single Responsibility Principle 단일 책임 원칙에 대해 알아본다. 정의 Single Responsibility Principle은 모든 class는 단 하나의 책임을 가져야 한다를 의미한다. 여기서 책임이란 단어가 조금 애매한데, 해당 class가 수행하는 역할이라고 이해해도 된다. 따라서 class가 단 하나의 역할만 가져야 한다고 이해해도 무방하며, 즉슨 class 변경의 이유가 맡고 있는 역할에 대한 변경 단 하나뿐이어야 한다는 것도 의미한다. 예를 들어 class teamA, class teamB가 Data class의 getData()라는 method를 사용한다고 가정하자. getData() method..
[OOP] 객체지향 프로그래밍 Object-Oriented Programming
컴퓨터가 만들어진 후 초창기 프로그램은 대부분이 Procedural 프로그래밍이었다. 그러나 시작부터 끝까지 모든 순서를 정의하기에는 경우의 수가 너무 많고 코드가 꼬이기 십상이다. 그래서 나온 개념이 바로 Object-oriented이다. 객체지향이란? 객체지향에 대한 명확한 정의를 딱 내리긴 어렵고 사람마다 다양한 관점이 있지만, 나는 다음과 같이 정의한다. 객체지향이란 객체들의 상호작용으로 프로그램을 구현하는 방법이다. 객체란 어떤 개념을 추상화하고 모델링한 요소이다. 객체에 대해 좀 더 설명하자면, 어떠한 개념을 추상화하고 모델링을 통해 만든 요소이다. 객체는 상태(state)와 행위(behavior)를 가지고 있으며 행위를 통해 상호작용한다. Class vs Instance class는 inst..
[Security] 복무하며 사용한 Spring Secure Coding
세상에는 수많은 해킹 기법들이 있다. 학부생 때 컴퓨터 시스템 개론 과목을 들으면서 attack lab을 하며 buffer overflow를 처음 배우고 사용해 봤을 때의 충격이란... 정말 놀라웠다. 사실상 프로그램에 원하는 명령어를 넣는다는 것은 관리자 권한을 얻을수 있다는 말이고, 즉슨 해당 프로그램의 사용자 정보를 탈취하거나 서버 정보에 악의적인 공격을 해 막대한 손해를 끼칠 수 있다는 말이다. 따라서 코드를 작성할 때 이러한 공격을 방지할 수 있어야 한다. secure coding은 보안 취약점이 없는 코드를 작성한다는 의미이며, 안정적인 서비스를 위해 꼭 필요한 개념이다. 지금까지 SW개발병으로 근무하면서 수많은 보안 취약점들을 보아 왔고, 그 중 대표적인 몇 가지에 대해 어떤 문제가 있는지,..
[Security] 1:1, group E2EE 암호화 방법 ***TODO
(작성 중 - 암호화 로직(소인수분해, 이산대수), 디피헬만 작성하기) 읽기 전에 비대칭키 암호화(public/private key), 대칭키 암호화(shared key)에 대해 알고 있어야 합니다. 대칭키 암호화 암호화와 복호화를 할 때 같은 키를 사용하는 암호화 방식입니다. Alice가 Bob에게 메시지를 보낸다고 가정했을 때 프로토콜은 아래와 같습니다. Alice와 Bob이 shared key를 공유합니다. Alice는 shared key로 메시지를 암호화합니다. 해당 암호문을 Bob에게 전달합니다. Bob은 전달받은 암호문을 shared key로 해독합니다. 비대칭키 암호화 암호화와 복호화를 할 때 다른 키를 사용하는 암호화 방식입니다. 공개키-개인키가 한 쌍을 이루며, 공개키로 암호화한 암호문은..