System Hacking 23

Logical Bug : Type Error

자료형 : 변수의 크기를 정의, 용도를 암시 -> int (예) - 4바이트의 공간이 할당 & 해당 메모리 대상으로 연산 실행 (한번 할당된 메모리는 확장되거나 줄지x) => 1바이트: 0xff 를 넘어서면 0x100이 아닌 0x00이 되어 데이터가 유실 (overflow) => 4바이트: 0x0123456789abcdef대입 시 0x 89abcdef만 저장되고 나머지는 유실 ==> Type Error 타입 에러 자료형 변수의 자료형 선언 : 변수를 활용하는 동안 담게 될 크기 ,용도, 부호 여부 등을 고려해야 : 같은 자료형이어도 os 에 따라 크기가 달라질 수 o ( long : 4바이트(32bit) / 8바이트 (64bit)) 자료형크기범위용도 (signed) char 1 바이트 정수, 문자 uns..

System Hacking 2024.03.22

Double Free Bug | dreamhack

Memory Corruption : Double Free Bug: free로 청크 해제시 tcache나 bins에 추가하여 관리 - 다시 유사크기 재요청 시에 청크 재할당 by 이중 원형 연결리스트 탐색:이때! free로 해제한 청크로 다시 free할 때 발생하는 현상 free : 청크를 추가 / malloc은 청크를 꺼냄=> 임의의 청크 1개에 대해 free를 두번이상 적용 => 청크를 free list (tcache / bins 등) 에 여러번 추가할 수 있음을 의미==> 중복 청크 (duplicated) free list 를 이용하면 임의 주소에 청크를 할 수 있는 취약점 : DFB 취약점   Double Free Bug (DFB)같은 청크를 두 번 해제할 수 있는 버그 : 공격자에게 임의 주소 쓰..

System Hacking 2024.03.17

Use After Free | dreamhack

ptmalloc2 memory allocator는 한정된 메모리 자원을 각 프로세스에 효율적으로 배분하여 동적으로 할당하고, 할당한 메모리의 쓰임이 다하면 해제하여 관리한다. memory allocator에 사용되는 알고리즘 : 리눅스 - ptmalloc2 / 구글 - tcmalloc 등 ptmalloc2 1. 메모리 낭비 방지 메모리 할당 요청이 발생하면, 먼저 해제된 메모리 공간 중에서 재사용할 수 있는 공간 탐색 : 해제된 메모리 공간 중에서 요청된 크기와 같은 크기의 메모리 공간이 있다면 이를 그대로 재사용 2. 빠른 메모리 재사용 tcache 또는 bin이라는 연결 리스트에 해제된 메모리 공간의 주소를 기억 : 서로다른 크기의 메모리 공간을 저장 => 특정 크기 할당 요청 시 크기에 관련된 저장..

System Hacking 2024.03.17

Format String Bug | dreamhack

Memory Corruption : Format String Bug format string을 인자로 사용하는 함수 : scanf, fprintf, fscanf ... 등 => 포맷 스트링을 채울 값들을 레지스터나 스택에서 가져옴 그러나, 필요로 하는 인자의 개수 & 함수로 전달된 인자의 개수를 비교하는 검증이 존재x => 악의적으로 다수의 인자요청 - 레지스터나 스택을 읽거나 쓸 수 o :: FSB (format string bug) 포맷 스트링 - specifier 형식 지정자 : d 10진수정수 / s 문자열 / x 부호없는 16진수 / n 현재까지 사용된 문자열의 길이를 저장 / p void형 포인터 -width 최소 너비 지정 : 최소 너비 지정 -> 더 짧으면 공백문자를 패딩 : 예 ) %.5..

System Hacking 2024.03.17

Out of bounds | dreamhack

Memory Corruption : out of bounds 배열 : 자료형의 element요소로 구성 , 각 위치 idx -> 배열의 임의 인덱스에 접근할 수 있는 취약점 : out of bounds 배열의 속성 배열은 연속된 메모리 공간 -> (요소의 개수) * (요소 자료형의 크기) sizeof(array) = sizeof(elem) * n 배열의 길이 length = n &sizeof[k] = array + sizeof(elem)*k Out of Bounds (OOB) OOB는 요소 참조 시, idx가 음수 or 배열의 길이를 벗어날 때 발생 ==> 배열을 벗어난 참조 임의 주소 읽기 / 쓰기 OOB로 임의의 주소 읽기 : 읽으려는 변수와 배열의 offset 을 알아야 ! -> 변수 & 배열이 같..

