[dreamhack] Tool: gdb
2022. 3. 26. 16:21
Study/System Hacking
gdb & pwndbg 예제 코드 // Name: debugee.c // Compile: gcc -o debugee debugee.c -no-pie #include int main(void) { int sum = 0; int val1 = 1; int val2 = 2; sum = val1 + val2; printf("1 + 2 = %d\\n", sum); return 0; } 리눅스는 실행파일의 형식으로 ELF(Executable and Linkable Format)를 규정하고 있다. ELF는 크게 헤더와 여러 섹션들로 구성되어 있는데 헤더에는 실행에 필요한 여러 정보가 적혀 있고 섹션들에는 컴파일된 기계어 코드, 프로그램 문자열을 비롯한 여러 데이터가 포함되어 있다. ELF의 헤더 중에 진입점(Entry..
[dreamhack] x86 Assembly
2022. 3. 26. 03:22
Study/System Hacking
어셈블리어와 x86-64 어셈블리 언어 컴퓨터의 기계어와 치환되는 언어로 기계어가 여러 종류 있다면 어셈블리어도 그만큼 다양하게 존재한다. ISA에는 IA-32, x86-64, ARM 등등 여러 종류가 있는데 이 종류만큼의 어셈블리어가 존재하는 것이다. 드림핵에서는 x86-64 어셈블리 언어만 다룬다. x86-64 어셈블리 언어 기본 구조 명령어(Operation Code, Opcode) + 피연산자(Operand) 명령어 명령 코드 데이터 이동(Data Transfer) mov, lea 산술 연산(Arithmetic) inc, dec, add, sub 논리 연산(Logical) and, or, xor, not 비교(Comparison) cmp, test 분기(Branch) jmp, je, jg 스택(S..
[dreamhack] Linux Memory Layout
2022. 3. 25. 18:52
Study/System Hacking
리눅스 프로세스의 메모리 구조 세그먼트 세그먼트는 적재되는 데이터의 종류별로 메모리의 구역을 나눈 것으로 용도에 따라 5가지로 구분한다. 코드 세그먼트 데이터 세그먼트 BSS 세그먼트 스택 세그먼트 힙 세그먼트 메모리의 구역을 나누면 운영체제가 용도에 따라 적절한 접근권한을 설정할 수 있다는 장점이 있다. 접근권한에는 읽기, 쓰기, 실행이 존재하고 CPU는 부여된 권한에 대해서만 행동할 수 있다. ex) 데이터 세그먼트는 프로그램이 실행되면서 사용되는 데이터가 적재된다. CPU는 해당 메모리에서 값을 읽어와야 하므로 읽기 권한이 주어진다. 대신 이곳의 데이터는 실행 대상이 아니기 때문에 실행 권한이 주어지지 않는다. 코드 세그먼트 실행 가능한 기계 코드가 위치하는 영역으로 텍스트 세그먼트(Text Seg..
[dreamhack] Computer Architecture
2022. 3. 25. 14:57
Study/System Hacking
컴퓨터 구조와 명령어 집합 구조 컴퓨터 구조 컴퓨터가 잘 작동할 수 있게 고안한 컴퓨터 도면으로 아래와 같은 것들이 있다. 컴퓨터의 기능 구조에 대한 설계 명령어 집합구조 마이크로 아키텍처 기타 하드웨어 및 컴퓨팅 방법에 대한 설계 폰 노이만 구조 오늘 날 현대 컴퓨터의 구조로 연산, 제어, 저장 세 가지의 핵심 기능이 실행될 수 있는 컴퓨터 구조다. 중앙처리장치(Central Processing Unit, CPU), 기억장치(memory), 버스(bus)로 구성된다. 중앙처리장치(Central Processing Unit, CPU) CPU는 컴퓨터의 두뇌로 RAM에서 코드를 가져오고, 실행하고, 결과를 저장하는 일련의 모든 과정을 수행한다. CPU에는 산술 논리 연산을 처리하는 ALU, 제어장치인 CU..
[lazenca] Protection Tech / RELRO & PIC & PIE
2021. 2. 22. 20:56
Study/System Hacking
- RELRO(RELocation Read-Only) = ELF 바이너리 / 프로세스의 데이터 섹션의 보안을 강화하는 일반적인 기술 Partial RELRO Full RELRO - 바이너리 파일 보호기법 적용 확인 방법 checksec.sh --file ./RELRO-Relro - Program header & Dynamic Section → RELRO 적용시 "Program Header"와 "Dynamic Section"의 변화 확인가능 ˙Partial RELRO Program Header'에 'RELRO' 영역(Read only)이 생성 해당 영역에 생성되는 Section: INIT_ARRAY, FINI_ARRAY → GOT영역을 덮어쓰기 가능 ˙Full RELRO Progra..
[dreamhack] Linux Exploitation & Mitigation Part 3 / SSP & RELRO & PIE
2021. 2. 21. 15:40
Study/System Hacking
- SSP(Stack Smashing Protector) SSP는 메모리 커럽션 취약점 중 스택 버퍼 오버플로우 취약점을 막기 위해 개발된 보호 기법으로 스택 버퍼와 스택 프레임 포인터 사이에 랜덤 값을 삽입하여 함수 종료 시점에서 랜덤 값 변조 여부를 검사함으로써 스택이 망가뜨려졌는지를 확인한다. SSP 보호 기법이 적용되어 있다면 함수에서 스택을 사용할 때 카나리가 생성되는데, 카나리는 스택 버퍼와 스택 프레임 포인터 사이에 랜덤으로 삽입된는 값으로 카나리 값의 변조 여부를 통해 BOF를 감지할 수 있다. 이렇게 랜덤으로 생성된 카나리 값은 모든 쓰레드에서 동일하게 사용할 수 있도록 전역변수로 사용되는 TLS 영역에 저장한다. 이렇게 TLS영역에 저장된 카나리를 마스터 카나리라고 하고, 스택 버퍼와 ..
[LOB] troll -> vampire
2021. 2. 12. 18:42
Study/System Hacking
이번에는 vampire로 가는 패스워드를 알아보자. 일단 troll에 로그인한다. 파일 목록을 살펴보면 vampire.c 파일이 있는 것을 볼 수 있다. cat명령으로 출력시켜보자. 코드를 순차적으로 보면 인자의 개수에는 제한이 없고, ret에 덮을 주소는 스택 영역의 주소여야 하며, argv[1][46], 즉 return address의 상위 2번째 바이트가 \xff가 아니어야 한다. 이로 봤을 때 argv[2]에 쉘코드를 삽입하고, ret 영역에 argv[2]의 주소를 덮어씌우면 될 것 같다. 이때 return address의 상위 2번째 바이트가 \xff가 아니어야 한다는 것은 더 낮은 메모리 주소를 가져야 한다는 뜻이다. 스택의 특성상 낮은 메모리 주소를 가지려면 스택프레임의 크키가 커져야 한다...
[lazenca] Protection Tech / ASLR & Canaries
2021. 2. 12. 17:18
Study/System Hacking
ASLR(Address Space Layout Randomization)이란? 메모리 손상 취약점 공격을 방지 하기 위한 기술 스택, 힙, 라이브러리 등의 주소를 랜덤한 영역에 배치하여, 공격에 필요한 Target address를 예측하기 어렵게 만든다. 프로그램이 실행 될 때 마다 각 주소들이 변경된다. 예를 들어 Return-to-libc 공격을 하기 위해서는 공유 라이브러리에서 사용하려는 함수의 주소를 알아야 하는데 이러한 주소 값들이 프로그램이 호출 될때 마다 바뀐다면 공격이 어려워진다(불가능하지는 않음). - Set ASLR cmd echo 0 > /proc/sys/kernel/randomize_va_space option 0 : ASLR 해제 1 : 랜덤 스택 & 랜덤 라이브러리 설정 2 : ..
[dreamhack] Linux Exploitation & Mitigation Part 2 / ASLR & PLT, GOT Section
2021. 2. 12. 15:32
Study/System Hacking
- ASLR Address Space Layout Randomization(ASLR)은 라이브러리, 힙, 스택 영역 등의 주소를 바이너리가 실행될 때마다 랜덤하게 바꿔 RTL과 같이 정해진 주소를 이용한 공격을 막기 위한 보호 기법이다. Ubuntu 16.04에서는 /proc/sys/kernel/randomize_va_space 파일의 값을 확인하면 서버의 ASLR 설정 여부를 알 수 있다. 설정 파일의 값으로는 0, 1, 2가 있고, 각 값은 아래와 같은 의미를 갖는다. 0 : ASLR을 적용하지 않음 1 : 스택, 힙 메모리를 랜덤화 2 : 스택, 힙, 라이브러리 메모리를 랜덤화 만약 해당 파일의 값이 2가 아니라면, 루트 권한으로 다음 명령어를 실행하여 ASLR 보호 기법을 적용할 수 있다. # c..