본문 바로가기

전체 글

(68)
[시스템해킹] NX & ASLR NX(No-eXecute): 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법 인텔-XD(eXecute Disable), AMD-NX, 윈도우-DEP(Data Execution Prevention, ARM-XN(eXecute Never) - 코드 영역에 쓰기 권한이 있으면 공격자는 코드를 수정하여 원하는 코드가 실행되게 할 수 있고, - 스택, 데이터 영역에 실행 권한이 있으면 system 함수 등을 실행시켜 공격을 시도할 수 있음 - CPU가 NX를 지원하면 컴파일러 옵션을 통해 바이너리에 NX를 적용할 수 있으며, NX가 적용된 바이너리는 실행될 때 각 메모리 영역에 필요한 권한만을 부여받음 - NX가 적용된 바이너리는 코드 영역 외에는 실행 권한이 없음 ASLR(Add..
[시스템해킹] Background: Calling Convention(함수 호출 규약) 함수 호출 규약: 함수의 호출 및 반환에 대한 약속 - 함수에서 다른 함수를 호출할 때, 프로그램의 실행 흐름은 다른 함수로 이동 - 호출한 함수가 반환하면 다시 원래의 함수로 돌아와 기존의 실행 흐름대로 - 함수 호출 시 반환 이후를 위해 호출자(Caller)의 상태(Stack frame) 및 반환 주소(Return Address)를 저장해야 함 - 호출자는 피호출자(Callee)가 요구하는 인자를 전달해줘야 하며, 피호출자의 실행이 종료될 때 반환 값을 전달받아야 함 CPU 아키텍처에 따라, 컴파일러에 따라 호출 규약이 다를 수 있음 x86-64 아키텍처에서는 MSVC(컴파일러)는 MS x64 호출 규약 적용, gcc는 SYSTEM V 호출 규약 적용 x86-64 호출 규약: SYSV 1. 6개의 인..
[시스템해킹] Background: x86 Assembly 어셈블리 언어 : 컴퓨터의 기계어와 치환되는 언어 - 명령어 집합구조(ISA)에 따라(IA-32, x86-64, ARM, MIPS ...) 많은 수의 어셈블리어 존재 x86-64 어셈블리 언어 문법 구조: 명령어(Opcde)와 목적어에 해당하는 피연산자(Operand) Opcode 종류 기본 어셈블리 데이터 이동: 어떤 값을 레지스터나 메모리에 옮기도록 지시 mov dst, src: src에 들어있는 값을 dst에 대입 lea dst, src: src의 유효 주소를 dst에 저장 lea rsi, [rbx+8*rcx]: rbx+8*rcx를 rsi에 대입 산술 연산: 덧셈, 뺄셈, 곱셈, 나눗셈 연산 add dst, src: dst에 src의 값을 더함 sub dst, src: dst에서 src의 값을 뺌 ..
[시스템해킹] Background: Linux Memory Layout 리눅스의 메모리 구조 적재되는 데이터의 용도별로 5가지 세그먼트(segment)로 구분 코드 세그먼트(Code segment = Text segment): 실행 가능한 기계 코드가 위치하는 영역 프로그램 동작을 위해 읽기, 실행 권한 부여 쓰기 권한이 부여되면 공격자가 악의적인 코드를 삽입할 수 있으므로 대부분 운영체제에서 쓰기 권한 제거 int main() { return 31337; } -> main 함수가 컴파일되면서 기계 코드로 변환되고, 이 기계 코드가 코드 세그먼트에 위치 데이터 세그먼트(Data segment): 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치 CPU가 데이터를 읽어야 하므로 읽기 권한 부여 쓰기 권한 여부에 따라 또다시 2개의 세그먼트로 분류 data segme..
[시스템해킹]Background: 컴퓨터 구조, 레지스터, ... 컴퓨터 구조(Computer Architecture) : 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법 컴퓨터 기능 구조에 대한 설계, 명령어 집합 구조, 마이크로 아키텍처, 그리고 기타 하드웨어 및 컴퓨팅 방법에 대한 설계 등이 포함 - 컴퓨터 기능 구조에 대한 설계: 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능들이 컴퓨터에 필요한지 고민하고, 설계하는 분야 - 명령어 집합 구조(Instruction Set Architecture): CPU가 처리해야 하는 명령어를 설계하는 분야 - 마이크로 아키텍처(Micro Architecture): CPU의 하드웨어적인 설계, 명령어 집합을 효율적으로 처리할 수 있도록, CPU의 회로를 설계하는 분야 x8..
[AFL++] binary-only targets 퍼징하는 법 https://github.com/AFLplusplus/AFLplusplus/blob/stable/docs/fuzzing_binary-only_targets.md AFLplusplus/docs/fuzzing_binary-only_targets.md at stable · AFLplusplus/AFLplusplus The fuzzer afl++ is afl with community patches, qemu 5.1 upgrade, collision-free coverage, enhanced laf-intel & redqueen, AFLfast++ power schedules, MOpt mutators, unicorn_mode, and a lot more!... github.com 소스 코드는 없고 바이너리만..
[시스템해킹] 드림핵 워게임 basic_exploitation_000 유형: Stack Overflow basic_exploitation_001.c #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void read_flag() { system("cat /flag"); } int main(int argc, char *argv[]) { char buf[0x80]; initialize(); gets(buf); return 0; } mai..
[운영체제] Memory Management (2) Hierarchical Paging Page table size 구하기 / 32bit address, 4KB page size 32bit CPU 혹은 OS; I/O단위가 32bit, 입출력이 32bit 단위로 => 32bit 주소체계 -> logical address space 최대 주소 2^32-1; 크기 = 2^32 -> page size 4KB(=2^12) -> 2^32 / 2^12 = 2^20(=1 million) 개의 logical pages -> 1 million 2^20 page table entries -> 각 page table entry당 physical 주소 저장, 주소 체계가 32 비트니까 32비트 즉 4 Bytes 필요 -> 2^20마다 4 Bytes가 필요, 프로세스 당 page..