System Hacking 2024.03.17

PIE & RELRO (2) | dreamhack

+one gadget one-gadget / magic-gadget 란? 실행시 셸이 획득되는 코드 뭉치 ( david942j가 만들어놓은 툴) 기존 ) 셸 획득을 위해 여러 개의 gadget을 조합한 ROP chain을 구성 / RTL 공격 원가젯 ) 단일 가젯만으로도 셸을 실행할 수 있는 강력한 도구 (https://github.com/david942j/one_gadget) 원 가젯은 libc의 버전마다 다르게 존재하며, 제약 조건도 다르므로 필요에 따라 상황에 맞는 가젯을 사용하거나, 제약 조건을 만족하도록 사전에 조작해주어야 한다. : 함수에 인자를 전달하기 어려울 떄 유용하다 #!/usr/bin/env python3 # Name: fho_og.py from pwn import * p = proc..

System Hacking 2024.03.17

PIE & RELRO(1) | dreamhack

PIE와 PIC PIC (position-independent-code) 리눅스에서 ELF 는 실행파일 (executable) 또는 공유 오브젝트(shared object, 라이브러리 파일) 로 구성 공유 오브젝트는 기본적으로 relocation 가능하도록 설계 (상대 참조를 통해) => 메모리의 어느 주소에 적재되어도 코드의 훼손x ==> 이러한 코드를 PIC 라고 한다. HOW? 매핑 방식이 다름. pic 코드는 rip를 기준으로 상대 참조를 하여 무작위 주소에 매핑되어도 executable. PIE (position-independent-exceutable) 무작위 주소에 매핑되어도 실행 가능한 실행 파일 =>ASLR 도입시에 실행 파일도 무작위하게 매핑하고 싶었으나, 호환성 문제 ==> 재배치가 ..

System Hacking 2024.03.16

Bypass NX & ASLR(2) | dreamhack

ROP & basic_rop_x64 실습 Return Oriented Programming (ROP) 공격기법 : 셸 코드에서 라이브러리 함수의 실행, 다수의 리턴 가젯을 연결해서 사용하는 ROP : 현실적으로 ASLR이 걸린 환경에서 system함수를 사용하려면 process에서 libc가 매핑된 주소를 찾고, 그 주소로부터 system 함수의 오프셋을 이용하여 함수의 주소를 계산 ROT 페이로드는 리턴 가젯으로 구성-> ret 단위로 여러 코드가 연쇄적으로 실행 (ROP chain) rop.c 코드 #include #include int main() { char buf[0x30]; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); // Lea..

System Hacking 2024.03.16

Bypass NX & ASLR(1) | dreamhack

NX (No-eXecute) 실행에 사용되는 메모리 영역, 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법 : code 에 쓰기 권한 -> 코드를 수정하여 악의적 코드 실행 : stack, data에 실행 권한 -> return to shellcode 같은 공격 NX enabled 인 경우, stack 에 rwxp가 아닌 rw-p 가 적용되며, checksec 명령어를 통해 보호기법 확인 가능하다. + intel은 xd, 윈도우는 DEP(data execution prevention), ARM에서는 XN(execute never)이라고 칭한다. ASLR (Address Space Layout Randomization) 바이너리가 실행될 때마다, stack,heap, 공유라이브러리 등을 임의의 주소에 할..

System Hacking 2024.03.15

BOF & Canary | dreamhack

함수 호출 규약 calling convention사용하는 컴파일러, 컴파일러 지원하는 호출 규약 중 CPU 아키텍쳐에 적합한 호출 규약에 따라 종류가 다양하다.c언어 컴파일 시에 리눅스는 주로 gcc를 사용하며,gcc는 x86(32bit)에 대해 cdel 함수 호출 규약을,  x86-64(64bit)에 대해 SYSTEM V호출 규약을 사용한다. x86-64의 호출 규약 | SYSV#define ull unsigned long longull callee(ull a1, int a2, int a3, int a4, int a5, int a6, int a7) { ull ret = a1 + a2 + a3 + a4 + a5 + a6 + a7; return ret;}void caller() { callee(1234..

System Hacking 2024.03.10