1. Introduction to Dreamhack
해킹
웹해킹
시스템해킹(포너블, 소프트웨어 해킹)
- 소프트웨어의 취약점을 찾아서 이를 공격하는 해킹
- 리버스 엔지니어링(리버싱): 프로그램을 역으로 분석하여 작동 원리를 알아내는 기술
2. Wargame
워게임
- 의도적으로 취약점이 존재하도록 설계된 모의 해킹 환경
- 카테고리로는 포너블, 웹, 리버싱, 암호학, 포렌식, misc 등이 있다.
플래그(Flag)
- 공격 대상인 시스템에 존재하는 파일
- CTF(Capture The Flag): 플래그의 내용이 공격자가 제출해야 하는 답안이다. 해킹 방어 대회에서 많이 쓰는 형식이다.
- 드림핵에서 사용하는 플래그는 보통
DH{}
형식의 중괄호 사이에 보통 해시값(숫자와 abcdef로 이루어져있는)이 들어있는 형태를 플래그로 사용하지만, 여기에는 문제 출제자가 하고 싶은 말이 들어갈 수도 있고, 때로는 예상치 못한 형태일 수도 있다.
라이트업
- 워게임이나 CTF에서 플래그를 찾는 과정에서 문제 풀이 과정을 정리한 것.
- 문제를 풀 때 순차적으로 풀이자가 하는 일 체크리스트
- 주어진 문제가 어떤 프로그램/서비스인지 이해했다. - 풀이 없이 수행
- 취약점(또는 이상한 부분)이 무엇인지 파악했다.
- 찾은 취약점을 어떻게 공략/공격하면 될지 구상이 되었다.
- 풀이에 필요한 코드나 페이로드를 작성했다
실습: Welcome-Beginners
https://dreamhack.io/wargame/challenges/812

풀이
1. 터미널 창 실행
2. vm 접속 후 드림핵에서 제공하는 nc 명령어 입력
3. 입력창에 'Dreamhack' 입력
4. Welcome Beginners!가 출력되면 성공이다.
5. DH{}의 내용을 복사하여 드림핵에 입력
3. 컴퓨터 과학 기초
컴퓨터 과학
- 컴퓨터를 이용한 모든 작업과 그 기반 이론을 연구하는 학문(코딩, 계산 이론, 알고리즘, 소프트웨어 설계, 네트워크 등도 포함)
해킹
- 컴퓨터 과학 지식을 응용하여 프로그램이나 시스템의 취약점을 발견하고 공격하는 행위
- 해킹을 공부하기 위해서는 컴퓨터 과학에 대한 기본적인 지식이 필요함.
비트와 바이트
- 여러 개의 비트로 구성된 이진 데이터에서 가장 왼쪽에 있는 비트를 MSB(Most Significant Bit, 최상위 비트), 가장 오른쪽에 있는 비트를 LSB(Least Significant Bit, 최하위 비트)라고 한다.
- 바이트 오더링: 2바이트 이상의 데이터는 메모리에 연속적으로 저장되는데, 이때 각 바이트가 메모리에 정렬되는 방식을 뜻한다. 바이트 오더링은 빅 엔디안(Big Endian)과 리틀 엔디안(Little Endian)이 있다. 바잍 오더링으로 메모리를 정렬할 때는 비트의 순서가 아닌 바이트의 순서를 고려하는 것이므로 바이트 내 비트의 순서는 동일하고 바이트의 순서만 달라진다.
- 빅 엔디안: 큰 바이트부터 낮은 주소에 저장된다. 네트워크 상에서 데잍를 전송할 때 따른다.
- 리틀 엔디안: 작은 바이트부터 낮은 주소에 저장된다. 개인용 컴퓨터 및 서버 환경에서 사용되므로 리틀 엔디안 방식을 잘 알고 있어야 한다.
- 빅 엔디안과 리틀 엔디안을 설명할 때 이용되는 MSB와 LSB에서 B는 bit가 아닌 byte를 의미한다.
- 데이터가 어떤 바이트 오더링으로 메모리에 저장되었는지 고려하는 것이 중요하다.
시프트 연산자
- x<<n: 비트를 n만큼 왼쪽으로 이동하고 오른쪽 빈칸은 모두 0으로 채운다. x * 2^n이라는 뜻이다.
- x>>n: 비트를 n만큼 오른쪽으로 이동하고 왼쪽 빈칸은 가장 왼쪽에 있던 비트와 동일한 비트값으로 채운다.(양수는 양수, 음수는 음수로 부호사 유지된다.) x/(2^n)이라는 뜻이다.
- x>>>n: 비트를 n만큼 오른쪽으로 이동하고 왼쪽 빈칸은 모두 0으로 채운다.(음수는 부호가 유지되지 않는다.)
인고딩, 디코딩
- 인코딩: 데이터의 크기를 줄이거나 컴퓨터어로 변환하는 등 데이터를 특정한 형식으로 변환하는 것. 암호화와 비슷하지만 인코딩은 누구나 원문을 구할 수 있다는 차이점이 있음.
- 디코딩: 인코딩된 데이터에서 원래의 값을 구하는 것.
Base64 인코딩
운영체제
- 응용 프로그램: 사용자가 원하는 작업을 수행할 수 있도록 사용자를 위해 특정한 기능을 수행하는 프로그램.
- 운영체제: 응용 프로그램의 동작을 수행하고, 응용 프로그램에게 시스템 자원을 할당하는 등의 복잡한 관리 작업을 수행하는 소프트웨어. 컴퓨터 하드웨어와 사용자/응용 프로그램 사이에서 중재자 역할을 함.
- 운영체제는 CPU스케줄링, 메모리 공간 분배 및 관리, 컴퓨터와 입출력 장치 사이에 정보 교환 과정 관리, 사용자와 컴퓨터 사이 인터페이스 역할
커널과 셸
- 커널: 하드웨어 관리를 실제로 수행하는 프로그램
- 셸: 사용자와 운영체제의 커널 사이에서 사용자가 운영체제에 명령을 내릴 수 있도록 인터페이스 역할을 함. 명령어를 해석하여 사용자와 운영체제가 소통할 수 있도록 함.
- 셰을 획득하는 것을 시스템 해킹의 성공으로 여김.
실습: 64se64
https://dreamhack.io/wargame/challenges/872
풀이
1. 문제 파일을 다운 받아 html 코드를 열었다.
2. 코드에서 name="64se64_encoding"를 통해 Base64 인고딩 방식으로 된 텍스트라는 것을 유추하고 인코딩된 텍스트를 다시 디코딩하였다.
3. 디코딩을 하였더니 파이썬 코드라는 것을 알게 되었다.(#!/usr/bin/env python3를 통해 알게 됨)
4. 파이썬 코드를 그대로 실행하였더니 터미널에 플래그가 출력되었다.
