본문 바로가기

전체 글

(73)
[시스템해킹] 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..
[운영체제] Memory Management (1) 기본적으로 메모리 관리는 CPU가 프로그램을 수행할 수 있도록 만들어 주는 것 명령어 가져올 때 메모리에서 주소 가져옴 -> 효율적 관리 필요 메인 메모리는 느려, 캐시 사용 Binding 변수의 주소를 실제로 매핑시키는 것, 메모리 상 물리 주소를 변수의 주소를 매핑시키는 것 binding 시점에 따라 3가지로 나뉨 Compile time binding: 컴파일 할 때 매핑 -> 컴파일되면 프로그램 코드 안에 변수 주소가 하드코딩됨 프로그램이 무조건 커널 다음 번지에 올라간다고 해놓음 다른 컴퓨터에서 실행된다면 커널의 크기가 달라져 -> 프로그램 시작점이 달라져 -> 다시 컴파일해야함; flexibility 매우 떨어져 Load time binding: 프로그램 시작 프로세스 위치 0번지라고 가정, 상..
[그래프] 백준 1389 c++ 케빈 베이컨의 6단계 법칙 오 어려움 예전에 풀려고 했다가 못 풀었던 거 같음 브루트포스가 아닐까 하는 생각 ... for(int i=1; i> M; int min_dist[101][101] = {0, }; vector con; vector v; con.push_back(v); // 친구 배열 채워주기 for(int i=0; i> r >> c; arr[r][c] = 1; arr[c][r] = 1; } for(int i=1; i
[그래프] 백준 1260 c++ / Nested Functions, 정적배열과 동적배열, memset .. 몇 가지 궁금점 그래프 탐색 결과를 출력해야 하는데 문득 main 함수 내에 dfs, bfs 함수를 정의할 수 있을지 궁금해졌음 -> 바보같은 생각 걍 main 밖에 함수 정의하고 cout 하면 됨 그래도 중첨 함수 선언에 대해 알아보자 Nested Functions, 중첩 함수 Nested functions이란 다른 함수의 내부에 정의된 함수이다. nested function 예시) foo (double a, double b) { double square (double z) { return z * z; } return square (a) + square (b); } GNU C 확장에선 지원되지만 GNU C++에서는 지원되지 않는다고. 참고: https://gcc.gnu.org/onlinedocs/gcc..