Security/System(6)
-
32bits 아키텍처와 64bits 아키텍처
32비트 아키텍처에서는 4bytes로 align => system 함수 사용시 align 필요 X 64비트 아키텍처에서는 8bytes로 align 32비트 아키텍처에서는 stack에 쌓인 순서로 arguments 관리 64비트 아키텍처에서는 레지스터(rdi, rsi, ...)로 arguments 관리 참고 블로그 https://sean.tistory.com/410
2023.11.15 -
[System Hacking] Bypass NX & ASLR
ASLR (Address Space Layout Randomization) ASLR은 바이너리가 실행될 때마다 스택, 힙 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법이다. cat /proc/sys/kernel/randomize_va_space 위와 같은 명령어를 통해 ASLR이 적용되는지 확인할 수 있다. 위 명령어의 결과값은 0, 1, 2로 나뉘는데 각 값의 의미는 다음과 같다. 0 : No ASLR 1 : Conservative Randomization(stack, heap, lib, vdso etc) 2 : Conservative Randomization + brk(allocated memory by brk) ASLR의 특징으로는 1. main함수의 영역은 고정됨 2. 라이브러리 매핑 주..
2023.08.29 -
[System Hacking] Stack Canary
카나리 보호 기법은 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법이다. 이를 통해 반환 주소를 덮어 쓰는 스택 버퍼 오버플로우 공격로부터 보호할 수 있다. 기본적으로 gcc컴파일러는 카나리를 적용하여 컴파일한다. 카나리를 비활성화하기 위해서는 -fno-stack-protector 옵션을 추가하면 된다. (비활성화해도 segmentation fault가 발생한다.) canary 값은 32비트 아키텍처에서는 4바이트, 64바이트 아키텍처에서는 8바이트로 gs:0x14 또는 fs:0x28 에 저장된 값이 사용된다. (해당 레지스터들은 Thread Local Storage, TLS라는 포인터로 사용) 레지스터에 저장된 값은 리눅..
2023.07.25 -
[System Hacking] Stack Buffer Overflow
Calling Convention x86 아키텍처에서 gcc에 대한 함수 호출 규약은 cdecl을 사용 x86-64 아키텍처에서 gcc에 대한 함수 호출 규약은 SYSTEM V를 사용 x86 아키텍처는 레지스터 수가 적어서 함수의 인자를 스택에 올리고, x86-64 아키텍처에서는 레지스터 수가 많아서 함수의 인자를 레지스터에 올린다. (인자의 수가 6개가 넘어가면 스택을 사용 => 레지스터에 비해 느림) 사용되는 레지스터는 rdi, rsi, rdx, rcs, r8, r9 반환값은 rax에 전달 Stack Buffer Overflow stack overflow : 스택 영역을 벗어나 오버플로우가 발생 buffer overflow : 의도한 버퍼를 넘어 오버플로우가 발생 스택 버퍼 오버플로우를 통해 중요 데..
2023.07.16 -
[System Hacking] Shellcode
Shellcode : 익스플로잇을 위해 제작된 어셈블리 코드 조각 rip를 작성한 shellcode로 옮기면 해당 어셈블리 코드를 실행시킬 수 있다. 이미 존재하는 shellcode도 많다. 그러나 내가 원하는 동작을 행하도록 shellcode를 만드는 방법을 아는 것은 중요하다. 간단하게 orw shellcode 와 execve shellcode를 작성해보자. orw shellcode는 파일을 open, read, write하는 shellcode이다. 대상 파일을 "/tmp/flag"라 가정하면 다음과 같이 C언어로 표현할 수 있다. char buf[0x30]; int fd = open("/tmp/flag", RD_ONLY, NULL); read(fd, buf, 0x30); write(1, buf, 0..
2023.07.13 -
[System Hacking] x86 Assembly 명령어
명령어 데이터 이동(Data Transfer) mov, lea 산술 연산(Arithmetic) inc, dec, add, sub 논리 연산(Logical) and, or, xor, not 비교(Comparison) cmp, test 분기(Branch) jmp, je, jg 스택(Stack) push, pop 프로시져(Procedure) call, ret, leave 시스템 콜(System call) syscall 타입 QWORD PTR [0x8048000] 0x8048000의 데이터를 8바이트만큼 참조 DWORD PTR [0x8048000] 0x8048000의 데이터를 4바이트만큼 참조 WORD PTR [rax] rax가 가르키는 주소에서 데이터를 2바이트 만큼 참조 데이터 이동 mov dst, src ..
2023.02.15