Hacking/System
-
Master Canary 스택 버퍼를 사용하는 모든 함수에서 같은 카나리 값을 사용한다. 이러한 특징 때문에 임의 함수에서 메모리 릭으로 카나리를 알아낼 수 있다면 다른 함수에서 발생하는 스택 버퍼 오버플로우에서 카나리를 덮어쓰고 실행 흐름을 조작할 수 있다. SSP 동작원리를 살펴보면 버퍼를 사용하는 함수의 프롤로그에서 fs:0x28에 위치하는 값을 가져와서 rbp바로 앞에 삽입한다. static void security_init (void) { /* Set up the stack checker's canary. */ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); #ifdef THREAD_SET_STACK_GUARD THREAD..
Master CanaryMaster Canary 스택 버퍼를 사용하는 모든 함수에서 같은 카나리 값을 사용한다. 이러한 특징 때문에 임의 함수에서 메모리 릭으로 카나리를 알아낼 수 있다면 다른 함수에서 발생하는 스택 버퍼 오버플로우에서 카나리를 덮어쓰고 실행 흐름을 조작할 수 있다. SSP 동작원리를 살펴보면 버퍼를 사용하는 함수의 프롤로그에서 fs:0x28에 위치하는 값을 가져와서 rbp바로 앞에 삽입한다. static void security_init (void) { /* Set up the stack checker's canary. */ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); #ifdef THREAD_SET_STACK_GUARD THREAD..
2023.08.22 -
함수 호출 규약 함수 호출 규약은 함수 호출 시 일어나는 행동에 대한 약속이다. 한 함수에서 다른 함수로 호출할 때, 프로그램의 실행 흐름은 다른 함수로 이동한다. 그리고 호출한 함수가 반환하면, 다시 원래의 함수로 돌아와서 기존의 실행 흐름을 이어나간다. 그러므로 함수를 호출할 때는 반환된 이후를 위해 호출자(Caller)의 상태(Stack frame) 및 반환 주소(Return address)를 지정해줘야 한다. 또한 호출자는 피호출자(Callee)가 요구하는 인자를 전달해 줘야 며, 피호출자의 실행이 종료될 때는 반환 값을 전달받아야 한다. 함수 호출 규약은 여러 가지 있는데 프로그래머가 코드에 명시하지 않는다면 컴파일러는 지원하는 호출 규약 중에서 CPU 아키텍처에 적합한 것을 선택한다. 함수 호..
Calling Convention함수 호출 규약 함수 호출 규약은 함수 호출 시 일어나는 행동에 대한 약속이다. 한 함수에서 다른 함수로 호출할 때, 프로그램의 실행 흐름은 다른 함수로 이동한다. 그리고 호출한 함수가 반환하면, 다시 원래의 함수로 돌아와서 기존의 실행 흐름을 이어나간다. 그러므로 함수를 호출할 때는 반환된 이후를 위해 호출자(Caller)의 상태(Stack frame) 및 반환 주소(Return address)를 지정해줘야 한다. 또한 호출자는 피호출자(Callee)가 요구하는 인자를 전달해 줘야 며, 피호출자의 실행이 종료될 때는 반환 값을 전달받아야 한다. 함수 호출 규약은 여러 가지 있는데 프로그래머가 코드에 명시하지 않는다면 컴파일러는 지원하는 호출 규약 중에서 CPU 아키텍처에 적합한 것을 선택한다. 함수 호..
2023.08.21 -
unsorted bin attack unosrted bin attack은 해제된 청크의 BK를 조작할 수 있을 때 임의 주소에 main_arena 영역의 주소를 쓸 수 있는 공격기법이다. 쓰이는 값은 특정 버퍼의 사이즈를 덮는 등 추가적인 공격은 연계하기 위해 사용된다. unsorted bin은 fastbin과 다르게 청크를 처음 해제하면 FD와 BK에 main_arena주소가 쓰인다. #include #include int main() { char *ptr = malloc(0x100); char *ptr1 = malloc(0x100); free(ptr); return 0; } free 했을 때 gdb로 보면 FD와 BK에 0x00007ffff7dd1b78 주소가 쓰인다. 이 주소를 보면 main_are..
unsorted bin attackunsorted bin attack unosrted bin attack은 해제된 청크의 BK를 조작할 수 있을 때 임의 주소에 main_arena 영역의 주소를 쓸 수 있는 공격기법이다. 쓰이는 값은 특정 버퍼의 사이즈를 덮는 등 추가적인 공격은 연계하기 위해 사용된다. unsorted bin은 fastbin과 다르게 청크를 처음 해제하면 FD와 BK에 main_arena주소가 쓰인다. #include #include int main() { char *ptr = malloc(0x100); char *ptr1 = malloc(0x100); free(ptr); return 0; } free 했을 때 gdb로 보면 FD와 BK에 0x00007ffff7dd1b78 주소가 쓰인다. 이 주소를 보면 main_are..
2023.05.30 -
Unsafe unlink 해제된 청크들을 연결하는 이중 연결 리스트에서 청크를 연결해제하는 매크로인 unlink를 이용하여 Arbitrary write를 하는 공격 기법이다. unlink 매크로는 인접한 2개 이상의 청크를 연속해서 해제했을 때 인접한 청크를 병합하기 위해서 사용된다. 소스코드를 보면 prev_inuse 비트가 0인지 확인한다. 0이면 이전 청크가 해제되었다는 뜻이니까 unlink 매크로를 실행한다. FD->bk = BK, BK->fd = FD를 하기 전에 현재 청크의 포인터인지를 검증한다. 그리고 현재 P의 청크가 해제되었을 때 인접한 청크를 병합하기 위해 FD를 P->fd로 설정하고, BK를 P->bk로 설정한다. 왜냐하면 P를 병합하면 BK의 정보와 FD의 정보가 연결되어야 하기 때..
Unsafe unlinkUnsafe unlink 해제된 청크들을 연결하는 이중 연결 리스트에서 청크를 연결해제하는 매크로인 unlink를 이용하여 Arbitrary write를 하는 공격 기법이다. unlink 매크로는 인접한 2개 이상의 청크를 연속해서 해제했을 때 인접한 청크를 병합하기 위해서 사용된다. 소스코드를 보면 prev_inuse 비트가 0인지 확인한다. 0이면 이전 청크가 해제되었다는 뜻이니까 unlink 매크로를 실행한다. FD->bk = BK, BK->fd = FD를 하기 전에 현재 청크의 포인터인지를 검증한다. 그리고 현재 P의 청크가 해제되었을 때 인접한 청크를 병합하기 위해 FD를 P->fd로 설정하고, BK를 P->bk로 설정한다. 왜냐하면 P를 병합하면 BK의 정보와 FD의 정보가 연결되어야 하기 때..
2023.05.23 -
Double Free double free는 같은 chunk를 연속으로 두 번 해제할 때 생기는 버그이다. #include #include #include int main() { char *ptr = malloc(0x20); char *ptr1 = malloc(0x20); free(ptr); free(ptr); return 0; } 동적으로 ptr을 할당하고 연속으로 2번 free 하면 double free bug가 발생한다. double free를 체크하는 함수는 위 사진과 같다. 이전에 해제한 pointer와 현재 해제하려는 pointer가 같으면 double free를 발생시킨다. 이 부분을 우회할 수 있는데 old ptr와 p ptr을 다르게 만들면 된다. 어떤 식으로 가능할까?? 방법은 간단하다..
Double FreeDouble Free double free는 같은 chunk를 연속으로 두 번 해제할 때 생기는 버그이다. #include #include #include int main() { char *ptr = malloc(0x20); char *ptr1 = malloc(0x20); free(ptr); free(ptr); return 0; } 동적으로 ptr을 할당하고 연속으로 2번 free 하면 double free bug가 발생한다. double free를 체크하는 함수는 위 사진과 같다. 이전에 해제한 pointer와 현재 해제하려는 pointer가 같으면 double free를 발생시킨다. 이 부분을 우회할 수 있는데 old ptr와 p ptr을 다르게 만들면 된다. 어떤 식으로 가능할까?? 방법은 간단하다..
2023.04.18