취약점 유발의 시초: 배열 (ex.. array[k]) --> 프로세스는 &array [k] = array + k*sizeof(element) 로 주소만 계산하여 씀. 이때 따로 검사하는 검사문이 존재하지 않기 때문에 개발자가 직접 검사하는 경우가 아닌 경우 OOB 발생하는 상황들 1. 인덱스 값이 음수가 될 경우 2. 배열의 길이를 벗어나 더 큰 k값을 가질 때 발생 가능한 취약점 구분 OOB Read(AAR), OOB Write(AAW) 첫 번째로 소개할 "OOB Read" OOB_Read 란 임의의 주소를 읽는 것으로 AAR 이라고도 불리며 다음과 같은 조건을 만족해야 한다. 1. 당연하지만 OOB 가 가능해야 한다. 2. 읽으려는 변수와 배열의 오프셋을 알아야 한다. char Key[256] = ..
으아.. 방금 까지 작성했던거 날라가서 빠르게 적겠습니다. Warmup 문제의도: 자칭 tiny program이라고 하는 만큼 인자 전달을 위한 gadget도 없고 프로그램 내에 binding 되어 있는 함수 자체도 write, read로 매우 제약이 되어 있다. 이때 너는 익스를 할 수 있냐 일단 문제 파일들을 다운 받으면 Dockerfile 이 존재하는데, 이를 확인하면 우분투 18.04 라는 것을 알 수 있다. 이를 참고하여 libc를 구한다. 필자는 Docker를 이용하여 실제 환경을 구축하여 진행. 그리고 해당 문제의 보호 기법은 다음과 같다. Arch: amd64-64-little RELRO: Full RELRO Stack: No canary found NX: NX enabled PIE: No..
* 스레드 스택에서 사용하는 마스터 카나리와 메인 스레드 스택에서 사용하는 마스터 카나리는 서로 위치가 다르다. 하지만 값은 상속 받기 때문에 같다. 카나리 값을 릭 할때 만약 잘 출력이 되지 않은다면, 마스터 카나리와의 offset을 구한후 마스터 가나리를 릭한다. SSP는 스택 버퍼 오버플로우로 부터 변환 주소를 보호 하는 기법으로, 스택 버퍼가 존재하는 함수 내부에서 임의로 생성된 값을 버퍼 마지막에 삽입하여 검증 과정을 거쳐 보호하는 기법이다. 이떄 카나리 값이 존재하는 위치는 TLS(Thread Local Storage)이다. 먼저 ELF 바이너리 구조를 살펴보면 각각의 목적을 가진 섹션에서 데이터를 관리함을 알수 있다. 1. 코드를 실행하기 위한 .text 2. 초기화 되지 않은 전역 변수를 ..
#PIE 가 적용되지 않은 문제에선 prctl(PR_SET_SECCOMP, mode, &prog) 에서 mode를 잘 보아라. strict일 경우 1로 로 인자가(mode)설정 됨. 이떄 PIE 가 적용되 있지 않는 특정상 mode가 전역변수 code 영역에서 정의 되어 있다면, 이 주소를 IDA나 그 외 툴, 방법을 이용하여 구한 후 이를 0이외의 수로 변경하면 필터를 우회하여 아무 함수나 사용하여 공격 가능.. [Linux Security] Understand and Practice Seccomp Syscall Filter | by Nishant Sharma | Pentester Academy Blog 오늘부터 시작된 하루 한 포스팅 SHA(System Hacking Advanced) 시리즈가 시작되..
C언어에서 포맷스트링을 인자로 사용하는 함수들은 함수의 이름이 f(formatted)로 끝납니다. 즉 'f'로 끝나고 문자를 다루는 함수가 포맷 스트링을 처리 한다면, 이는 ex... scanf 등 으로 추측할 수 있습니다. 포맷 스트링 구조 : %[parameter][flags][width][.precision][length]type specifier description d Signed Int s String x Unsigned hex n Length of string p void potiner width (%[]s) integer %5s * %*s --> width of arg's length ** printf("%n", &num); ---> %n is input function format, So..
ASLR 이 적용되어 있으면 바이너리가 실행될 떄마다 스택, 힙, 공유 라이브러리 등이 무작위 주소에 매핑된다. 하지만 이는 main함수의 주소에는 영향을 끼치지 못한다. 하지만 PIE 기술롣 이를 바꿀수 있다. 이때 리눅스 에서 ELF는 실행파일과 공유 오브젝트로 나뉜다. (공유 프젝-> libc6.so) 공유 오브젝트는 Position-Independent Code(PIC )로 어느 주소에 적재되어도 코드의 의미가 훼손 되지 않아, 재배치가 가능하다. 이는 ASLR과 비슷하여 하위 12bit(3byte)가 항상 같기 때문에 이를 이용하여 함수의 offset을 통해 base(이를 코드 베이스, PIE베이스라고함) 를 구하여 이를 토대로 익스 할수 있다. 하지만 코드베이스를 구하기 어렵다면, 함수 호출관..
*PIE = 위치 독립 코드(실행할 때 마다 매핑되는 주소가 어디든지에 상관없이 실행되는 파일) -> 바이너리의 주소를 랜덤화하여 바이너리의 특정 주소의 값을 수정하는 것과 같은 공격을 방어한다. PLT에는 함수 주소가 Resolve 되지 않았을 때, 함수의 주소를 구하고 실행하는 코드가 있다. (Resolve되었을때 GOT 저장) ASLR이 걸려 있어도 PIE가 적용되어 있지 않다면 PLT의 주소는 고정되므로, 무작위 주소에 매핑되는 라이브러리의 베이스 주소를 몰라도 이방법으로 함수를 실행할 수 있다. --> Return to PLT exploit의 방법 1. 라이브러리의 베이스 주소를 구하여 ASLR을 우회기법. 2. PLT를 이용하여 NX 우회. -PLT를 이용하여 NX 우회- **ROPgadget..