start: 진입점에 중단점을 설정하고, 실행 break(b): 중단점 설정 continue(c): 계속 실행 disassemble: 디스어셈블 결과 출력 u, nearpc, pd: 디스어셈블 결과 가독성 좋게 출력 x: 메모리 조회 run(r): 프로그램 처음부터 실행 context: 레지스터, 코드, 스택, 백트레이스의 상태 출력 nexti(ni): 명령어 실행, 함수 내부로는 들어가지 않음 stepi(si): 명령어 실행, 함수 내부로 들어감 telescope(tele): 메모리 조회, 메모리값이 포인터일 경우 재귀적으로 따라가며 모든 메모리값 출력 vmmap: 메모리 레이아웃 출력
어셈블리어 | Assembly Language 컴퓨터의 기계어와 치환되는 언어 명령어(Opcode)와 피연산자(Operand)로 구성된다. 명령어(Opcode) x64의 중요한 21개의 명령어 명령 코드 데이터 이동(Data Transfer) mov, lea 산술 연산(Arithmetic) inc, dec, add, sub 논리 연산(Logical) and, or, xor, not 비교(Conmparison) cmp, test 분기(Branch) jmp, je, jg 스택(Stack) push, pop 프로시져(Procedure) call, ret, leave 시스템 콜(System call) syscall 피연산자(Operand) 피연산자에는 총 3가지 종유가 올 수 있다. 상수(Immediate Va..
컴퓨터 구조 x86-64 아키텍처: 레지스터 x64 아키텍처에는 범용 레지스터, 세그먼트 레지스터, 명령어 포인터 레지스터, 플래그 레지스터가 존재한다. 범용 레지스터 | Grenral Register x86-64에서 각각의 범용 레지스터는 8바이트를 저장할 수 있으며, 부호 없는 정수를 기준으로 $2^{64-1}$까지의 수를 나타낼 수 있다. 자주 쓰이는 범용 레지스터들 이름 주용도 rax (accumulator register) 함수의 변환 값 rbx (base register) x64에서는 주된 용도 없음 rcx (counter register) 반복문의 반복 횟수, 각종 연산의 시행 횟수 rdx (data register) x64에서는 주된 용도 없음 rsi (source index) 데이터를 옮..
컴퓨터 구조 | Computer Architecture 컴퓨터 구조는 컴퓨터의 기능 구조에 대한 설계, 명령어 집합구조, 마이크로 아키텍처, 그리고 기타 하드웨 및 컴퓨팅 방법에 대한 설계 등이 포함된다. 컴퓨터의 기능 구조에 대한 설계 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능들이 컴퓨터에 필요한지 고민하고, 설계하는 분야이다. 대표적으로 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조가 있다. 폰 노이만 구조 연산과 제어를 위해 중앙처리장치(CPU)를, 저장을 위해 기억장치(Memory)를 사용한다. 그리고 장치간에 데이터나 제어 신호를 교환할 수 있도록 버스(bus)라는 전자 통로를 사용한다. 중앙처리장치 | CPU CPU는 프로그램의 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌이다. ..
세그먼트 리눅스에서 프로세스의 메모리를 크게 5가지의 세그먼트(Segment)로 구분합니다. 세그먼트란 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것이다. 코드 세그먼트, 데이터세그먼트, BSS 세그먼트, 힙 세그먼트, 스택 세그먼트로 구분한다. 메모리를 용도별로 나누는 이유는, 각 용도에 맞게 적잘한 권한을 부여할 수 있기 때문이다. 권한에는 읽기, 쓰기, 실행이 존재하며, CPU는 메모리에 대해 권한이 부여된 행위만 할 수 있다. 코드 세그먼트 | Code Segment 실행 가능한 기계 코드가 위치하는 영역으로 텍스트 세그먼트(Text Segment)라고 불린다. 권한 : 읽기, 실행 *쓰기 권한이 있으면 공격자가 악의적인 코드를 삽입하기 쉬워지므로, 대부분의 현대 운영체제는 이 세그먼트에 쓰..