반응형

보안/시스템 해킹 19

[ 시스템 해킹 ] Exploit Tech: Return Oriented Programming

스택의 반환 주소를 덮는 공격은 스택 카나리, NX, ASLR이 도입되며 점점 어려워졌다. 공격 기법은 셸 코드의 실행에서 라이브러리 함수의 실행으로, 그리고 다수의 리턴 가젯을 연결해서 사용하는 Return Oriented Programming(ROP)로 발전하였다. NX의 도입으로 셸 코드를 사용할 수 없게 된 것은 공격자에게 큰 제약이 되었다. 그래서 지난 코스 Return to Library에서 살펴본 것과 같이 pop rdi; ret같은 코드 가젯과 라이브러리의 system 함수를 사용하는 공격 기법이 새롭게 등장하였다. 현실적으로, ASLR이 걸린 환경에서 system 함수를 사용하려면 프로세스에서 libc가 매핑된 주소를 찾고, 그 주소로부터 system 함수의 오프셋을 이용하여 함수의 주소..

[ 시스템 해킹 ] Background: Library - Static Link vs. Dynamic Link

1. 라이브러리 라이브러리는 컴퓨터 시스템에서, 프로그램들이 함수나, 변수를 공유해서 사용할 수 있게 한다. 대개의 프로그램은 서로 공통으로 사용하는 함수들이 많다. 예를 들어, printf, scanf, strlen, memcpy, malloc 등은 많은 C 프로그래머들이 코드를 작성하면서 사용하는 함수이다. C언어를 비롯하여 많은 컴파일 언어들은 자주 사용되는 함수들의 정의를 묶어서 하나의 라이브러리 파일로 만들고, 이를 여러 프로그램이 공유해서 사용할 수 있도록 지원하고 있다. 라이브러리를 사용하면 같은 함수를 반복적으로 정의해야 하는 수고를 덜 수 있어서 코드 개발의 효율이 높아진다는 장점이 있다. 또한, 각 언어에서 범용적으로 많이 사용되는 함수들은 표준 라이브러리가 제작되어 있어서 개발자들은 ..

[ 시스템 해킹 ] Mitigation: NX & ASLR

어떤 공격이 새롭게 등장할지는 누구도 예상할 수 없기 때문에 시스템 개발자들은 여러 겹의 보호 기법을 적용하여 시스템이 공격당할 수 있는 표면(Attack Surface)자체를 줄여나가려고 했다. 공격자의 침입을 더 어렵게 하려면, 공격자가 메모리에서 임의 버퍼의 주소를 알기 어렵게 하고, 메모리 영역에서 불필요한 실행 권한을 제거하는 보호 기법을 추가로 도입해야 한다. 이와 관련하여 시스템 개발자들은 Address Space Layout Randomization(ASLR)과 No-eXecute(NX)을 개발하고, 시스템에 적용했다. 1. ASLR Address Space Layout Randomization(ASLR)은 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 ..

[ 시스템 해킹 ] DreamHack WarGame : out_of_bound

1. 문제 문제를 보면 32비트라는 것과 Partial RELRO라는 것을 알 수 있고 카나리, NX는 존재하지만 PIE는 존재하지 않음을 알 수 있다. 2. 코드 #include #include #include #include #include char name[16]; char *command[10] = { "cat", "ls", "id", "ps", "file ./oob" }; 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); ..

[ 시스템 해킹 ] Memory Corruption : Out of Bounds

같은 자료형의 변수나 객체를 여러 개 관리해야 하면, 이들을 요소로 하는 배열을 선언하여 사용한다. 배열은 같은 자료형의 요소(Element)들로 이루어져 있는데, 각 요소의 위치를 인덱스(Index)라고 한다. Out of Bounds (OOB)는 배열의 임의 인덱스에 접근할 수 있는 취약점이다. 배열은 연속된 메모리 공간을 점유하며, 크기는 요소의 개수와 요소 자료형의 크기를 곱한 값이 된다. 배열 각 요소의 주소는 배열의 주소, 요소의 인덱스, 요소 자료형의 크기를 이용하여 계산된다. 1. Out of Bounds OOB는 요소를 참조할 때, 인덱스 값이 음수이거나 배열의 길이를 벗어날 때 발생한다. 개발자가 인덱스의 범위에 대한 검사를 명시적으로 프로그래밍하지 않으면, 프로세스는 앞서 배운 식을 ..

