실행 파일 수정 가능성의 이해 및 대응 방법

이미지
1. 실행 파일 구조 이미 다음 주제를 통하여 실행 파일의 구조에 대하여 살펴보았다. 실행 파일은 파일은 어떻게 동작하는가 문서 파일이 정해진 형식으로 구성되어 있는 것처럼 실행 파일도 문서 파일과 크게 다르지 않은 구조를 가지고 있으며, 구성 요소 중 .text 섹션의 기계어 코드가 로드되어 동작 하게 된다. 2. 실행 파일 수정 그렇다면 .text 섹션에 저장된 기계어 코드를 직접 수정 함으로써 프로그램의 실행 동작을 변경할 수 있다는 것을 의미한다. 이러한 특성을 활용하면, 프로그램의 소스를 수정하지 않고도 실행 결과를 변경할 수 있다. 2.1. bin to hex xxd 명령어를 사용하여 실행 파일을 텍스트 형식의 hex 파일로 변환한다. $ objdump -d -M intel add Disassembly of section .text: 0000000000401000 <_start>: 401000: b0 02 mov al,0x2 ; Load the value 2 into the AL register 401002: 04 03 add al,0x3 ; Add the immediate value 3 to AL (AL = 2 + 3) $ ./add result: 5 $ xxd add > add.hex 2.2. edit hex 텍스트 편집기로 생성된 "add.hex" 파일을 열어 offset 0x00001003 위치의 값 "03"을 "01"로 수정하고 저장한다. ...

C언어 - 변수의 자료형

이미지
1. C언어 자료형 signed unsigned short long char int float double auto register static extern const volatile 1.1. 정수형 부호 지정자 Integer Sign Modifiers : 정수형 크기 부호 지정자는 일반적으로 char 또는 int 와 같은 정수형 타입과 결합하여 사용한다.  단독으로 사용될 수도 있으나, 그 경우 int 가 생략된 형태로 해석된다. signed unsigned signed 와 unsigned 는 정수형 타입이 음수를 표현할지 여부를 결정하는 키워드이다. signed 는 부호 비트를 사용하여 음수와 양수를 모두 표현한다. unsigned 는 음수를 표현하지 않고 0 이상의 값, 즉 양수만을 표현한다. 같은 1byte(8bit)라도 signed 인지 unsigned 인지에 따라 표현 가능한 값의 범위가 달라진다. 1.2. 정수형 크기 지정자 Integer Size Modifiers : 정수형 크기 지정자는 일반적으로 정수형 타입 int 와 결합하여 사용한다.  단독으로 사용될 수도 있으나, 그 경우 int 가 생략된 형태로 해석된다. short long short short 는 정수형의 크기를 줄이기 위해 사용하는 지정자이다. long long 은 정수형의 크기를 늘리기 위해 사용하는 지정자이다. int 보다 더 큰 범위의 정수를 표현할 수 있지만, 32비트 시스템에서는 int 와 long int 의 크기가 같을 수 있다. 1.3. 기본 자료형 Fundamental Types: C 언어에서 정수, 실수 값을 표현하는 기본적인 내장 자료형이다. 1.3.1. 정수형 정수형은 소수점이 없는 정수 값을 표현한다. char 는 문자 저장용으로 사용되지만, 정수형으로 분류되는 타입이다. char int 자료형 ...

C언어 - "Hello World!"로 시작하기

이미지
1. C 컴파일러 설치 Linux 환경에서 C 언어 프로그램을 개발하기 위해 가장 널리 사용하는 컴파일러는 GCC(GNU Compiler Collection)이다. 이를 개별적으로 설치할 수도 있지만 개발에 필요한 필수 도구 모음인 build-essential 패키지를 통해 설치하는 것이 효율적이다. $ sudo apt update $ sudo apt install -y build-essential $ gcc --version gcc ... $ make --version GNU Make ... GCC (GNU Compiler Collection) : 리눅스 환경의 표준 C 컴파일러이다.  build-essential : GCC를 포함하여 g++(C++ 컴파일러), make(빌드 자동화 도구), libc6-dev(표준 라이브러리 및 헤더 파일) 등 개발에 필수적인 소프트웨어들을 한 번에 설치해 주는 패키지이다. 2. 첫 번째 프로그램 1978년에 발행된 교재의 첫 번째 예제로 “Hello, world!” 문장을 출력하는 예제가 소개된 이후 , 이 문장은 거의 모든 프로그래밍 언어 The C Programming Language [1] 를 설명하는 교재와 서적에서 가장 기본적인 첫 예제로 사용되고 있다. [출처]  The C Programming Language ※ 이 책은 C 언어를 개발한 `데니스 M. 리치(Dennis M. Ritchie)`와 `브라이언 W. 커니핸(Brian W. Kernighan)`이 집필한 저서로, 흔히 K&R C 라고 불리며 C 언어의 표준적인 기초를 확립한 대표적인 책이다. 2.1. hello.c 먼저 "hello.c" 라는 파일을 생성하고, “Hello, world!” 문장을 출력하는 예제를 작성한다. hello.c #include <stdio.h> main() { printf("Hello, wo...

