FSB printf 계열 함수 (snprintf 등), warnx와 같이 Fromat string을 사용하는 함수에서 발생하는 취약점 이다. 스택에 있는 값을 leak 할 수 있고, 특정 서식 문자를 이용해 AAW(임의의 주소쓰기), AAR(임의의 주소읽기) 할 수 있다. 스택을 릭하거나 덮어쓸 떄 주의 할점 이 있는데, 이는 6개의 인자를 레지스터에 먼저 저장하고, 그 이상의 인자를 스택에 저장 시키기 때문에 offset은 6이상이 될 수 밖에 없지만.,... 문제마다(사용하는 함수마다) 이는 다르다. 결국 AAAA. %x%x%x%x를 여러번 써 보면서 이 값 중 내가 첫번째에 입력한 값이 어느번째에 있는지를 파악하는것이 제 1관문, 즉 1 stage 이다. 포맷 스트링의 구조는 다음과 같다 ; %[p..
house_of_lore #include #include #include #include void jackpot(){ puts("Nice jump d00d"); exit(0); } int main(int argc, char * argv[]){ intptr_t* stack_buffer_1[4] = {0}; intptr_t* stack_buffer_2[3] = {0}; printf("nWelcome to the House of Lore\\n"); printf("This is a revisited version that bypass also the hardening check introduced by glibc malloc\\n"); printf("This is tested against Ubuntu 14.0..
취약점 유발의 시초: 배열 (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] = ..
* 스레드 스택에서 사용하는 마스터 카나리와 메인 스레드 스택에서 사용하는 마스터 카나리는 서로 위치가 다르다. 하지만 값은 상속 받기 때문에 같다. 카나리 값을 릭 할때 만약 잘 출력이 되지 않은다면, 마스터 카나리와의 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베이스라고함) 를 구하여 이를 토대로 익스 할수 있다. 하지만 코드베이스를 구하기 어렵다면, 함수 호출관..
0x00000000000006b2 : mov rax,QWORD PTR fs:0x28 0x00000000000006bb : mov QWORD PTR [rbp-0x8],rax 0x00000000000006bf : xor eax,eax 위 코드와 같이 rbp 직전에 8바이트 만큼의 공간에다 fs:0x28, 즉 카나리 값을 넣는걸을 볼 수 있다. 0x00000000000006dc : mov rcx,QWORD PTR [rbp-0x8] 0x00000000000006e0 : xor rcx,QWORD PTR fs:0x28 0x00000000000006e9 : je 0x6f0 0x00000000000006eb : call 0x570 마지막에 이를 fs:0x28값과 xor 시켜 0, 즉 참(어셈 조건문은 0일때 참이다) ..