분류 전체보기 203

보안이슈#2. 엔드포인트 하드닝(Endpoint Hardening)

최근 보안뉴스에 소규모 보안팀이 엔드포인트 하드닝을 통해 상용 솔루션에 의존하지 않고 ‘모던 시큐리티’를 구현한 사례가 소개되었다.https://www.boannews.com/media/view.asp?idx=142384 상용 도구 버리고 ‘오픈소스·AI’ 택했다... 소규모 보안팀의 엔드포인트 생존법24일 열린 OWASP 서울 챕터 2월 세미나는 인력과 예산의 한계를 겪는 소규모 보안팀이 자동화 기술, 인공지능(AI), 오픈소스를 활용해 엔터프라이즈급 보안 환경을 구축한 치열한 실무 경험을 공유www.boannews.com 엔드포인트 하드닝은 특히 분산 근무 환경과 클라우드 기반 서비스가 일반화된 시대에 그 중요성이 더 커지고 있다.1. 엔드포인트 하드닝이란?엔드포인트 하드닝(Endpoint Harde..

[Java] 메서드의 메모리 적재 원리와 클래스 선언 규칙

1. 메서드를 메모리에 올리는 두 가지 방법자바에서 메서드는 성격에 따라 메모리에 적재(Load)되는 시점과 방식이 다르다. 1️⃣라이브러리 클래스에서의 메서드보통 기능을 제공하는 역할을 하는 클래스들이다.인스턴스 메서드 (Instance Method): new 연산자를 통해 객체를 생성하는 순간 메모리에 올라간다. 객체마다 고유한 상태(필드)를 가질 수 있으며, 반드시 객체 생성 후에만 사용할 수 있다.정적 메서드 (Static Method): 프로그램이 실행되자마자 메모리(Method Area)에 자동으로 올라간다. 객체 생성 없이 클래스명.메서드명()으로 즉시 호출할 수 있다.2️⃣실행 클래스에서의 메서드public static void main이 포함된, 프로그램의 시작점이 되는 클래스다.프로그램..

보안이슈#1. N2SF(National Network Security Framework)

수십 년간 국내 보안의 근간이었던 '물리적 망분리' 체계가 한계에 부딪히면서, 정부는 2025년에 인공지능(AI)과 클라우드 환경에 대응하기 위한 새로운 보안 패러다임으로 N2SF(National Network Security Framework)을 제시했다.1. N2SF란?N2SF(National Network Security Framework, 국가 망 보안체계)는 기존의 망분리 정책에서 벗어나, 데이터의 중요도에 따라 보안 수준을 차등화하여 적용하는 새로운 국가 네트워크 보안 프레임워크다. 과거에는 업무망과 인터넷망을 물리적으로 완전히 나누는 것만으로도 충분한 방어가 가능했다.하지만 클라우드 도입 가속화, 생성형 AI의 등장, 그리고 SaaS(Software as a Service) 협업 도구의 필수..

[Java] static과 인스턴스 - JVM이 main 메서드를 찾아가는 방법

public, static, 그리고 new 이 세 가지 키워드는 자바의 동작 원리와 메모리 관리 방식을 이해하는 데 중요하다.각 키워드의 역할과 객체 생성 과정에서의 메모리 흐름을 살펴본다. 1. main 메서드가 public이어야 하는 이유JVM(Java Virtual Machine)이 프로그램을 실행할 때, 클래스 외부에서 main 메서드를 찾아 호출해야 한다.만약 main 메서드가 public이 아니라면 JVM은 해당 메서드에 접근할 수 없으며, 프로그램은 시작을 할 수 없다.따라서 main은 항상 외부로 완전히 개방된 public 상태여야 한다. default 접근 제어메서드 앞에 아무런 제어자도 붙이지 않으면 자동으로 default 상태가 된다.이는"같은 패키지 내부"에서만 접근이 가능하다는 뜻..

C언어 구조체 포인터와 malloc 함수

아래 코드를 바탕으로 구조체 포인터를 선언할 때 왜 malloc 함수를 사용해야 하는지, 그리고 메모리에는 어떤 변화가 일어나는지 디버깅을 통해 알아본다.#include #include #include struct member{ char name[20]; int age;};struct member *create_member(const char *name, int age);int main(){ struct member *m; m = create_member("Hgd", 20); printf("name = %s, age = %d\n", m->name, m->age ); free(m); return 0;}struct member *create_member(const ..

C언어 운영체제별로 조건부 컴파일하기