C언어 - 프로그래밍 언어의 문법

이미지
1. 언어의 문법 인간이 사용하는 언어에는 매우 다양한 문법 이 존재하며, 이를 익히는 데에는 많은 시간이 필요하다. 명사, 동사, 시제, 어순 등 매우 많은 문법을 익혀야 한다. 프로그래밍 언어는 컴퓨터에게 무엇을 어떻게 할지 지시하기 위한 명확한 목적을 가진 언어이다. 비교적 적은 수의 문법 요소만으로도 의미의 표현과 실행이 가능하다. 사람이 쓰는 언어와 달리 프로그래밍 언어는 몇 가지 핵심 문법 만 이해하면 바로 사용이 가능하다. 2. C언어 문법 프로그래밍 언어는 다음과 같이 다섯 가지로 구성되어 있다. 변수 - 값을 저장한다. 연산 - 값을 계산한다. 문장 - 내용을 실행한다. 제어 - 실행 순서를 변경한다. 함수 - 여러 문장을 하나로 묶는다. 이 다섯 가지만의 문법만 이해해도 프로그램의 기본 구조를 이해할 수 있다. 2.1. 변수 (Variable) 변수는 값(value)을 저장하는 메모리 공간에 이름 을 부여한 것이다. 프로그램은 변수를 통해 데이터를 기억하고, 참조하고, 변경한다. 2.1.1. 변수 타입(Type) 변수 타입은 변수가 어떤 종류의 값을 저장 하며, 그 값을 어떻게 해석할지를 결정하는 규칙이다. 변수 타입에 의하여 저장 가능한 값의 형태, 메모리 사용 방식, 그리고 허용되는 연산의 종류가 결정된다. int count; count = count + 1 ; // int type stores integer values.   char grade = 'A' ; // char type stores a single character or small integer values.   float ratio = 0.75f ; ratio = ratio * 100.0f ; // float type stores floating-point (real) values. 2.1.2. 상수 상수는 값이 바뀌지 않는 변수 이다. C언어에...

Vibe Coding - 자연어로 코드를 만든다

이미지
1. Vibe Coding ‘Vibe Coding’이라는 말은 안드레이 카파시(Andrej Karpathy) 가 2025년 2월 X(트위터)에 올린 글에서 처음 등장한 용어다. OpenAI 공동 창립자이며 테슬라 AI 책임자로 활동한 이력을 가지고 있다. "There's a new kind of coding I call vibe coding, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists." "나는 이것을 ‘바이브 코딩’이라고 부릅니다. 코드를 신경 쓰는 대신, 그저 흐름과 감각에 몸을 맡기고, vibe 자체를 그대로 받아들이는 방식입니다." [출처] X - Andrej Karpathy ‘Vibe Coding’의 주요 개념은 코드를 사람이 직접 타이핑하기보다, AI에게 자연어로 요구하고 AI가 코드를 생성하도록 하는 개발 방식 이다. 마치 리듬을 타며 음악을 만들듯이, 코딩도 ‘vibe’를 타고 리듬과 분위기에 따라 진행하는 방식 을 말하고 있다. 정리하면, Vibe Coding은 ‘AI에게 요청해 개발을 진행하는 방식’ 으로, 인간은 코드 자체보다 결과와 흐름에 집중하는 AI 기반 개발 패러다임이다. 2. Code Assistant Code Assistant 는 사람이 자연어로 지시하면, 그 내용을 바탕으로 코드를 생성하거나 수정해주는 AI 도구를 말한다. 대표적으로 GitHub Copilot, Claude Code, OpenAI Codex, Gemini Code Assist 등이 있다. 이러한 도구들은 개발자가 ‘ 어떻게 ’보다 ‘ 무엇을 ’에 집중하도록 돕는 Vibe Coding 을 지원한다. Code Assist 제공업체 기반 모델 GitHub Copilot - GitHub - Microsoft GPT(GPT-...