라벨이 개념인 게시물 표시

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

이미지
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"로 수정하고 저장한다. ...

실행 파일은 파일은 어떻게 동작하는가

이미지
1. Assembly CPU가 이해하는 기계어는 2진(Binary) 코드 이다. Assembly 는 기계어를 사람이 읽을 수 있도록 문자 형태의 명령어(mnemonic) 로 표현한 것이다.  따라서, 기계어(machine code)와 가장 유사한 프로그래밍 언어는 Assembly 이라고 할 수 있다.  기계어가 어떤 과정으로 실행되는지 확인하기 위하여 간단한 Assembly 프로그램을 살펴보고자 한다.  다음 Assembly 코드는 "2 + 3"의 결과를 출력하는 동작을 한다. ; Ubuntu 24.04 x86-64 (NASM, ELF64) section .data msg db "result: " msg_len equ $ - msg newline db 0x0a section .bss buf resb 1 section .text global _start _start: mov al, 2 add al, 3 mov bl, al mov rax, 1 mov rdi, 1 mov rsi, msg mov rdx, msg_len syscall mov al, bl add al, '0' mov [buf], al mov rax, 1 mov rdi, 1 mov rsi, buf mov rdx, 1 syscall mov rax, 1 mov rdi, 1 mov rsi, newline mov rdx, 1 syscall mov rax, 60 xor rdi, rdi syscall add.asm ...

게이트 회로로 이해하는 컴퓨터 연산

이미지
1. Computer 컴퓨터(computer)는 계산을 하는 기계이다. 그런데 어떻게 계산을 수행하는 것일까? 컴퓨터는 수 많은 트랜지스터로 구성된 " Gate Circuit "을 이용하여 논리 연산과 산술 연산을 수행한다. 2. 연산 (Operation) 2.1. Basic 전류가 흐르면( ON ) 전구가 켜지고, 흐르지 않으면( OFF ) 꺼진다. 👉  circuitjs-basic ※ 전류를 흐르게 만드는 전자는 실제 물리적으로는  (–) 에서  (+) 로 이동한다. 그러나 전자의 존재를 알지 못했던 당시, 프랭클린이 ‘전하가 (+)에서 (–)로 움직인다’고 정의한 규칙이 오랫동안 사용되면서, 오늘날에도 전류의 방향은 관례적으로 (+)에서 (–)로 흐르는 것으로 표현한다. 2.2. Transistor 그런데, 반도체(Semiconductor) 라는 것은 전기를 흐르게도 할 수 있고, 흐르지 않게도 할 수 있다. 대표적으로 트랜지스터(Transistor) 는 이러한 반도체의 특성을 이용하여 전류의 흐름을 제어 할수 있다. 👉  circuitjs-transistor 2.3. Gate 트랜지스터(Transistor)를 이용하여 기본 AND, OR, NOT, NOR, XOR 연산을 구현할 수 있다. 이것을 Gate Circuit 라고 하며, 이러한 여러 게이트를 조합하여 복잡한 디지털 논리 회로(Circuit) 를 구성한다. 👉  circuitjs-gate 👉  circuitjs-gate_xor 2.3.1. AND Gate X, Y가 모두 ON 일때 ON 2.3.2. OR Gate X, Y 중 하나라도 ON 일때 ON 2.3.3. NOT Gate X가 OFF 일때 ON 2.3.4. NOR Gate X, Y가...

0과 1로 이해하는 컴퓨터 동작

이미지
1. ON/OFF 전구에 전기가 흐르면 전구가 켜지고( ON ), 전기가 흐르지 않으면 전구가 꺼진다( OFF ). 이렇게 컴퓨터는 ON 을 1로, OFF를 0으로 표현하는 이진법( Binary) 을 사용한다.  1.1. Bit 와 Byte 0과 1로 값을 표현하는 최소 단위를 ‘ bit ’라고 한다. (0 또는 1) 8bit는 1byte를 구성하며, 1byte는 문자를 표현하는 기본 단위로 사용된다. 1.2. Char 8bit, 즉 1byte로 영문(ASCII) 문자( char )를 표현한다. 코드를 표현할 때 "00010001" 과 같은 2진수는 길고 읽기 어렵기 때문에, 8bit(1byte)를 두 자리로 나타낼 수 있는 16진수( "0x11" ) 표기를 사용한다.       [출처] Computer Architecture - The ASCII character representations 1.3. Code 문자를 2진 코드로 정의하듯, 실행 코드도 동일한 방식으로 2진 형태로 정의된다. CPU는 이러한 기계어( Assembly )를 기반으로 동작하며, CPU를 설계할 때 정의되는 동작 코드( Instruction Code )는 x86, x64, ARM 등 CPU 아키텍처마다 서로 다르게 구성된다. Instruction Code는 피아노 연주를 위해 사용되는 음표들의 모음과 같다고 할 수 있다.     [출처] Stack Overflow - Intel x86(8086/8088) 16bit Opcode Instruction 1.4. Process CPU에는 Instruction Code를 처리하기 위한 레지스터(Register) 라는 초고속 저장 공간이 있으며, 기계어 코드들은 일련의 과정을 거쳐 레지스터로 전달되어 명령을 실행하게 된다.