본문 바로가기
공부/비기너즈

DH101(2)

by suyeon27 2024. 1. 15.
출처 : 해커들의 놀이터, Dreamhack. https://dreamhack.io/
  • 공부한 내용 요약정리

(2024-01-16)

🚩코딩

코딩(Coding) : 프로그래밍 언어를 작성함으로써 컴퓨터에게 명령할 수 있는 체계를 만드는 행위

 

비주얼 스튜디오 코드(Visual Studio Code, VS code)

: Windows, macOS, Linux에서 사용 가능한 소스 코드 편집기

기본적으로 JavaScript, TypeScript, Node.js를 지원하며 확장 프로그램(Extension)을 통해 C, Java, Python 등

100개 이상의 언어를 지원합니다. 개발을 할 때만 소스 코드 편집기를 사용한다고 생각하는 것은 큰 오해입니다.

해킹 공부를 할 때도 직접 익스플로잇 코드 혹은 스크립트를 작성해야 하는 경우가 많습니다.

 

커맨드 팔레트(Command Palette)

: VS code에 존재하는 기능을 키보드 입력으로 검색하고 실행할 수 있는 간편한 명령 처리 기능

View-Command Palette... 혹은 단축키 Ctrl+Shift+P로 열 수 있습니다.

 

VS code 내에서 빠르게 명령어를 실행할 수 있는 터미널(Terminal) 창이 존재합니다. 

