시스템 해킹/dream hack 10

[dream hack] PIE

PIE ELF의 Position Independent Executable 보호기법과 우회 방법 PIE : Executable, 즉 바이너리가 로딩될 때 랜덤한 주소에 매핑되는 보호기법 원리는 공유 라이브러리와 비슷하다. 컴파일러는 바이너리가 메모리 어디에 매핑되어도 실행에 지장이 없도록 바이너리를 위치 독립적으로 컴파일한다. → 코드 영역의 주소 랜덤화 가능 PIE가 설정되어 있으면 코드 영역의 주소가 실행될 때마다 변하기 때문에 ROP와 같은 코드 재사용 공격을 막을 수 있다. no_pie.c //gcc -o no_pie no_pie.c -m32 #include int main(void){ printf("MAIN addr : 0x%p\n", &main); } pie.c //gcc -o pie pie.c..

[dream hack] RELRO

RELRO Bypassing RELRO Lazy Binding : 바이너리가 실행되는 도중, 함수가 처음 호출될 때 주소를 찾는 방식 (GOT) Lazy Binding을 할 때는 프로그램 실행 도중 GOT에 라이브러리 함수의 주소를 덮어써야 하기 때문에 GOT에 쓰기 권한이 있어야 한다. GOT에 값을 쓸 수 있다는 특징때문에 GOT overwrite 같은 공격이 가능하다. 하지만 Relocation Read-Only 보호기법이 설정되어 있으면 GOT와 같은 다이나믹 섹션이 읽기 권한만을 가지게 된다. example7.c // gcc -o example7 example7.c -mpreferred-stack-boundary=2 -Wl,-z,relro,-z,now #include void arbitrary_..

[dream hack] SSP

Stack Smashing Protector 메모리 커럽션 취약점 중 스택 버퍼 오버플로우 취약점을 막기 위해 개발된 보호 기법. 스택 버퍼와 스택 프레임 포인터 사이에 랜덤 값을 삽입해 함수 종료 시점에서 랜덤 값 변조 여부를 검사함으로써 스택이 망가뜨려졌는지를 확인한다. SSP 보호 기법이 적용되어 있다면 함수에서 스택을 사용할 때 카나리가 생성된다. 마스터 카나리는 main함수가 호출되기 전에 랜덤으로 생성된 카나리를 스레드 별 전역 변수로 사용되는 TLS에 저장한다. TLS 영역은 _dl_allocate_tls_storage 함수에서 __libc_memalign 함수를 호출하여 할당된다. TLS는 tcbhead_t 구조체를 가지는데, 다음과 같은 멤버 변수들이 존재한다. typedef struct..

[dream hack] ASLR

Linux Exploitation & Mitigation Part 2 1. ASLR Address Space Layout Randomization 라이브러리, 힙, 스택 영역 등의 주소를 바이너리가 실행될 때마다 랜덤하게 바꿔 RTL과 같이 정해진 주소를 이용한 공격을 막기 위한 보호 기법이다. NX bit는 바이너리의 컴파일 옵션에 따라 적용 여부가 결정되었지만 ASLR은 서버의 설정 파일에 의해 보호 기법의 적용이 결정된다. Ubuntu 16.04에서는 다음 파일의 값을 확인하면 서버의 ASLR 설정 여부를 알 수 있다. /proc/sys/kernel/randomize_va_space 설정 파일 값의 의미 0 : ASLR을 적용하지 않음 1 : 스택, 힙 메모리를 랜덤화 2 : 스택, 힙, 라이브러리..

[dream hack] NX bit

Linux Exploitation & Mitigation Part1 NX bit 일반적인 프로그램에서의 스택 메모리는 코드를 실행하는 용도로 사용되는 것이 아니라, 일시적으로 데이터를 읽고 쓰는 데 사용되기 때문에 실행 권한이 있을 필요가 없다. 이러한 이유로 프로그램의 공격을 어렵게 하기 위해 메모리에 쓰기 권한과 실행 권한을 동시에 부여하지 않는 No-eXecute bit가 등장하였다. example2.c 셸코드를 데이터 영역에 저장한 후 main 함수에서 이를 실행. #include unsigned char code[] = \ "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x31\xd2\xb0\x0b\xcd\x80"; i..

