System/System Hacking

    [Protection Tech.] RELRO

    RELRO (RELocation Read-Only) ELF 바이너리(프로세스)의 다이나믹 섹션에 읽기 권한만을 부여해 데이터 섹션의 보안을 강화하는 보호기술 * Lazy Binding 바이너리가 실행되는 도중 함수가 처음 호출될 때 주소를 찾는 방식 ELF 바이너리에서 동적 라이브러리의 함수를 호출할 때 호출된 함수를 찾기 위해 PLT와 GOT를 사용하는데 이 때 GOT가 사용되는 방식과 같다. PLT, GOT 정리▷▶doongdangdoongdangdong.tistory.com/117?category=869864 Lazy Binding을 하기 위해서는 프로그램이 실행되는 도중 GOT에 라이브러리 함수의 주소를 덮어써야 한다. 즉, GOT에 쓰기 권한이 있어야한다. ==> RELRO가 설정되어 있는 바이..

    FSB (Format String Bug)

    dreamhack.io/learn/3#23 dreamhack FSB 강의를 수강하며 정리한 내용이다ヽ(✿゚▽゚)ノ FSB (Format String Bug) printf()나 sprintf()처럼 포맷 스트링을 사용하는 함수에서 사용자가 포맷 스트링 문자열을 통제할 수 있을 때 발생하는 취약점; 프로그래머가 지정한 문자열이 아닌 사용자의 입력이 포맷 스트링으로 전달될 때 발생하는 취약점이다. 프로그램내에 이 취약점이 있으면 프로그램의 임의의 주소의 값을 읽고 쓸 수 있기 때문에 아주 위험하다. 포맷 스트링을 사용하는 대표적 함수들 printf sprintf / snprintf fprintf vprintf / vfprintf vsprintf / vsnprintf 포맷 스트링의 종류 % : "%"문자를 출력..

    [Protection Tech.] Canaries(카나리), SSP

    Canaries (Canary word) 버퍼 오버플로우를 모니터하기 위해 버퍼와 제어 데이터(SFP) 사이에 설정된 값; 버퍼 오버플로우가 발생하면 canary의 값이 손상되고 canaries 데이터의 검증에 실패해 오버플로우에 대한 경고가 출력되고 손상된 데이터를 무효화 처리한다. 버퍼 Canary SFP △ 카나리가 적용된 경우 스택 구조 Canaries의 종류 ➰ Terminator Canaries canary 값을 문자열의 끝을 나타내는 문자들-NULL(0x00), CR(0x0d), LF(0x0a) EOF(0xff)-을 이용해 생성한다. 공격자가 이 canaries를 우회하기 위해서는 return address를 쓰기 전에 null 문자를 써야한다. null 문자는 overflow를 방지하게 한..

    [Protection Tech.] ASLR

    ASLR = Address Space Layout Randomization = 메모리 손상 취약점 공격을 방지하기 위한 기술; 라이브러리, 힙, 스택 영역 등의 주소를 바이너리가 실행될 때마다 랜덤하게 바꿔 RTL 등 정해진 주소를 이용한 공격을 막는 보호기법이다. Detecting ASLR NX bit의 경우 바이너리의 컴파일 옵션에 따라 적용 여부를 결정했지만 ASLR은 서버의 설정파일에 의해 적용 여부가 결정된다. ▷Ubuntu16.04: /proc/sys/kernel/randomize_va_space 파일의 값을 통해 확인할 수 있다. ▶설정 파일의 값 0 ASLR을 적용하지 않음 (해제) 1 스택, 라이브러리 메모리를 랜덤화 2 스택, 힙, 라이브러리 메모리를 랜덤화 현재 설정되어 있는 ASLR..

    PLT, GOT

    PLT, GOT Procedure Linkage Table(PLT) = 외부 라이브러리 함수를 사용할 수 있도록 주소를 연결해주는 역할을 하는 테이블 ▷ PLT의 주소는 고정되어 있기 때문에 서버에 ASLR 보호기법이 적용되어 있어도 PLT로 점프하면 RTL과 비슷하게 공격할 수 있다, Global Offset Table(GOT) = PLT에서 호출하는 resolve 함수를 통해 구한 라이브러리 함수의 절대 주소가 저장되어 있는 테이블 ▷ 초기에는 라이브러리 함수의 주소를 구하는 바이너리 코드 영역의 주소가 저장되어 있다가, 함수가 처음 호출되면서 라이브러리 함수의 실제 주소가 저장된다. ASLR이 적용되어 있는 환경에서, 동적으로 라이브러리를 링크해 실행되는 바이너리(Dynamically Linked ..

    [Protection Tech.] NX bit

    NX bit = No(Never) eXecute bit (실행 방지 비트) = 메모리에 쓰기 권한과 실행 권한을 동시에 부여하지 않음으로 해당 프로그램의 공격을 어렵게 한다; 프로세스 명령어나 코드, 데이터의 저장을 위한 메모리 영역을 따로 분리하는 CPU의 기술이다. → NX bit가 적용된 메모리 구역은 데이터 저장을 위해서만 사용되고, 프로세서 명령어가 실행되지 않도록 한다. DEP = Data Execution Prevention = MS Windows 운영 체제에 포함된 보안기능으로, 악의적인 코드가 실행되는 것을 방지하기 위해 메모리를 추가적으로 확인하는 HW 및 SW 기술이다. - 하드웨어 DEP: 메모리에 명시적으로 실행코드가 포함되어 있는 경우를 제외하고 프로세스의 모든 메모리 위치에서 ..

    [Heap] Memory Leak

    Memory Leak 메모리가 해제되면서 unsorted bin에 들어가는 힙은 main_arena 영역의 주소가 FD와 BK에 저장된다. main_arena는 libc.so.6 라이브러리의 구조체이기 때문에 main_arena의 주소를 알아내 계산을 하면 라이브러리 함수의 주소를 구할 수 있게 된다. leak1 // gcc -o leak1 leak1.c #include #include int main() { char *ptr = malloc(0x100); char *ptr2 = malloc(0x100); free(ptr); ptr = malloc(0x100); printf("0x%lx\n", *(long long *)ptr); return 0; } 0x100 크기의 힙을 할당-해제하며 unsorted ..

    [Heap] House of Force

    House of Force top chunk의 size를 조작함으로써 임의의 주소에 힙 청크를 할당할 수 있게 하는 공격 기법 static void * _int_malloc (mstate av, size_t bytes) { INTERNAL_SIZE_T nb; /* normalized request size */ ... mchunkptr remainder; /* remainder from a split */ unsigned long remainder_size; /* its size */ ... use_top: victim = av->top; size = chunksize (victim); if ((unsigned long) (size) >= (unsigned long) (nb + MINSIZE)) { re..

    [Heap] The House of Spirit

    House of Spirit fake fastbin chunk를 해제(free)하면서 malloc 할당 시 임의의 포인터를 반환하도록 함으로써 원하는 주소에 값을 쓸 수 있게 하는 공격방식이다. >> 같은 크기만큼을 재할당할 때, 같은 주소를 반환하는 fastbin의 특성을 이용 (fastbin을 공격하는 기법) stack에 가짜 청크를 쓰고 해당 stack의 주소에서 0x10(64bit기준) 더한 주소로 free()를 호출할 수 있을 때 구현가능하다. stack에 fastbin에 해당하는 크기의 fake chunk를 작성하고 malloc()으로 메모리를 할당한다. 그리고 fake chunk의 주소+0x10인 주소에 free()를 호출해 해당 chunk가 fastbin에 저장되게 한다. 해당 chunk의..

    [Heap] UAF(Use-After-Free)

    UAF (Use-After-Free) Use-After-Free vulnerabilities are a type of memory corruption flaw that can be leveraged by hackers to execute arbitrary code. Use After Free specifically refers to the attempt to access memory after it has been freed, which can cause a program to crash or, in the case of a Use-After-Free flaw, can potentially result in the execution of arbitrary code or even enable full re..