[Dreamhack] System Hacking Advanced Stage 3 - Background: Master Canary
·
Hacking/System
Thread Local Storage Thread Local Storage (TLS) : 명칭 그대로 스레드의 저장 공간을 의미한다. ELF 바이너리를 살펴보면, 코드를 실행하기 위한 .text, 초기화되지 않은 전역 변수를 위한 .data 등의 섹션에서 데이터를 관리한다. 이와 달리 TLS 영역은 스레드의 전역 변수를 저장하기 위한 공간으로, 로더(Loader)에 의해서 할당된다. static void * init_tls (void) { /* Construct the static TLS block and the dtv for the initial thread. For some platforms this will include allocating memory for the thread descriptor..
[Dreamhack] System Hacking Advanced Stage 2 - seccomp
·
Hacking/System
문제 파일이다. // gcc -o seccomp seccomp.cq // 64-bit, canary, nx, partial relro #include #include #include #include #include #include #include #include #include #include #include #include int mode = SECCOMP_MODE_STRICT; void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(60); ..
[Dreamhack] System Hacking Advanced Stage 2 - Exploit Tech: Bypass SECCOMP
·
Hacking/System
Bypass SECCOMP SECCOMP는 시스템 콜 뿐만 아니라 전달되는 인자까지 추적하고 비교할 수 있다. 인자를 비교하는 것은 많은 예외 상황이 있을 수 있기 때문에 많은 개발자들은 시스템 콜을 호출하지 못하도록 설정한다. 해당 기술이 적용된 바이너리를 우회하는 방법은 상황에 따라 여러 가지이기 때문에 많은 분석과 공격 경험이 필요하다. 타 시스템 콜 호출 같은 기능을 하는 서로 다른 시스템 콜이 몇 가지 존재한다. 예를 들어, 파일을 열기 위해서 사용하는 시스템 콜은 대표적으로 open이 있는데, 같은 기능을 수행하는 openat이 있다. 만약 규칙이 open 시스템 콜을 호출하지 못하도록 정의되어 있다면 openat을 사용해 개발자가 의도하지 않은 행위를 할 수 있다. Application Bi..
[Dreamhack] System Hacking Advanced Stage 2 - Background: SECCOMP
·
Hacking/System
서론 원격 코드 실행 (Remote Code Execution) : 원격에서 곧바로 공격할 수 있는 취약점, 사전에 예방할 수 있는 방법이 없다. 이번 강의에서는 공격을 어렵게 하기 위한 보안 매커니즘인 샌드박스 (Sandbox)와 이에 속하는 기술인 SECCOMP를 알아보고, 해당 기술이 적용된 바이너리의 분석을 도와주는 도구인 seccomp-tools에 대해서 배울 수 있다. Sandbox 샌드박스 (Sandbox) ; 외부의 공격으로부터 시스템을 보호하기 위해 설계된 기법 Allow List와 Deny List 두 가지를 선택해 적용할 수 있으며, 애플리케이션의 기능을 수행하는데 있어서 꼭 필요한 시스템 콜 실행, 파일의 접근만을 허용한다. 보호된 영역에서 애플리케이션의 기능이 수행되기 때문에 외부..
[Dreamhack] System Hacking Stage 3 - Tool: gdb
·
Hacking/System
서론 버그(bug) : 실수로 발생한 프로그램의 결함 디버거(Debugger) : 버그를 없애기 위해 사용하는 도구 프로그램을 어셈블리 코드 단위로 실행하면서, 실행결과를 사용자에게 보여준다. 자신이 추상적으로 생각한 아이디어의 결과를 직관적으로 보여주기 때문에, 개발자는 디버거를 사용하여 자신이 작성한 코드의 문제점을 더욱 명확하게 찾을 수 있다. gdb gdb(GNU debugger) : 리눅스의 대표적인 디버거 오픈 소스로 개발되어 무료로 설치할 수 있으며 다양한 플러그인들이 개발되어 있다. Ubuntu 18.04에는 기본적으로 설치되어 있다. Github 링크 : https://github.com/scwuaptx/Pwngdb GitHub - scwuaptx/Pwngdb: gdb for pwn gd..
[Dreamhack] System Hacking Stage 2 - x86 Assembly 2
·
Hacking/System
Opcode: 스택 스택 : 함수별로 자신의 지역변수 또는 연산과정에서 부차적으로 생겨나는 임시 값들을 저장하는 영역 push val : val을 스택 최상단에 쌓음 rsp -= 8 [rsp] = val pop reg : 스택 최상단의 값을 꺼내서 reg에 대입 rsp += 8 reg = [rsp-8] Opcode: 프로시저 프로시저(Procedure) : 특정 기능을 수행하는 코드 조각 프로시저 사용 : 반복 연산 대체 → 전체 코드의 크기↓ , 기능별로 코드 조각에 이름 → 가독성 ↑ ​ 호출(Call) : 프로시저를 부르는 행위 반환(Return) : 프로시저에서 돌아오는 것 프로시저를 실행하고 나서 원래의 실행 흐름으로 돌아와야 하므로 call 다음의 명령어 주소(return address, 반환..
[Dreamhack] System Hacking Stage 2 - x86 Assembly 1
·
Hacking/System
x64 어셈블리 언어 어셈블리 언어 : 컴퓨터의 기계어와 치환되는 언어 동사에 해당하는 명령어(Operation Code, Opcode)와 목적어에 해당하는 피연산자(Operand)로 구성된다. 명령 코드 데이터 이동(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 피연산자 상수(Immediate Value), 레지스터(Register), 메모리(Memory)가..
[Dreamhack] System Hacking Stage 2 - Linux Memory Layout
·
Hacking/System
메모리 오염 취약점 : 공격자가 메모리를 악의적으로 조작해, 조작된 메모리 값에 의해 CPU가 잘못된 동작을 하는 상황을 유발하는 취약점 세그먼트 세그먼트(segment) : 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것 크게 코드 세그먼트, 데이터 세그먼트, BSS 세그먼트, 힙 세그먼트, 스택 세그먼트로 구분된다. 운영체제가 메모리를 용도별로 나누면, 각 용도에 맞게 적절한 권한을 부여할 수 있다. 권한은 읽기, 쓰기, 실행이 존재하며, CPU는 메모리에 대해 권한이 부여된 행위만 할 수 있다. ​ 코드 세그먼트 코드 세그먼트(Code Segment) : 실행 가능한 기계 코드가 위치하는 영역, 텍스트 세그먼트(Text Segment)라고도 불린다. 읽기 권한과 실행 권한이 부여된다. int m..
[Dreamhack] System Hacking Stage 2 - Computer Architecture
·
Hacking/System
Background : Computer Architecture 컴퓨터 구조(Computer Architecture) 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법 컴퓨터의 기능 구조에 대한 설계, 명령어 집합구조, 마이크로 아키텍처, 그리고 기타 하드웨어 및 컴퓨팅 방법에 대한 설계 등이 포함된다. ​ 컴퓨터의 기능 구조에 대한 설계 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능들이 컴퓨터에 필요한지 고민하고, 설계하는 분야 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조가 있다. ​ 폰 노이만 구조 폰 노이만 구조 : 연산과 제어를 위해 중앙처리장치(CPU)를, 저장을 위해 기억장치(memory)를 사용하고 장치간에 데이터나 제어 신호를 교환..
[Dreamhack] System Hacking Stage 1 - System Hacking Introduction
·
Hacking/System
가상 머신이란? 가상 머신 : 컴퓨터를 에뮬레이팅 한 것 가상 머신을 작동 시키는 컴퓨터를 호스트(Host)라고 부르며, 가상 머신 안에서 작동하는 컴퓨터를 게스트(Guest)라고 부른다. 가상 머신을 이용하면 호스트는 게스트에게 독립된 실행환경을 제공할 수 있다. 그 위에서 게스트는 윈도우, 리눅스, 맥 등의 운영체제를 구동할 수도 있고, 원하는 특정 프로그램만 실행할 수도 있다. 대표적인 가상화 소프트웨어로는 VMware, VirtualBox, Parallels, QEMU 등이 있다. 윈도우 환경 구축 VMware Workstation Player는 윈도우에서 무료로 사용 가능한 가상화 소프트웨어이다. VMware 설치 링크 : https://www.vmware.com/products/workstat..
[Pwnable.kr] input
·
Hacking/System
포트에 접속해 보았다. 파일을 검색해 input.c 파일을 읽어보았다. 내용은 길어서 캡처 사진이 아니라 코드로 첨부한다. #include #include #include #include #include int main(int argc, char* argv[], char* envp[]){ printf("Welcome to pwnable.kr\n"); printf("Let's see if you know how to give input to program\n"); printf("Just give me correct inputs then you will get the flag :)\n"); // argv if(argc != 100) return 0; if(strcmp(argv['A'],"\x00")) ret..
[Pwnable.kr] random
·
Hacking/System
ssh로 서버에 접속해보았다. 서버에 접속해 ls로 파일을 살펴보니 flag, random, random.c 파일이 있었다. random 파일을 실행시키고 11111111을 입력해 보니까 번호가 틀렸고, 2^32개의 경우를 시도해 보라고 얘기한다. cat을 통해서 random.c 파일을 확인해 보았다. rand() 함수를 이용해서 random 값을 구하는데, time을 이용해서 값을 구하지 않기 때문에 항상 고정된 값이 처음으로 나올 것으로 예상된다. 따라서 해당 값과 xdeadbeef 값을 같게 하면 flag를 읽을 수 있다. gdb를 통해서 random을 분석했다. main+18에서 rbp-0x4에 rand()의 값을 저장하는 것을 확인할 수 있다. main+18에 breakpoint를 설정하고 실행..