[dream hack] NOP Sled

Linux Exploitation & Mitigation Part 1 3. NOP Sled NOP = "No OPeration" xchg eax, eax와 같이 프로그램의 실행에 영향을 주지 않는 명령어이다. 프로그램이 실행 중에 NOP 명령어를 만나면 다음 명령어로 넘어가는 것 같은 효과를 준다. 주로 명령어의 주소 alignment를 맞출 때 사용된다. x86 아키텍처의 NOP 명령어 바이트 코드 0x90 NOP Sled, 혹은 NOP Slide는 주로 셸코드의 셸코드의 주소를 정확히 알아내기 힘들 경우 큰 메모리를 확보해 셸코드의 주소의 오차 범위를 크게 만들 때 사용한다. 익스플로잇 확률을 올리는 데 큰 도우밍 된다. 더보기 0x100 주소에 셸코드가 저장되어 있다고 가정해보자. NOP Sled가..

[dream hack] Return address overwrite

Linux Exploitation & Mitigation Part 1 2. Return Address Overwrite RET Overwrite 스택 버퍼 오버플로우 취약점을 공격하는 방법 스택 버퍼 오버플로우 취약점이 있을 때는 주로 스택의 리턴 주소를 덮는 공격을 한다. 스택에 저장된 리턴 주소를 다른 값으로 바꾸면 실행 흐름을 조작할 수 있다. *리턴주소 : 함수가 끝나고 돌아갈 이전 함수의 주소 example.c // gcc -o example1 example1.c -fno-stack-protector -z execstack -mpreferred-stack-boundary=2 -m32 #include int vuln(char *src) { char buf[32] = {}; strcpy(buf, s..

[dream hack] Linux Exploitation & Mitigation Part 1 - 1. ELF 동적 분석

강의 링크 ELF 동적 분석 Intro 바이너리를 분석할 때, 바이너리가 실행되며 변화하는 상태를 관찰하기 위해 동적 디버깅이 필요한 경우가 있다. 리눅스의 실행 파일인 ELF파일을 동적으로 디버깅하는 방법에 대해 알아보자. 도구 gdb, strade, Itrade, IDA 등이 있다. gdb의 디스어셈블리 문법에는 AT&T와 intel 두 종류가 있다. 널리 쓰이는 디스어셈블리 문법은 intel이다. gdb 기본 설정에서의 디스어셈블리 문법은 AT&T이기 때문에 intel로 바꿔줘야 한다. .gdbinit는 gdb를 시작할 때 자동적으로 실행할 gdb 명령어들을 저장하고 있는 파일이다. .gdbinit에 gdb의 디스어셈블리 문법을 intel로 바꿔주는 명령어인 set disassembly-flavor..

[dreamhack] Memory Corruption - C (I) 스택 버퍼 오버플로우

강의링크 1. 버퍼 오버플로우 버퍼 오버플로우란? C언어에서 버퍼란 지정된 크기의 메모리 공간이라는 뜻이다. 버퍼 오버플로우는 버퍼가 허용할 수 있는 양의 데이터보다 더 많은 값이 저장되어 버퍼가 넘치는 취약점이다. 발생하는 위치에 따라 스택 버퍼 오버플로우, 힙 오버플로우로 나뉜다. 그 이유는 인접한 메모리를 오염시키는 취약점이기 때문에 어떤 메모리를 오염시킬 수 있는지에 따라 공격 방법이 달라지기 때문이다. 스택 버퍼 오버플로우 스택 버퍼 오버플로우는 지역 변수가 할당되는 스택 메모리에서 오버플로우가 발생하는 경우다. 8 바이트의 버퍼 A와 8바이트 데이터 버퍼 B가 메모리에 선형적으로 할당되었다고 생각해보라. 버퍼 A에 16바이트의 데이터를 복사한다면 이 데이터의 뒷부분은 버퍼 A를 넘어 뒤에 있는..