double free란?해당 취약점은 libc 2.23에서 발생하는 취약점으로 free를 두번 하게 되면서 생기는 오류이다.if (__builtin_expect (old == p, 0){ errstr = "double free or corruption (fasttop)"; goto errout;}이러한 코드로 인해 free를 두번 할 경우 오류가 생긴다. 하지만 만약 chunk1 해제후 chunk2를 해제하고 다시 chunk1을 해제하면 old는 chunk2이고 p는 chunk1이여서 이 오류검출을 우회할수있다. 그러면 같은 binlist에 같은 주소가 2개가 생긴다. 이렇게되면 재할당시 두개의 객체가 한 개의 주소를 가리킬수 있게 된다.#include #include int main(){ ..
UAF란?Use After Free해제된 메모리에 접근할 수 있을때 발생하는 취약점공격조건메모리 참조에 사용한 포인터를 메모리 해제 후에 적절히 초기화하지 않는경우해제한 메모리를 초기화하지 않고 다음 청크에 재할당glibc 2.27 이하에서 가능Dagling Pointer란?유효하지 않은 메모리 영역을 가리키는 포인터취약한 부분malloc함수는 할당한 메모리의 주소를 반환하여 선언된 포인터에 저장된다. 그리고 free를 하면 chunk를 반환하는데 이때 chunk의 주소를 담고 있던 포인터를 초기화하지 않는다. 따라서 free이후에 프로그래머가 포인터를 초기화하지 않으면 포인터는 해제된 chunk를 가리키는 Dangling Pointer가 된다.따라서 공격자에게 공격 수단으로 활용될 수도 있다.예1// ..
file stream oriented programming _IO_FILE 이란? 리눅스 시스템의 표준 라이브러리에서 파일 스트림을 나타내기 위한 구조체, fopen(), fwrite(), fclose() 등 파일 스트림을 사용하는 함수가 호출되었을때 할당 구조체 struct _IO_FILE { int _flags;/* High-order word is _IO_MAGIC; rest is flags. */ /* The following pointers correspond to the C++ streambuf protocol. */ char *_IO_read_ptr;/* Current read pointer */ char *_IO_read_end;/* End of get area. */ char *_IO_r..
이는 exit함수로 종료될 경우에 Full RELRO 보호기법이 적용되어있을 때 사용 가능한 공격이다. Full RELRO 보호기법이 적용되어 있기 때문에 .fini_array overwrite는 사용할 수 없다. 우선 main이 종료되는 과정을 보자. main이 종료되는 과정 main 함수가 리턴된 후, exit 함수를 호출한다. 여기서 인자값이 0인것을 알 수 있는데 이는 흔히 c언어에서 main의 마지막에 return 0 ; 를 하는데 이 0이 exit함수의 파라미터로 들어가 것이다. exit함수 내부에서는 __run_exit_handlers를 호출한다. 계속 따라가다 보면 _dl_fini를 호출한다. __run_exit_handlers 함수는 exit_function 구조체 멤버 변수인 flavo..
stack address leak libc_base를 알고있을 때 stack_address 를 알아낼 수 있는 기법이다. 라이브러리에서는 프로그램의 환경 변수를 참조해야 할 일이 있다. 이를 위해 libc.so.6에는 environ 포인터가 존재하고, 이는 프로그램의 환경 변수를 가리키고 있다. environ 포인터는 로더의 초기화 함수에 의해 초기화된다. environ 변수의 오프셋 구하는 법 objdump -D /lib/x86_64-linux-gnu/libc.so.6 | grep "environ" environ에 stack 주소가 있는 것을 알 수 있다. 예제 //gcc -zexecstack -no-pie -o enp enp.c #include #include #include long int buf_..
stack pivoting이란? ROP를 하고 싶은데 BOF가 ret까지만 덮을수 있을경우(overflow가 많이 나지 않은 경우)혹은 main으로 돌아갈 수 없는 경우에 하는 방법이다 공격방법 gadget을 이용해서 쓰기 가능한 공간에 Fake Stack을 구성해놓고 chaining하는 기법이다. 특정 영역에 값이 있거나 값을 쓸수 있을경우 SFP를 이용하여 스택을 옮기고 해당 부분의 코드를 실행한다. 즉 어떤 공간을 스택처럼 사용하는 것이다. 예를 들면 sfp에 bss주소를 넣고 read등의 함수를 사용한다. 그리고 leave_ret 가젯을 통해 rbp를 bss로 보내 bss를 스택처럼 사용한다. 그리고 ret으로 그 이후의 명령어들을 실행시킨다 예제 //gcc -o pivot pivot.c -fno..
Type Confusion이란? type confusion은 프로그램에서 사용하는 변수나 객체를 선언 혹은 초기화 되었을 때와 다른 타입으로 사용할 때 발생하는 취약점이다. 해당 취약점이 존재한다면 memory corruption이 유발되어 공격자가 프로그램을 공격하는 것이 가능해질 수 있다. 예제 #include int main(){ int a; scanf("%d", &a); puts(a); } 해당 코드는 정수를 입력받아 해당 값을 출력해주는 코드이다. 하지만 puts함수는 char * 형 포인터를 인자로 받는다. 그래서 type confusion이 발생하여 존재하지 않는 메모리를 참조해서 비정상 종료된다.
race condition이란? 둘 이상의 프로세스가 하나의 리소스에 사전 협의 없이 동시에 접근 가능할 때, 상호 간에 리소스의 현재 정보에 대해 동기화가 되지 않아 발생하는 취약점이다. 이 취약점은 임시파일이 사용되는 환경에서 발생하는데 만약 실행 중에만 중요한 파일을 임시로 생성후 사용이 끝난 후 삭제하는 프로그램에서 발생한다. 예제 #include #include #include #include #include void setup_environment() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); } int main(int argc, char *argv[])..