IT/시스템 보안 27

[Stack Canary] Stack Buffer Overflow로부터 Return address를 보호하기

목적 스택 버퍼 오버플로우 공격으로부터 return address를 보호하기 작동 원리 함수의 프롤로그에서: 스택 버퍼와 반환 주소 사이에 임의의 값 (= 즉 Canary)을 삽입 그 후, 함수의 에필로그에서: 해당 값의 변조를 확인 만약 Canary 값의 변조가 확인되면: 프로세스가 강제 종료됨 공격자가 스택 버퍼 오버플로우를 통해 return address를 overwrite하는 경우, 만약 return address 이전에 canary가 마련돼 있다면, return address overwrite 이전에 필연적으로 canary가 먼저 overwrite 되겠지요. 이때, 공격자는 일반적으로 Canary 값을 모르므로 (공격자가 이 값을 알아내는 특별한 경우도 있는데 다른 글에서 다루겠습니다), 공격 ..

IT/시스템 보안 2024.03.05

[Stack Buffer Overflow] Return Address Overwrite을 통한 실행 흐름 조작

Return Address Overwrite Buffer overflow를 통해 stack의 return address 값을 조작하면, 프로세스의 실행 흐름을 조작할 수 있다. 취약점 분석 취약점이 있는 코드: rao.c #include #include void init() { setvbuf(stdin, 0, 2, 0); // setvbuf(FILE 구조체에 대한 포인터, 버퍼, 버퍼링 모드, 버퍼 크기(바이트)) setvbuf(stdout, 0, 2, 0); } void get_shell() { char *cmd = "/bin/sh"; char *args[] = {cmd, NULL}; execve(cmd, args, NULL); } int main() { char buf[0x28]; init(); pr..

IT/시스템 보안 2024.03.01

[Stack Buffer Overflow] 데이터 변조와 유출

데이터 변조 #include #include #include int check_auth(char *password) { // 입력값(= password)을 buffer(= temp)에 담아 인증을 구현하는 함수 int auth = 0; char temp[16]; strncpy(temp, password, strlen(password)); // strncpy: 입력받은 password 중 어떤 길이 (여기서는 strlen(password))만큼을 temp에 복사함. // 이때, password의 길이가 temp의 크기보다 크면, // password의 일부는 스택에서 temp가 차지한 범위를 넘어감. // 이때, 그 넘친 위치에 만약 중요한 데이터가 있었다면, 이 데이터를 오염시켜버림. // 이 코드의 경..

IT/시스템 보안 2024.02.29

[Shellcode] objdump을 이용한 byte code 추출

예시 어셈블리 코드 (shellcode.asm)의 byte code를 추출해보겠습니다. shellcode.asm section .text global _start _start: xor eax, eax push eax push 0x68732f2f push 0x6e69622f mov ebx, esp xor ecx, ecx xor edx, edx mov al, 0xb int 0x80 1. nasm 설치 sudo apt-get install nasm 2. shellcode.o 생성 nasm -f elf shellcode.asm 3. shellcode.o 파일을 어셈블리 언어로 변환하여 출력 objdump -d shellcode.o 4. shellcode.bin 생성 objcopy --dump-section .t..

IT/시스템 보안 2024.02.28

[Shellcode] execve

목적 execve 셸코드를 이용하면 임의의 프로그램을 실행할 수 있는데요, 만약 그것이 셸 프로그램이라면, 서버의 셸을 획득한 것이므로, 서버의 시스템을 제어함으로써 시스템 해킹을 성공한 것이 됩니다. ※ 셸(Shell): 운영체제에 명령을 내리기 위해 사용되는 사용자의 인터페이스 방법 1. execve 셸코드 작성 linux의 다양한 셸 프로그램 중 기본인 /bin/sh를 실행하는 execve 셸코드를 작성해보겠습니다. execve 셸코드는 스켈레톤 코드 (C언어로 작성됨) + 셸코드 (어셈블리) 의 구조입니다. 스켈레톤 코드 __asm__( ".global run_sh\n" // C에서 run_sh에 접근 가능하도록 global로 설정 "run_sh:\n" // 아래 어셈블리 코드는 예시이며, 각 l..

IT/시스템 보안 2024.02.28

[Shellcode] orw: open-read-write

목적 공격 대상이 되는 시스템의 파일을 유출해 내는 것입니다. 방법 아래는 linux 환경에서 진행한 것입니다. 0. 공격 대상이 될 파일 작성 실습을 위한 예시입니다. echo 'flag{this_is_open_read_write_shellcode!}' > /tmp/flag 1. orw 셸코드 작성 “/tmp/flag” 파일을 읽는 orw 셸코드를 작성해 보겠습니다. orw 셸코드는 스켈레톤 코드 (C언어로 작성됨) + 셸코드 (어셈블리) 의 구조입니다. 스켈레톤 코드 __asm__( ".global run_sh\n" // C에서 run_sh에 접근 가능하도록 global로 설정 "run_sh:\n" // 아래 어셈블리 코드는 예시이며, 각 line은 \n으로 구분되어야 함 "xor rdi, rdi\n..

IT/시스템 보안 2024.02.27

[Stack Frame] 프로시저 호출 시의 스택 프레임 살펴보기

코드가 쭉 진행되다가 특정 프로시저가 호출되면, 프로시저가 실행되고 나서 다시 원래의 실행 흐름으로 돌아옵니다. 예시 코드 0x400000: call func: push  &  jmp 0x400005: mov esi, eax...0x401000: push rbp 0x401001: mov rbp, rsp 0x401004: sub rsp, 0x30 0x401008: mov BYTE PTR[rsp], 0x3 ...0x401020: leave: mov rsp, rbp  &  pop rbp 0x401021: ret: pop rip  &  jmp rip   빠르게 보는 전 과정의 메모리 변화  상세한 작동 1. 프로시저 호출2. function prologue: 기존 상태의 기록, 새로운 stack frame의 마..

IT/시스템 보안 2024.02.20