View-Terminal 혹은 단축키 Ctrl+`로 터미널 창을 엽니다.

 

(2024-01-17)

🌧

 

(2024-01-18)
💭

 

(2024-01-19)

DH101(1)

 

(2024-01-20)

편리한 코딩을 위해 VS code 편집기를 리눅스 VM에서 사용할 수 있도록 연결 해보기

 

소스 코드가 포함된 c 파일은 컴파일 과정을 거쳐야 실행 가능한 파일로 변환됩니다.

리눅스에서 C/C++ 언어로 작성된 소스 코드를 컴파일할 때는 주로 gcc 컴파일러를 사용합니다.

 

sudo apt install gcc

gcc를 설치

 

gcc -o test test.c

test.c 파일을 실행 가능한 test 파일로 컴파일하는 명령어

컴파일 후에 ./test 명령으로 test 파일을 실행

(test.c 파일이 있는 디렉토리로 이동하고 컴파일합니다.)

 

(2024-01-21)

디버깅(Debugging) : 소스 코드의 오류(버그)를 찾고 수정하는 과정

코드를 검사하여 잘못된 부분을 찾거나, 특정 코드를 수행한 결과를 확인하기 위해 사용합니다.

VS code에서 상단 메뉴의 Run - Start Debugging 혹은 단축키 f5로 디버깅을 시작할 수 있습니다.

Breakpoint

주로 확인하고 싶은 코드에 Breakpoint(중단점)를 설정한 뒤 디버깅을 시작합니다.

중단점을 설정하면 해당 코드를 실행하기 직전에 프로그램을 중단하여

그 시점의 변수 값이나 콜 스택 정보 등을 확인할 수 있습니다.

중단점은 코드 줄 번호 왼쪽을 클릭하거나 코드에 커서를 두고 단축키 f9를 클릭하여 설정합니다.

Debug View

디버깅을 시작하면 좌측 Debug View에서 VARIABLES(변수), WATCH(변수 또는 표현식의 결과),

CALL STACK(호출한 함수), BREAKPOINTS(사용자가 설정한 중단점 목록) 등의 정보를 확인할 수 있습니다.

Debug Toolbar

디버깅 툴바의 각 버튼은 순서대로 다음과 같은 기능을 합니다.

  • ⏯️ Continue/Pause : 다음 중단점을 만날 때까지 프로그램 실행 혹은 프로그램 중단 (f5)
  • ➡️ Step Over : 코드 한 줄 실행 - 함수를 만나면 함수 실행 (f10)
  • ⬇️ Step Into : 코드 한 줄 실행 - 함수를 만나면 함수 내부로 이동하여 한 줄 실행 (f11)
  • ⬆️ Step Out : 함수의 나머지 부분을 모두 실행 (Shift+f11)
  • 🔄️ Restart : 디버깅 재시작 (Ctrl+Shift+f5)
  • ⏹️ Stop : 디버깅 종료 (Shift+f5)

Debug Console

디버깅 결과를 출력하는 콘솔 창입니다.

 

 

(2024-01-22)

Vim(Vi IMproved) : UNIX의 Vi 편집기(Visual editor)의 기능을 개선한 버전의 텍스트 편집기

Linux, macOS, BSD 등 UNIX 기반의 모든 환경에서 사용할 수 있습니다.

마우스 없이 키보드 입력만으로 모든 작업이 가능하기 때문에

Vim 사용에 익숙해지면 소스 코드를 매우 빠르고 효율적으로 편집할 수 있습니다.

 

리눅스 환경에서는 Vim 편집기 사용법을 알아 두면 편리합니다.

물론 꼭 알아야 하는 것은 아니지만, 다른 편집기를 사용할 수 없는 경우를 대비하여 익혀두는 것도 좋습니다.

 

sudo apt install vim

vim 설치

 

vi 파일명

기존 파일을 수정하거나 새 파일을 생성

 

(2024-01-23 ~ 2024-01-28)

과제

 

(2024-01-29)

Vim의 3가지 모드와 각 모드에서 자주 사용하는 명령을 소개하겠습니다.

 

1. Normal Mode (일반 모드)

Vim을 처음 실행하면 일반 모드로 시작합니다. 다른 모드에서 esc 키를 클릭하면 일반 모드로 전환됩니다.

일반 모드에서는 방향 키와 Home, End 등의 키를 통해 커서를 이동할 수 있는데,

다른 키로도 동일한 동작을 수행할 수 있습니다.

 

gg : 첫 행으로 이동

k : 위로 이동

o : 행의 처음으로 이동

h : 왼쪽으로 이동

l : 오른쪽으로 이동

$ : 행의 끝으로 이동

G : 마지막 행으로 이동

j : 아래로 이동

x : 현재 커서가 위치한 글자 삭제(del)

X : 현재 커서 앞 글자 삭제(backspace)

dd : 현재 커서가 위치한 행 삭제

yy : 현재 커서가 위치한 행 복사

p : 복사한 내용을 현재 행 이후에 붙여넣기

P : 복사한 내용을 현재 행 이전에 붙여넣기

/문자열, enter : 현재 커서 이후로 문자열 찾기

n : 찾은 문자열 목록에서 다음 문자로 이동

u : 이전 수정 사항 되돌리기

 

2. Insert Mode (입력 모드)

입력 모드는 사용자가 실제로 텍스트를 입력하고 편집하는 작업을 수행합니다.

입력 모드에서도 방향키를 사용할 수 있으며, 일반 텍스트 편집기와 유사하게 동작합니다.

일반 모드에서 아래 명령 키들을 클릭하면 입력 모드로 전환됩니다.

 

O : 현재 커서 이전 줄에 입력

I : 현재 커서가 위치한 행의 처음에 입력

s : 현재 커서 한 글자 지우고 입력

i : 현재 커서 위치에 입력

a : 현재 커서 다음 칸에 입력

A : 현재 커서가 위치한 행의 마지막에 입력

S : 현재 커서 한 줄 지우고 입력

o : 현재 커서 다음 줄에 입력

 

3. Command Mode (명령 모드)

명령 모드는 저장, 종료, 취소 등의 명령을 수행합니다.

일반 모드에서 :를 입력하면 명령 모드로 전환됩니다. 이후 원하는 명령을 입력하면 됩니다.

 

:w : 저장

:q : 종료

:i :취소

:wq : 저장하고 종료

:q! 저장하지 않고 종료

:%s/문자열1/문자열2/g : 전체에서 문자열1을 모두 찾아 문자열2로 치환

 

(2024-01-30)

🚩System Hacking 101

시스템 해킹(System Hacking)

: 컴퓨터 프로그램의 행위를 조작하여 공격자가 원하는 행동을 실행하도록 하는 공격 전반을 일컫습니다.

‘시스템 해킹’은 컴퓨터에서 구동되는 모든 프로그램에 대한 해킹에 적용 가능한 말입니다.

 

System Hacking 관련 강의에서 보게 되는 취약한 프로그램들은 대부분 C 언어로 구현되었습니다.

C 언어는 효율성과 유연함에 큰 강점이 있어 다양한 애플리케이션을 구현하는데 사용됩니다.

여기에는 운영체제, 게임 등 굉장히 복잡한 프로그램도 포함됩니다.

그렇기 때문에, 시스템 프로그래밍 및 시스템 해킹을 공부하고자 한다면 C 언어를 먼저 배우시는 걸 권장합니다.

 

드림핵의 System Hacking 강의는 C 언어 기반 프로그램에서 발생할 수 있는 취약점에 대한 기본적인 지식과

이를 이해하기 위한 배경 지식을 설명하는 것을 목표로 합니다.

 

여기에는 프로그램이 시스템 상에서 작동하는 방식, 프로그램을 분석하는데 필요한 도구, 

취약점의 유형 및 이를 공략하는(익스플로잇하는) 방법론에 대한 설명이 포함되어 있습니다.

 

시스템 해킹을 공부할 때는 시작하는 과정이 가장 어려운 단계 중 하나입니다.

요구하는 배경 지식의 범주가 상당히 넓은 편이기 때문입니다.

예를 들어, 가장 기초적인 취약점인 스택 버퍼오버플로우(Stack Buffer Overflow)를 이해하려면

assembly 레벨에서의 메모리 사용과 같은 시스템 프로그래밍 관련 지식을 요구합니다.

 

시스템 해킹의 목표는 통상적으로 공격 대상 프로그램이 구동되는 서버의 임의 유저와 같은 권한을 획득하는 것입니다.

원격 환경에 있는 공격자가 타겟 서버에서 운영체제의 명령어를 실행할 수 있는 공격을

원격코드실행(Remote Code Execution)이라고 부릅니다.

 

반드시 이를 우선적으로 배울 필요는 없지만, 앞으로도 공부할 필요가 없다는 뜻은 아닙니다.

드림핵에는 이러한 지식들을 순차적으로 쌓아갈 수 있도록 돕는 강의가 준비되어 있습니다.

 

시스템 해킹을 잘하기 위해서 C 언어가 컴파일 된 이후에 어떤 방식으로 동작하는지 이해하고 있어야 합니다.

따라서, 시스템 해킹을 공부하기에 앞서 C 언어를 배워야 합니다.

하지만 얼마나 자세하게 C 언어를 공부하고 이해해야 하는지에 대한 척도는 가늠하기 어렵습니다.

드림핵의 시스템 해킹 강의는 가능한 적은 사전 지식을 요구하는 형태로 구성되었습니다.

그럼에도, 원활한 강의 수강과 실습을 위해 C 언어에 대한 기본 지식은 필요하기 때문에,

리버싱 엔지니어링 강의를 수강한 후 시스템 해킹 강의를 수강하기를 권장합니다.

드림핵 강의를 수강하며 C 언어와 시스템 해킹을 차근차근 공부해 봅시다.

 

🚩Reverse Engineering 101

리버스 엔지니어링(Reverse Engineering)은 줄여서 리버싱으로도 부릅니다.

: 이름에서 알 수 있듯이 리버스 엔지니어링은 무언가를 설계하고 제작하는 '엔지니어링' 과정을 정반대로 수행하는 것

컴퓨터 프로그래밍적 관점에서는 개발자가 소스 코드를 작성하고, 컴파일한 산출물에서부터 시작하는 것입니다.

프로그램의 동작을 직접 실행 시켜보면서 소스 코드의 내용을 추측하는 것도 가능한 방법이고,

컴파일된 결과물의 데이터를 분석하여 소스 코드의 내용을 유추, 복구 해볼 수도 있습니다.

 

위에서 언급한 산출물을 흔히 '프로그램' 또는 '이진 파일' 이라고 부릅니다.

컴파일 되지 않은 코드 역시 '프로그램'이라고 부르는 경우가 있어 '이진 파일'이 조금 더 보편적으로 사용됩니다.

이진 파일은 사람이 눈으로 식별하기 어려운 데이터로 이루어져 있어,

단순히 이 데이터 값을 본다고 해서 어떤 동작을 하는지 알아내기가 어렵습니다.

이를 도와주는 것이 '디스어셈블러(disassembler)', '디컴파일러(decompiler)'와 같은 도구입니다.

사람이 식별하기 어려운 데이터를, 보다 알아보기 쉬운 형태로 변형 시켜주는 역할을 합니다.

 

사람이 알아볼 수 있는 프로그래밍 언어로 이루어진 프로그램을 분석하는 것도 리버싱이라고 부를 수 있을까요?

물론 그렇습니다. 아무리 읽고 이해할 수 있는 텍스트로 이루어져 있다고 해도

단순히 살펴보는 것만으로는 프로그램의 전체 구조와 설계자의 의도를 이해할 수 없습니다.

그렇기 때문에 ‘분석하는 데이터의 형태가 식별 가능한지’가 리버싱인지 아닌지를 결정하지는 않습니다.

리버스 엔지니어링 강의는 시스템 해킹, 웹 해킹 카테고리에 비해 강의 수가 적습니다.

그 이유는, 다른 강의에서 실습 문제를 분석하는 과정도 하나의 리버싱이기 때문입니다.

간단하게 정리하면 리버싱은 '해킹'이면서 동시에 '분석'을 하는 분야입니다.

 

리버스 엔지니어링을 공부하기 위해 필요한 사전 지식

[1] 리버스 엔지니어링을 통해 프로그램의 동작을 이해하기 위해서는

해당 프로그램을 구성하는 프로그래밍 언어를 이해할 수 있어야 합니다.

ex) C 언어로 소스 코드를 작성하고 컴파일한 프로그램은 아무리 사람에게 편한 형태로 복구되어도 C 언어가 최대치.

따라서, C 언어를 모른다면 이를 위한 디컴파일러의 동작은 효과를 보기 어렵습니다.

 

[2] x86 assembly를 읽고 이해할 수 있으면 좋습니다.

물론 x86 assembly에 대한 강의도 존재하기에 처음부터 숙지해야 할 필요는 없습니다.

어셈블리어가 한 종류만 있는 것은 아니지만 기본적으로 복잡하게 구성된 x86 assembly를 이해할 수 있다면

다른 아키텍쳐의 어셈블리어는 보다 손쉽게 습득하실 수 있습니다.

 

어셈블리어를 이해한다는 말은,

프로그램이 low-level에서 메모리를 어떤 방식으로 사용하는지 이해하고 있다는 말과 같습니다.

디컴파일러가 없는 환경에서 리버싱을 해야할 수도 있기 때문에

어셈블리어를 읽고 이해하는 능력은 앞으로 필수적입니다.

 

(2024-01-31 ~ 2024-02-01)

글램핑

 

(2024-02-02)

🚩Web Hacking 101

웹 해킹(Web Hacking)은 웹 상에서 본래의 의도와 다른 동작을 일으키거나

데이터를 도용, 변조, 시스템을 손상시키는 등의 악의적인 행위를 수행하는 것을 말합니다.

웹으로 제공하는 서비스가 매우 다양해지고 복잡한 기능을 구현하면서,

의도치 않은 동작을 일으킬 수 있는 웹 해킹의 위협도 증가하였습니다.

따라서 웹에서 발생할 수 있는 취약점을 알고 방어 대책을 연구하는 것의 중요성이 커지고 있습니다.

 

드림핵에는 다음과 같이 총 세 가지 Web Hacking 로드맵이 기본적으로 존재합니다.

  • Web Hacking Fundamental
  • Web Hacking Advanced - Server Side
  • Web Hacking Advanced - Client Side

Web Hacking Fundamental을 우선 수강 후, Web Hacking Advanced를 들으시는 것을 추천해 드립니다.

 

Web Hacking Fundamental

Web Hacking Fundamental 카테고리의 강의는 안전한 웹 서비스의 구현을 위해 반드시 알아둬야 할 

웹 해킹의 기초적인 지식과 기술을 전달하는 것을 목표로 합니다.

해킹에 대한 막연한 호기심으로 드림핵을 방문하신 분들이 최대한 쉽게 웹 해킹에 입문할 수 있도록 도울 것입니다.

Web Hacking Fundamental 카테고리의 강의는 웹의 기반이 되는 프로토콜인 HTTP/HTTPS와, 

웹 브라우저의 기본적인 원리부터 배웁니다.

이를 시작으로 클라이언트 사이드에서 일어날 수 있는 공격 기법과, 서버 사이드에서 일어날 수 있는 공격 기법을 배우고 실습해보며 웹 해킹의 기초적인 지식과 기술을 익힐 수 있습니다.

 

Web Hacking Advanced - Server Side

Web Hacking Advanced - Server Side 로드맵은 Web Hacking Fundamental 로드맵의 배경 지식을 기반으로,

보다 심화된 내용을 다룹니다. 특히 서버 사이드에서 일어날 수 있는 공격 기법과 보안에 초점을 맞춥니다.

Web Hacking Advanced - Server Side 카테고리의 강의는 웹 서버 개발 시 사용되는 다양한 데이터베이스들

알아보고 각 데이터베이스를 대상으로 수행할 수 있는 SQL Injection 공격 기법을 배우고 실습합니다.

그리고 서버의 운영체제에서 악의적인 명령어를 실행하는 공격인 Command Injection을 배웁니다.

또한 웹 서버에 파일을 업로드하거나 웹 서버로부터 파일을 다운로드할 수 있을 때 수행할 수 있는 공격 기법도

익혀봅니다.

 

Web Hacking Advanced - Client Side

Web Hacking Advanced - Client Side 카테고리의 강의는 

Web Hacking Fundamental 강의의 배경 지식을 기반으로, 보다 심화된 내용을 다룹니다.

특히 클라이언트 사이드에서 일어날 수 있는 공격 기법과 보안에 초점을 맞춥니다.

Web Hacking Advanced - Client Side 카테고리의 강의는 공격자가 웹 리소스에 악성 스크립트를 삽입하여

이용자의 웹 브라우저에서 이를 실행하는 공격 기법인 XSS를 배웁니다.

그리고 이를 막는 여러 가지 필터링을 배우고 이를 우회하는 방법도 시도해봅니다.

브라우저는 악성 스크립트의 실행을 막고 브라우저가 가지고 있는 중요한 데이터가 외부로 유출되지 않도록

다양한 보호 기법이 적용되어 있습니다. 현대 브라우저에 적용된 보호 기법들과 이를 우회하는 방법들도 알아봅니다.

그 밖에 Template Injection, CSS Injection, Relative Path Overwrite,

그리고 DOM XSS 등 클라이언트 사이드를 대상으로한 다양한 공격 기법들도 배우고 실습해봅니다.

 

강의 수강에 필요한 사전 지식 

웹 해킹을 잘 하려면 웹 개발 지식이 필요하다는 말이 있습니다. 이는 맞는 말입니다.

웹 개발자가 작성한 코드를 이해하고 분석하여 취약점을 찾아내기 위해서는 웹 개발에 대한 기본적인 이해와

지식이 필요합니다. 따라서 웹 해킹을 잘하려는 사람들에게 웹 개발은 필수적인 덕목 중 하나입니다.

 

웹 해킹을 위해서는 웹 프로토콜과 웹 서버, 웹 어플리케이션의 작동 방식을 이해하는 것이 중요합니다.

웹 개발에서 사용되는 언어와 프레임워크에 대한 이해도도 높여야 하며,

데이터베이스와 여러 보안 기술에 대한 이해 역시 필요합니다.

 

하지만, 웹 개발자와 웹 해커는 서로 다른 분야이기 때문에, 웹 해킹을 하려는 사람들이

반드시 웹 개발을 전문적인 수준으로 공부할 필요는 없습니다.

웹 개발자의 입장에서 생각하여 웹 서비스를 분석하고, 취약점을 찾는 것이 중요하지만,

웹 해킹에서 사용되는 다양한 도구와 기술들에 대한 이해와 활용 능력도 길러야하기 때문입니다.

 

드림핵의 웹 해킹 강의는 적어도 Flask, NodeJS, 그리고 Spring 중 한 가지 프레임워크로 작성된 웹 소스를 읽고

이해할 수 있는 수준임을 전제로 합니다. 만약 관련 지식이 없다면, 책 또는 온라인에 공개된 웹 개발 강의를 통해

기초적인 웹 서비스를 만들어보시고 난 후 수강하시기를 추천해 드립니다.

 

🚩Cryptography 101

암호학(Cryptography) : 정보를 보호하거나 안전하게 통신하기 위한 방법론을 다루는 학문

더 자세히 말하면, 키(Key)를 이용하여 평문(Plaintext)을 암호문(Ciphertext)으로 변환하거나,

암호문을 평문으로 변환하는 전반적인 과정을 일컫습니다.

암호학은 개인정보 관리, 전자상거래, 클라우드 서비스 등 보안을 유지해야 하는 다양한 영역에서 사용됩니다.

 

암호학은 깊게 파고들수록 수학 지식이 많이 필요하지만, 드림핵의 Cryptography 강의는

암호학을 공부해본 적 없는 분들에게 암호학을 넓고 얕게 전달하는 것을 목표로 하고 있습니다.

따라서 많은 사전 지식을 요구하지는 않으나 다음 지식을 알고 있으면 강의를 수강하고

워게임을 해결해 나가는데 있어서 많은 도움이 됩니다.

 

강의 수강에 필요한 사전 지식

[1] 비트 연산(Bit Operation)

다양한 비트 연산자가 어떤 연산을 하는지 미리 알아야 강의를 수월하게 수강할 수 있습니다.

비트 연산에는 AND, OR, XOR, NOT, SHIFT 등이 있습니다.

비트 연산은 많은 암호학적인 알고리즘의 기반이 되므로 필수로 알아야 합니다.

강의를 수강하거나 워게임 해결을 시도할 때 또한 많은 비트 연산을 마주치게 됩니다.

새로운 비트 연산을 만날 때마다 공부해도 되지만 미리 각 비트 연산이 어떤 연산을 하는지 미리 이해하고 시작하신다면

좀더 수월하게 암호학 강의를 수강할 수 있습니다.

 

[2] 모듈로 연산(Modulo Operation)

모듈로 연산이 기본적으로 어떤 연산을 하는지 알면 강의를 수월하게 수강할 수 있습니다.

모듈로 연산(Modulo Operation)은 나머지 연산이라고도 불리며,

어떤 숫자를 다른 숫자로 나눈 나머지 값을 구하는 연산입니다.

많은 암호화 알고리즘에서 공개키와 개인키 및 소수를 나타내기 위해 큰 정수가 사용되며,

모듈로 연산은 큰 정수에 대한 산술을 효율적으로 연산하는 방법을 제공하므로

암호학을 공부하려면 반드시 알아야 하는 연산입니다.

모듈로 연산은 다양한 법칙과 특징을 가지고 있습니다.

하지만 드림핵의 암호학 강의는 모든 법칙과 특징을 설명하지 않습니다.

하나의 개념을 설명할 때 필요할 때 필요한 지식을 개괄적으로 설명하고 넘어가므로

미리 깊게 모듈로 연산을 미리 깊게 공부할 필요는 없습니다.

기본적으로 어떤 연산을 하는지만 알고가면 됩니다.

 

[3] Python

Python은 미리 필수적으로 알고 강의를 수강하여야 수월하게 내용을 이해할 수 있습니다.

강의에서 암호화 알고리즘의 구현을 보여줄 때 Python으로 작성된 코드를 기준으로 설명합니다.

또한 드림핵의 암호학 워게임이 제공하는 파일은 Python으로 작성된 파일들이 많습니다.

따라서 기본적으로 Python을 읽고 사용할 수 있는 수준이 되어야 수월하게 강의를 수강하고

워게임을 해결해나갈 수 있습니다.

'공부 > 비기너즈' 카테고리의 다른 글

DH101(1)  (0) 2023.12.30
3. Environment Setup  (0) 2023.12.29
2. How to use  (0) 2023.12.28
1. Introduction  (2) 2023.12.27

댓글