[ 시스템 해킹 ] DreamHack WarGame : oneshot

1. 문제 일단 문제는 위와 같다. 눈에 들어오는건 64-little 라는 것과 partial RELRO이 적용되어있다는 것 카나리가 없다는것, NX와 PIE는 활성화! 2. 코드 // gcc -o oneshot1 oneshot1.c -fno-stack-protector -fPIC -pie #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(60); } int main(int a..

[ 시스템 해킹 ] Exploit Tech: Hook Overwrite

Hook에는 갈고리라는 뜻이 있다. 이런 의미를 담아 컴퓨터 과학에서는 운영체제가 어떤 코드를 실행하려 할 때, 이를 낚아채어 다른 코드가 실행되게 하는 것을 Hooking(후킹)이라고 부르며, 이때 실행되는 코드를 Hook(훅)이라고 부른다. 후킹은 굉장히 다양한 용도로 사용됩니다. 함수에 훅을 심어서 함수의 호출을 모니터링 하거나, 함수에 기능을 추가할 수도 있고, 아니면 아예 다른 코드를 심어서 실행 흐름을 변조할 수도 있다. 예를 들어, malloc과 free에 훅을 설치하면 소프트웨어에서 할당하고, 해제하는 메모리를 모니터링할 수 있다. 이를 더욱 응용하면 모든 함수의 도입 부분에 모니터링 함수를 훅으로 설치하여 어떤 소프트웨어가 실행 중에 호출하는 함수를 모두 추적(Tracing)할 수도 있다..

[ 시스템 해킹 ] Background : PIE

ASLR이 적용되면 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등이 무작위 주소에 매핑되므로, 공격자가 이 영역들을 공격에 활용하기 어려워진다. 그런데 다른 영역의 주소는 계속 변화하는데 main 함수의 주소는 매번 같았다. 이를 이용하여 공격자는 고정된 주소의 코드 가젯을 활용한 ROP(Return Oriented Programming)를 수행할 수 있었다. Position-Independent Executable(PIE)은 ASLR이 코드 영역에도 적용되게 해주는 기술이다. 이 기술은 보안성 향상을 위해 도입된 것이 아니라서 엄밀하게는 보호 기법이 아니다. 그러나 실제로는 공격을 더욱 어렵게 만들었기에 보호 기법이라고 소개되기도 한다. 1. PIC 리눅스에서 ELF는 실행 파일(Execut..

[ 시스템 해킹 ] Background : RELRO

1. RELRO 함수가 처음 호출될 때 함수의 주소를 구하고, 이를 GOT에 적기 위해서는 GOT 테이블을 업데이트할 수 있어야 하므로 GOT에 쓰기 권한이 부여된다. 그런데 이는 바이너리를 취약하게 만드는 원인이 됩니다. 또한, ELF의 데이터 세그먼트에는 프로세스의 초기화 및 종료와 관련된 .init_array, .fini_array가 있다. 이 영역들은 프로세스의 시작과 종료에 실행할 함수들의 주소를 저장하고 있는데, 여기에 임의로 값을 쓸 수 있다면, 프로세스의 실행 흐름이 조작될 수 있다. 리눅스 개발자들은 이러한 문제를 해결하고자 프로세스의 데이터 세그먼트를 보호하는 RELocation Read-Only(RELRO)을 개발했다. RELRO는 쓰기 권한이 불필요한 데이터 세그먼트에 쓰기 권한을 ..

[ 시스템 해킹 ] DreamHack WarGame : Return to Library

1. 문제 Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x400000) 신경 쓸만한 코드는 64비트, Partial RELRO 라는것, 카나리와 NX 가 존재하며 PIE 가 없다는것!!! NX 보호 기법을 우회하는 공격 기법인 RTL(Return To Library)을 이용하여 푸는 문제이다. RTL을 간단하게 설명을 하자면 NX로 인해서 직접 주입한 쉘코드를 실행하는 것이 불가능해졌지만 return address를 수정하는 것은 여전히 가능하기 때문에 여전히 실행 가능한 부분을 이용하여 공격하는 기법이다. 이전 문제에서처럼 get_shell()과 같은 함수가 있으면 그냥 return ..

반응형