지난 포스팅에서 #ifdef를 이용해서 운영체제의 비트 수(32bit vs 64bit)에 따른 조건부 컴파일 방법에 대해 알아봤다. 운영체제의 비트 수 외에도 C언어는 운영체제(OS)마다 지원하는 API나 헤더 파일이 다르다는 점을 고려해서 코드를 짜야 한다. (예를 들면 윈도우에서는 windows.h를 써야 하고, 리눅스에서는 unistd.h를 쓰는 식)이럴 때 조건부 컴파일을 이용하면 코드 수정 없이 컴파일러가 알아서 해당 OS용 코드를 골라내게 할 수 있다.1. 조건부 컴파일 개념조건부 컴파일은 전처리기(Preprocessor) 단계에서 이루어진다.컴파일러가 실제 기계어로 번역하기 전, #ifdef나 #if 같은 지시문을 보고 "이 부분은 포함하고, 저 부분은 버려라"라고 판단하는 것이다.운영체제마..

C언어 3중 포인터와 문자열 배열의 메모리 구조

포인터의 차수가 높아질수록 참조 관계를 머릿속으로 시각화하기 어려워진다.아래 예시 코드를 통해 3중 포인터(char ***pp)가 메모리상에서 어떻게 실제 문자열 데이터에 접근하는지, 참조 관계와 구조를 살펴보자. 코드 void print_pointer3(char ***p);int main(){ char *ch2[] = { "Linux", "Windows", "Unix", "Mac", NULL }; char **p; p = &ch2[0]; // *p = ch2[0] print_pointer3(&p); return 0;}void print_pointer3(char ***pp) // **p[]{ for(int i=0; (*pp)[i] != NULL; i++) ..

C 언어 배열의 문자열 수정과 strcpy의 동작 원리 (+strncpy)

지난 포스팅에서 배열의 이름이 '상수 주소'이기 때문에 새로운 문자열을 직접 대입(ch = "...")할 수 없다는 것을 확인했다. 그렇다면 이미 만들어진 배열의 내용을 바꾸려면 어떻게 해야 할까?정답은 메모리 공간에 값을 하나씩 복사해 넣는 strcpy 함수를 사용하는 것이다. 1. 코드지난 포스팅에서 사용한 코드에 string.h 헤더를 추가하고 strcpy를 통해 배열의 내용을 변경하는 과정을 추가한다.#include #include // strcpy 함수 사용을 위해 필요int main() { char ch[10] = "ABCDEF"; // 여유 공간을 위해 크기를 10으로 설정 char *ptr = "123456"; printf("--- 변경 전 ---\n"); print..

C언어 조건부 컴파일: #ifdef

프로그래밍을 하다 보면 운영체제의 비트 수(32bit vs 64bit), 혹은 디버그 모드와 릴리스 모드 등 특정 개발 환경에 따라 코드를 다르게 실행해야 할 때가 있다.이때 유용하게 사용할 수 있는 것이 바로 전처리기 지시자인 #ifdef이다.#ifdef는 "if defined"의 약자로, 특정 매크로가 정의되어 있는지에 따라 코드의 컴파일 여부를 결정한다.이를 통해 하나의 소스 코드로 다양한 환경에 대응하는 유연한 설계를 할 수 있다. 1. #ifdef의 기본 사용법과 동작 원리#ifdef는 특정 매크로가 정의되어 있는지 확인하고, 정의되어 있다면 #endif를 만날 때까지의 코드를 컴파일 과정에 포함시킨다. 기본 문법:#ifdef 매크로이름 // 매크로가 정의되어 있을 때만 실행될 코드#els..

GDB TUI 모드: 소스 코드를 보며 디버깅하기

GDB를 사용할 때 CLI만으로는 현재 실행 중인 소스 코드의 위치를 파악하기 어려울 때가 있다.이때 TUI(Text User Interface) 모드를 사용하면 터미널 화면을 분할하여 소스 코드, 어셈블리, 레지스터 상태를 실시간으로 확인하며 디버깅할 수 있다. 1. GDB TUI 개요 및 주요 기능TUI(Text User Interface) 모드란?GDB의 기본 텍스트 모드를 확장하여, 터미널 화면을 여러 개의 창으로 나누어 보여주는 기능이다.별도의 GUI 프로그램 없이도 시각적인 디버깅 환경을 제공한다.화면 분할: 소스 코드(Source), 어셈블리(Assembly), 레지스터(Register), 명령창(Command)을 동시에 확인 가능.실시간 하이라이트: 현재 실행 중인 라인을 소스 코드 상에서..