19. PLT & GOT
·
시스템 개념
PLT와 GOT PLT ( Procedure Linkage Table) 와 GOT (Global Offset Table) 는 라이브러리에서 동적 링크된 심볼의 주소를 찾을 때 사용하는 테이블이다. 바이너리가 실행되면 ASLR에 의해 라이브러리가 임의의 주소에 매핑된다. 이 상태에서 라이브러리 함수를 호출하면, 함수의 이름을 바탕으로 라이브러리에서 심볼들을 탐색하고, 해당 함수의 정의를 발견하면 그 주소로 실행 흐름을 옮기게 된다. 그런데 만약 반복적으로 호출되는 함수의 정의를 매번 탐색해야 한다면 비효율적일 것이다. 그래서 ELF는 GOT라는 테이블을 두고, resolve된 함수의 주소를 해당 테이블에 저장한다. 그리고 나중에 다시 해당 함수를 호출하면 저장된 주소를 꺼내서 사용한다. 시스템 해킹의 관점..
18. NX 와 ASLR
·
시스템 개념
ASLR Address Space Layout Randomization(ASLR)은 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법이다. ASLR은 커널에서 지원하는 보호 기법이며, 다음의 명령어로 확인할 수 있다. cat /proc/sys/kernel/randomize_va_space 2 리눅스에서 이 값은 0,1 또는 2의 값을 가질 수 있다. 각 ASLR이 적용되는 메모리의 영역은 다음과 같다. - NO ASLR(0) : ASLR을 적용하지 않음. - Conservative Randomization(1): 스택, 힙, 라이브러리, vdso 등 - Conservative Randomization + brk(2): (1)의 영역과 brk로 할당한 영역 아래 ..
16. Background: Library - Static Link vs. Dynamic Link
·
시스템 개념
라이브러리 라이브러리는 컴퓨터 시스템에서, 프로그램들이 함수나, 변수를 공유해서 사용할 수 있게 한다. 대개의 프로그램은 서로 공통으로 사용하는 함수들이 많다. 예를들어, printf, scanf, strlen, memcpy, malloc등은 많은 c 프로그래머들이 코드를 작성하면서 사용하는 함수이다. C언어를 비롯하여 많은 컴파일 언어들은 자주 사용되는 함수들의 정의를 묶어서 하나의 라이브러리 파일로 만들고, 이를 여러 프로그램이 공유해서 사용할 수 있도록 지원하고 있다. 라이브러리를 사용하면 같은 함수를 반복적으로 정의해야 하는 수고를 덜 수 있어서 코드 개발의 효율이 높아진다는 장점이 있다. 또한, 각 언어에서 범용적으로 많이 사용되는 함수들은 표준 라이브러리가 제작되어 있어서 개발자들은 쉽게 해당..
15. Exploit Tech: Return to Shellcode
·
시스템 개념
카나리로 인해 RET에 원하는 주소를 넣었던 공격이 막혔다. 그렇다면 카나리를 우회하는 공격을 하면 된다. 이번엔 카나리를 우회해서, 셸코드와 Return Address Overwrite를 이용해 셸을 획득하겠다. 우선 코드에 있어서 문제점을 찾아보면 버퍼의 크기는 0x50인데 입력은 0x100만큼 받기에 버퍼오버플로우가 발생할 수 있다. 보호기법 탐지 리눅스에는 다양한 바이너리 보호기법이 존재한다. 적용된 보호기법에 따라 익스플로잇 설계까 달라지므로, 분석을 시도하기 전에 먼저 적용된 보호기법을 파악하는 것이 좋다. 보호기법을 파악할 때 주로 사용하는 툴은 checksec이다. checksec을 통해 파악할 수 있는 보호기법은 RELRO, Canary, NX,PIE 이렇게 네가지 이다. r2s바이너리에..
14. Stack Canary
·
시스템 개념
스택 카나리는 스택 버퍼 오버플로우로부터 반환 주소를 보호하는 기법이다. 스택 카나리는 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법이다. 카나리 값의 변조가 확인되면 프로세스는 강제로 종료된다. 스택 버퍼 오버플로우로 반환 주소를 덮으려면 반드시 카나리를 먼저 덮어야 하므로 카나리 값을 모르는 공격자는 반환 주소를 덮을 때 카나리 값을 변조하게 된다. 이 경우, 에필로그에서 변조가 확인되어 공격자는 실행 흐름을 획득하지 못한다. 카나리 정적 분석 canary.c 에는 스택 버퍼 오버플로우 취약점이 존재한다. 카나리를 활성화하여 컴파일한 바이너리와, 비활성화하여 컴파일한 바이너리를 비교하여 스택 카나리의 원리를 공부해보자..
13. Exploit Tech : Return Address Overwrite
·
시스템 개념
스택 버퍼 오버플로우가 발생하면 반환 주소가 조작될 수 있다는 것을, 취약점이 존재하는 예제 프로그램을 만들어서 공격하고, 셸을 획득하는 과정을 서술할 것이다. 실습에서 활용할 프로그램 코드는 아래와 같다. 취약점 분석 위 코드에서 취약점은 scanf("%s", buf)에 있다. scanf함수의 포맷 스트링중 하나인 %s는 문자열을 입력받을 때 사용하는 것으로, 입력의 길이를 제한하지 않으며, 공백 문자인 띄어쓰기, 탭, 개행 문자 등이 들어올 때까지 계속 입력을 받는다는 특징이 있다. 이런 특징징으로 인해 버퍼의 크기보다 큰 데이터를 입력하면 오버플로우가 발생할 수 있다. 따라서 scanf에 %s 포맷 스트링은 절대 사용하면 안되고, 정확히 n개의 문자만 입력받는 "%[n]s"의 형태로 사용해야 한다...