Page 1


6

목차

Part

00 서론

Part

01 바이너리 분석

01 _ CTF란?

12

0.1.1 _ CTF란 무엇일까?

12

0.1.2 _ CTF에서 출제되는 문제

13

0.1.3 _ CTF 경기 형식

14

02 _ CTF 참가

16

0.2.1 _ CTF를 찾자

16

0.2.2 _ CTF에 참가하자

18

0.2.3 _ 대회 종료 후 Writeup을 읽자

18

03 _ 주의점

19

04 _ 법률

19

0.4.1 _ 부정 액세스란?

20

0.4.2 _ 법률 고려

21

0.4.3 _ 혹시 취약점을 발견한다면

22

05 _ CTF를 해보자

23

01 _ 1단계: 바이너리 분석이란?

26

1.1.1 _ 바이너리란 무엇인가?

26

1.1.2 _ 바이너리 분석에 대한 인식

27

1.1.3 _ 바이너리를 분석한다는 것의 의의

28

1.1.4 _ CTF의 바이너리 문제

28

1.1.5 _ 바이너리 분석과 윤리

29

1.1.6 _ 이 책의 대상

30

1.1.7 _ 정리

30

02 _ 2단계 : 바이너리 분석 환경 구축

31

1.2.1 _ 분석용 도구 소개

31

1.2.2 _ 환경 구축

41

1.2.3 _ 정리

43


7

목차

Part

02 PWN

03 _ 3단계: 바이너리 분석 입문

44

1.3.1 _ 바이너리 분석 절차

44

1.3.2 _ 표층 분석

44

1.3.3 _ 동적 분석

49

1.3.4 _ 정적 분석

66

1.3.5 _ CTF에서의 바이너리 분석

94

1.3.6 _ 정리

96

01 _ 1단계: pwn이란?

100

2.1.1 _ pwn의 유래와 의미

100

2.1.2 _ pwn 문제의 흐름

100

2.1.3 _ 도구 소개

101

2.1.4 _ 실행 환경

103

02 _ 2단계: 사전 조사

105

2.2.1 _ 로컬 익스플로잇과 원격 익스플로잇

105

2.2.2 _ 실행 파일의 보안 메커니즘 확인

106

03 _ 3단계: 취약점 탐색

110

2.3.1 _ 방침

110

2.3.2 _ 사용자 입력을 처리하는 함수

111

2.3.3 _ printf 관련 함수의 포맷 스트링

113

04 _ 4단계: 익스플로잇

114

2.4.1 _ 스택 기반 버퍼 오버플로우 114 2.4.2 _ 포맷 스트링 버그

130

05 _ 5단계: pwn! pwn! pwn!

138

2.5.1 _ 익스플로잇 코드

138

2.5.2 _ ASLR 우회

139


8

목차

Part

03 네트워크

01 _ 1단계: CTF에서의 네트워크 분야를 알자 3.1.1 _ 어떤 문제가 출제되는가

152

3.1.2 _ 네트워크 분야의 문제를 풀기 위해 필요한 것

154

3.1.3 _ 이번 장에서 다루는 내용

155

02 _ 2단계: 네트워크 프로토콜

156

3.2.2 _ 네트워크 프로토콜

157

3.2.3 _ 네트워크 계층과 데이터 캡슐화

157

웹 문제

159

3.3.1 _ 패킷이 기록된 파일

159

3.3.2 _ 와이어샤크를 이용한 패킷 분석

165

3.3.3 _ 와이어샤크 - 분석 기능을 이용한 패킷 분석

167

3.3.4 _ 와이어샤크 - 조건에 맞는 패킷 표시

176

3.3.5 _ 와이어샤크를 이용해 실제 CTF 문제를 풀어보자

185

3.3.6 _ 파이썬 프로그래밍 언어를 이용한 패킷 분석

193

3.3.7 _ 스캐피를 이용한 문제 풀이

196

3.3.8 _ 그 밖의 다른 도구를 이용한 패킷 분석

202

04 _ 4단계: 패킷 송수신

04

156

3.2.1 _ 네트워크란?

03 _ 3단계: 패킷 분석

Part

152

203

3.4.1 _ Netcat을 이용한 송수신

203

3.4.2 _ 소켓을 이용한 송수신

205

3.4.3 _ 스캐피를 이용한 패킷 송수신

208

01 _ 1단계: 웹 문제란?

214

4.1.1 _ 웹 문제의 특징

214

4.1.2 _ 웹 문제의 개념

214

02 _ 2단계: 임의 코드 실행 취약점에 대해

218

4.2.1 _ 임의 코드 실행 취약점이란?

218

4.2.2 _ 임의 코드를 실행하기 위해

219

4.2.3 _ 실제 공격

220


목차

03 _ 3단계: 각종 취약점 이용 4.3.1 _ 돌파구 찾기

221

4.3.2 _ 운영체제 명령어 인젝션

221

4.3.3 _ 파일 권한 미비

225

4.3.4 _ 각 언어별 고유 처리

226

4.3.5 _ 알려진 취약점 이용

227

04 _ 4단계: 셸을 탈취한 후

Part

05 SQL 인젝션

221

228

4.4.1 _ FLAG 획득

228

4.4.2 _ 권한 및 환경 파악

229

01 _ 1단계: SQL 인젝션이란?

232

5.1.1 _ 준법 정신

232

5.1.2 _ 데이터베이스 조작을 위한 언어, SQL

232

5.1.3 _ SQL 인젝션으로 할 수 있는 것

235

02 _ 2단계: 공격 전에

239

5.2.1 _ SQL 인젝션을 하기 전에

239

5.2.2 _ SQL 인젝션 가능 여부 확인

240

5.2.3 _ SQL 구문의 어디에 인젝션이 되는지 추측

248

5.2.4 _ 동작 환경 확인

250

03 _ 3단계: 공격해보기 5.3.1 _ SELECT 구문에서 인젝션 04 _ 4단계: 발전 5.4.1 _ INSERT 문 인젝션

253 253 269 269

9


10

목차

Part

06 부록

01 _ 바이너리 분석 팁

272

부록 1.1 _ 분석 방해 기능을 찾아내고 우회하는 방법

272

부록 1.2 _ 바이트코드 분석

275

부록 1.3 _ x86/x64 이외의 아키텍처를 읽고 분석하려면

280

부록 1.4 _ 바이너리 문제를 풀기 위한 프로그래밍 기법

282

부록 1.5 _ 정리

284

02 _ 셸 코드

285

부록 2.1 _ 셸 코드란?

285

부록 2.2 _ 셸 코드 기초 지식

285

부록 2.3 _ 셸 코드를 만들어보자

287

부록 2.4 _ 셸 코드 압축

289


Part

00 서론


01

CTF란?

0.1.1 _ CTF란 무엇일까? 이 책을 선택한 것에 감사한다. 이 책과 CTF를 통해 여러분이 조금이나마 정보 기술, 그리고 정보 보안 기술에 흥미를 가지게 된다면 기쁠 것이다. 그럼 이 책의 주제인 ‘CTF’가 무엇인지 알아보자. ‘Capture The Flag’의 이니셜을 딴 것으로 한국어로 바꾼다면 ‘깃발 뺏기’라고 번역할 수 있다. 많은 온라인 게임에서도 이런 깃발 뺏기 모드가 있다. 게임을 많이 해본 사람이라면 쉽게 이해할 수 있을 것이다. 경기 내용을 한 문장으로 설명하면 ‘정보 기술에 대한 문제를 적절히 처리하고, 그에 따라 획 득한 점수로 승패를 결정한다’다. 좀 더 자세히 설명하면 출제된 퀴즈의 답을 전송하는 단순한 것부터 특정 소프트웨어와 웹 시스템의 취약점을 찾아 원래대로라면 볼 수 없는 부분에 있는 정보를 읽어오거나 방대한 크 기의 데이터 중에서 필요한 정보만 획득하는 것까지 다양한 내용이 있다. 최근에는 CTF 경기장의 모습 등이 뉴스 방송에서 나오는 경우도 종종 있어서 여러 명이 집 중해서 그런 작업을 하는 모습이나 문제를 해결하는 모습을 본 분도 있을 것이다.


01장 _ CTF란?

0.1.2 _ CTF에서 출제되는 문제 우선 출제되는 문제가 어떤지 대략적으로 알아보기 위해 간단한 예제를 만들었다. 직접 풀어 보길 바란다. 아래에 나오는 문장은 무엇을 의미하는 것일까? IZL LUX HKMOTTKXY.

모른다면 문장을 읽지 말고 위의 문장이 어떤 특징을 띠고 있을지 생각해 보는 것이 좋을 것 이다. 한눈에 알 수 있는 것은 모든 글자가 대문자라는 것이다. 그리고 모든 문자가 알파벳이 며 적절하게 빈 칸이 들어가 있다는 것 등이다. 그 밖에도 많은 특징을 찾을 수 있을 것이다. 무엇이 써 있는지 찾았는가? 정답은 CTF FOR BEGINNERS

가 된다. 이 문제는 원래 문장의 알파벳을 특정 숫자만큼 옮겨서 치환한 문장이다. 이 예에서는 7글자만 큼 뒤에 있는 문자로 변경했다. 즉, A는 G, B는 H, C는 I처럼 알파벳이 변경된다.

Caesar

원래 문장으로 되돌리려면 7글자만큼 앞으로 옮기면 원래의 문자가 나온다. 이 암호화 방식은 매우 잘 알려진 암호화 방식으로 ‘카이사르(시저) 암호’라고 한다.

CTF에서는 득점이 되는 정답 문자열을 ‘깃발(Flag)’이라고 하며 이를 획득해 점수를 얻는 것 이 기본이다.

13


14

Part 00 _ 서론

실제 경기에서는 이처럼 간단한 암호가 출제되는 일은 거의 없고, 더 어려운 난이도의 암호 화 문제가 출제되는 경우가 많다. 그런 경우에는 위의 문제에서 본 것과 같이 여러 가지 특징 을 찾아서 문제를 풀어나가야 한다.

CTF에서는 위와 같은 암호화 외에도 프로세서에 대한 지식이나 네트워크, 웹 등 다양한 지 식을 사용해 풀어야 하는 문제가 많이 출제된다. 지금 이런 문제를 몰랐다고 해도 문제 없다. 이 책을 통해 차근차근 단계적으로 학습해 나가 면 된다.

0.1.3 _ CTF 경기 형식 CTF 경기 형식은 크게 문제 출제 형식과 공방전 형식으로 두 가지가 있다. 영어로는 각각 Attack-Defence와 Jeopardy(제퍼디)라고 한다.

문제 출제 형식 문제 출제 형식은 준비된 문제를 풀어 점수를 획득하는 방식이다. 출제 형식은 정해져 있지 않지만 보통 ‘분야’와 그에 따른 ‘점수’가 설정된다. 참가자들은 그 안에서 자유롭게 문제를 선 택해 풀어나가게 된다. 앞에서도 잠시 언급했지만, 영어로는 제퍼디라고 하는데, 이는 미국 의 유명 퀴즈 프로그램인 제퍼디와 비슷한 방식으로 진행되기 때문에 이 이름이 붙었다. 아 마 EBS의 장학퀴즈를 생각하면 쉽게 이해할 수 있을 것이다. 이 경기 방식은 이어서 설명할 공방전 형식과 비교하면 간단한 편이고, 스스로 완급 조절이 가능하기 때문에 대처하기 쉬운 편이다.

공방전 형식 공방전(攻防戦) 형식은 그 이름과 같이 ‘공격’과 ‘방어’를 하게 된다. 구체적으로 설명하자면 각 팀은 동일한 서버와 동일한 네트워크 환경으로 구성된 시스템을 할당받는다. 각 팀은 할당받 은 시스템에 존재하는 취약점이나 문제를 파악한 뒤 상대 팀을 공격하거나 취약점을 고쳐 방 어해야 한다. 이런 방식으로 진행되는 CTF 중에서는 DEFCON CTF 본선이 가장 유명하다. 한국에서는 KISA에서 주최하는 해킹 방어 대회(HDCON)에서 이런 CTF를 도입했으나, 최 근에는 방어 및 포렌식 위주로 바뀌고 있다.


01장 _ CTF란?

필자가 예전에 참가한 HITB(말레이시아)의 경험으로 설명해 보자면 각 팀별로 1대의 PC가 할당되고, 그 PC에는 몇 개의 서비스가 가동되는 우분투 리눅스가 가상 환경으로 설치돼 있 었다. 해당 서비스가 정상으로 작동하고 있는지 확인하고, 서비스의 취약점을 찾아 다른 팀 에 있는 깃발(Flag)을 탈취해 오면 득점하게 된다. 경기 중에는 서비스에 대해 어떤 취약점 이 있는지, 어떻게 해야 그것을 악용해서 공격을 할 수 있는지 검토하고, 자신의 시스템에 존 재하는 취약점에 대한 대책도 세워야 한다. 이후 다른 팀을 공격해서 득점을 시도했다. 이 경기 방식은 실제로 취약점을 찾아 공격할 수 있어야 하기 때문에 높은 실력이 필요하지 만 문제 출제 형식 CTF에 많이 출전한 사람이라면 이 방식도 꼭 참가해 볼 것을 권한다.

15


02

CTF 참가

0.2.1 _ CTF를 찾자 CTF에 참가하려면 먼저 CTF 대회를 찾아야 한다. 세계 각지에서 개최되는 CTF 정보 가 모여있는 사이트를 찾아보면 좋을 것이다. 이런 사이트 중 유명한 사이트로는 CTF

Time(http://ctftime.org/)이 있다.

CTFTIME


02장 _ CTF 참가

페이지 아래쪽에 있는 ‘Upcoming events’에 곧 개최될 CTF 대회 목록이 나온다.

CTFTIME UPCOMING

처음으로 참가한다면 장소가 Online이라고 돼 있는 제퍼디 형식에 참가해 봐도 좋을 것 이다.

CTFTIME UPCOMING FORMAT

CTFTIME UPCOMING FORMAT

17


18

Part 00 _ 서론

KISA에서 주최하는 HDCON의 정보는 페이스북 페이지인 https://www.facebook.com /hdcon에서 확인할 수 있다.

HDCON 페이스북 페이지

0.2.2 _ CTF에 참가하자 참가할 수 있을 것 같은 CTF를 찾았다면 등록을 해보자. 온라인으로 열리는 문제 출제 형식

CTF라면 문제를 거의 풀 수 없는 사람도 등록할 수 있고, 등록하고 참가하지 않아도 별다른 문제는 없으므로 가볍게 분위기를 느낀다는 기분으로 참가 신청을 해보자.

0.2.3 _ 대회 종료 후 Writeup을 읽자 CTF 종료 후에는 ‘CTF 이름’과 ‘Writeup’이라는 키워드로 검색해보자. 문제의 해결 방법이나 정답을 찾을 수 있을 것이다. 경기가 끝나고 나면 각 팀이 푼 문제의 해결 방법을 공유하는 것이 일반적이다. 이런 정보를 찾아 잘 정리해 두면 여러 가지 문제 풀이 방법도 알 수 있게 되므로 이후에 또 도전할 때 많 이 도움될 것이다.


03

주의점

CTF에 참가할 때 다음과 같은 점을 확인해야 한다. ■■ 경기

규칙은 무엇인가

■■ 경기에 ■■ IRC나

사용하는 서버, 공격 가능한 서버 주소는 무엇인가 경기 관련 사이트에서 새로운 정보가 나와 있지 않은가

확인을 소홀히 할 경우 경기를 풀어나가기 위한 힌트를 받지 못해 불리해질 수도 있고, 경우 에 따라서는 규칙 위반이 되기 때문에 페널티를 받을 가능성도 있다.

CTF에 따라서는 아마존 웹 서비스(Amazon Web Services; AWS)나 마이크로소프트 Azure 같은 클라우드 환경을 사용해 구축하는 경우도 있고, 문제를 풀기 위한 힌트를 얻기 위해 네트워크 스캔을 하는 경우 그 방법에 따라 이후에 설명할 ‘부정 액세스’로 처리될 가능 성도 생각해야 한다. 경기 중에는 정보 수집을 열심히 하고, 규칙과 법률을 준수하며 즐겁게 참가하자.


04

법률

0.4.1 _ 부정 액세스란? 앞의 0.3절 끝에서 언급한 ‘부정 액세스’는 실제 법률에서 어떻게 정의돼 있을까? 대한민국에 서는 ‘정보통신망 이용촉진 및 정보보호 등에 관한 법률’에 다음과 같이 정의돼 있다. 제48조(정보통신망 침해행위 등의 금지) ① 누구든지 정당한 접근권한 없이 또는 허용된 접근권한을 넘어 정보통신망에 침입하여서는 아니 된다. ② 누구든지 정당한 사유 없이 정보통신시스템, 데이터 또는 프로그램 등을 훼손·멸실·변경·위조하거 나 그 운용을 방해할 수 있는 프로그램(이하 “악성프로그램”이라 한다)을 전달 또는 유포하여서는 아 니 된다. ③ 누구든지 정보통신망의 안정적 운영을 방해할 목적으로 대량의 신호 또는 데이터를 보내거나 부정한 명령을 처리하도록 하는 등의 방법으로 정보통신망에 장애가 발생하게 하여서는 아니 된다.

어렵게 쓰여있지만, 간단하게 설명하자면 ‘관리자가 아닌 사람이 허락 없이 아래 행위를 하는 경우’ 에 ‘부정 액세스’라고 표현한다. ■■ 다른

사람의 계정 정보(인증 정보)를 사용해 시스템에 로그인하는 행위

■■ 인증

시스템을 공격해 인증을 우회하는 행위(SQL 주입 등으로 웹 사이트 로그인을 우회하는 등)

■■ 네트워크를

통해 다른 시스템에 공격을 실시해 해당 시스템을 장악하는 행위


04장 _ 법률

물론 이 세 가지가 전부는 아니다. 법률상으로도 더 많은 행위가 부정 액세스로 간주될 수 있 다. 하지만 대략 위의 행위가 위법 행위라는 것을 잘 기억해 두자. 그리고 법률을 위반한 경우 아래와 같은 벌칙에 따라 처벌을 받게 된다.

제71조(벌칙) 다음 각 호의 어느 하나에 해당하는 자는 5년 이하의 징역 또는 5천만원 이하의 벌금에 처한다. 9. 제48조제2항을 위반하여 악성프로그램을 전달 또는 유포한 자 10. 제48조제3항을 위반하여 정보통신망에 장애가 발생하게 한 자 제72조(벌칙) ① 다음 각 호의 어느 하나에 해당하는 자는 3년 이하의 징역 또는 3천만원 이하의 벌금에 처 한다. 1. 제48조제1항을 위반하여 정보통신망에 침입한 자

물론 CTF 규칙을 잘 따르며 참가하는 경우라면 대회 참가라는 ‘정당한 접근 권한’을 가지고 있는 것이므로 법률에 위배되지 않으니 안심해도 된다. 단, CTF를 하듯 일반 사이트나 시스템에 이런 공격을 하게 되는 경우 정당한 접근 권한이 없는 해킹 시 도가 되어 법에 저촉되니 주의하자.

0.4.2 _ 법률 고려 대한민국 법에서 범죄자를 구분하는 방법은 두 가지가 있다. 실질범(결과범)과 형식범(거동 범)이다. 형식범의 경우 결과 발생이 없어도 범죄가 성립된다. 예를 들어, 실제 공격할 의사 가 없었고, 취약점도 없었지만 어떤 기업 시스템을 포트 스캔한 경우 피해는 발생하지 않았 어도 ‘위협이 되는 행위’를 했기 때문에 범죄가 된다. 그리고 법률은 국가에 따라 다르기 때문에 한국에서는 불법이 아닌 행위라도 해외에서는 불 법이 되는 경우가 있다. 해외에 설치된 서버에 대한 공격을 수행한 경우, 서버가 설치된 국가 의 법률을 적용받기 때문에 주의해야 한다. 즉, 어떤 사이트나 시스템에 대한 공격은 ‘CTF 대회니까 허용’해줄 뿐, 그 외에는 모두 허락을 득한 것이 아니기 때문에 법률 위반이 된다.

21


22

Part 00 _ 서론

종종 벌어지는 일이지만 기업이나 학교 네트워크 또는 시스템에 대한 공격은 해당 관리자로 부터 허가를 받지 않는 한 모두 불법이다. 좋은 의도로 취약점 진단을 시도한다고 해도 기본 적으로 불법이니 이런 행동은 하지 않도록 하자.

0.4.3 _ 혹시 취약점을 발견한다면 웹 서핑을 할 때 ‘취약점이 될 수 있는’ 것을 발견하거나, 사용하는 소프트웨어의 취약점을 발 견하는 경우 ‘KISA 보호나라’에 해당 취약점을 신고할 수 있다. KISA 보호나라 http://www.krcert.or.kr

‘보안’이라는 단어가 많이 익숙해지긴 했지만 모두가 보안에 익숙한 것은 아니다. 만약 ‘귀사 의 시스템에 보안 취약점이 존재합니다’라고 메일을 쓰거나 전화 연락을 한다면 상대방은 오 히려 이를 위협으로 생각할 수도 있다. 해당 시스템 관리자가 직접 취약점 또는 버그 리포팅 을 받지 않는 이상 공인된 사이트인 KISA 보호나라를 통해 보고하자. 취약점을 신고한 뒤에는 해당 취약점이 패치될 때까지 취약점을 공개하지 않아야 한다. 취약 점이 고쳐지기 전에 정보를 공개하면 해당 정보가 악용돼 2차 피해가 발생할 수 있다. 그리고 다시 한 번 강조하지만 이렇게 취약점을 조사하고 발견할 때도 ‘부정 액세스’에 해당 하지 않도록 주의해야 한다. 취약점을 찾고 싶은 마음에 부정 액세스에 해당하는 방법으로 취약점을 찾았다면 이후에 문제가 발생할 가능성이 있다. 취약점 신고는 면죄부가 아니기 때문에 ‘취약점이 될 것 같은 것’을 찾는다면 검증을 하지 말고 신고하자. 어떤 일이라도 법률을 준수하며 즐기자.


05

CTF를 해보자

여기까지 읽으며 CTF에 대한 흥미가 높아졌을 것으로 생각한다. 아니면 아직 어렵다는 인상 을 받았을 수도 있다. 다음 장부터는 본격적으로 각 분야에 대한 설명을 시작한다. 갑자기 모든 분야에 대한 지식 을 익힐 필요는 없다. 자신이 좋아하는 분야를 찾아서 그 분야의 문제를 먼저 풀어보고 다른 분야를 공부해도 문제 없다. 이 책의 내용을 통해 독자들이 한 문제라도 더 풀 수 있게 되길 바란다.

Column 해커와 화이트 해커 최근에 ‘화이트 해커’라는 말을 뉴스 등에서 종종 듣게 되는데, 이 단어는 한국과 일본에서만 쓰인다. 일반적으로 ‘해커’라면 나쁜 일을 하는 사람이고, ‘화이트 해커’는 그에 반대되는 일을 하는 사람으로 표 현되고 있다. 하지만 영어권에서 ‘해커’라는 말에는 좋다, 나쁘다라는 가치가 들어있지 않다. 한국이나 일본에서 ‘화이트 해커’라고 말하면 의미가 동일하게 통하지만 영어권 국가에서는 아마 통 용되지 않을 것이다. 만약 해외에서 관련된 이야기를 나눌 경우 화이트 해커는 ‘White Hat’, 해커는 ‘Attacker’라고 표현하면 어느 정도 의미는 통할 것이다.


01 바이너리 분석


01

1단계: 바이너리 분석이란?

바이너리 분석을 학습하기에 앞서 바이너리는 무엇이고, 왜 바이너리 분석을 하는지 먼저 설 명해두고자 한다.

1.1.1 _ 바이너리란 무엇인가? 이 책을 읽는 분 중에서 ‘바이너리’라는 말의 정확한 의미를 아는 분도 있을 테고, 정확히 어 떤 것인지 잘 모르는 분도 적지 않을 것이다. 전문 용어를 조사하는 데 국어사전을 찾는 것도 이상한 일이니 IT 용어 사전을 찾아보자. 바이너리를 찾아보면 ‘바이너리(binary)란 2진수 라는 의미로서, 바이너리 파일은 0과 1, 즉 2진수로 이뤄진 파일을 의미한다. 컴퓨터 통신에 서는 주로 화상, 음성 등 대부분의 파일이 바이너리 파일로 처리된다.’(‘컴퓨터인터넷IT용어 대사전’에서 발췌)라는 설명을 볼 수 있다. 이 내용을 토대로 좀 더 찾아본다면 다음과 같은 설명도 찾아볼 수 있다. ‘2진수는 2를 기반 으로 하는 숫자 체계로 컴퓨터에서 데이터를 표현하기 위해 사용된다. 2진수는 “0”과 “1”이 라는 오직 두 가지 종류의 숫자로만 구성된다. 대부분의 경우 사람들은 0부터 9까지 모두 10 개의 숫자로 구성된 10진법을 주로 쓰며, 그보다 큰 숫자는 이러한 10개의 숫자를 조합해서 만든다. 그러나 컴퓨터는 오직 0과 1로만 구성되는 2진법 체계에 기초하고 있다.’1 하지만 이 1 네이버 지식백과: http://terms.naver.com/entry.nhn?docId=4456&cid=43659&categoryId=43659


01장 _ 1단계: 바이너리 분석이란?

책에서 나오는 ‘바이너리’라는 말과 일반적으로 말하는 ‘바이너리 분석’에서의 바이너리는 그 것보다 제한적인 의미만 갖는다. 즉, 좁은 의미로 ‘실행 가능한 형식의 데이터 파일’을 말한 다. 이 실행 가능한 형식에는 마이크로소프트 윈도우의 PE(일반적으로 EXE 파일이라고 한 다)나 리눅스의 ELF 같은 것이 있다. 좀 더 쉽게 이해하자면 윈도우의 계산기나 메모장과 같 이 더블클릭을 해서 실행할 수 있는 소프트웨어를 생각하면 된다. 이런 프로그램도 ‘바이너 리’에 포함된다. 그리고 CTF에서는 이런 ‘바이너리’를 분석하는 문제가 자주 출제된다. 어떻 게 작동하는지 알 수 없는 바이너리 파일을 받고, 그 파일이 어떻게 작동하는지 등을 다양한 방법을 통해 알아내야 한다.

1.1.2 _ 바이너리 분석에 대한 인식 여기서는 본격적으로 바이너리 분석을 공부하기 전에 바이너리를 분석한다는 것은 어떤 것 인지 간단하게 알아본다. 만약 누군가에게 어떤 프로그램을 주면서 그 프로그램이 어떻게 동 작하는지 분석하라고 하면 어떻게 행동할까? 대부분의 사람은 실행부터 해볼 것이다. 그리 고 그 프로그램의 소스코드가 존재한다면 그것을 읽어 볼 수도 있을 것이다. 바이너리 분석 방법도 이런 방법과 크게 다르지 않다. 먼저 실제로 프로그램을 실행해 보면 어떤 동작을 하 는지 대략적으로 알 수 있다. 그리고 더욱 자세히 알고 싶은 부분이 있다면 코드를 확인한다. 하지만 바이너리 분석은 다양한 기술과 기법을 활용해 더 많은 정보를 얻어야 하고, 대부분 의 경우 소스코드가 없으므로 소스코드가 아닌 다른 형태의 코드를 읽어야 한다. 앞서 설명한 바와 같이 바이너리라고 하는 것은 실행 파일이며 프로그램이다. 동작을 확인하 기 위해서는 우선 실행해 보는 것이 제일이다. 하지만 그때 그냥 실행하는 것만으로는 표준 입출력 이상의 정보는 얻을 수 없으므로 다양한 정보를 얻을 수 있는 전용 프로그램을 사용 해 도움을 받는 것이 좋다. 그리고 프로그램이 어떻게 작동하는지 알기 위해 소스코드를 읽 듯 바이너리를 분석할 때도 코드를 읽는다. 단, 바이너리의 코드는 한 번 컴파일된 것이기 때 문에 소스코드가 아니라 ‘역어셈블’이라는 처리 과정으로 얻어진 어셈블리 코드를 읽게 된다. 역어셈블이란 기계어로 된 코드를 사람이 해석하기 쉬운 어셈블리 언어로 변환하는 것이다. 어셈블리 코드는 막연히 어렵다고 생각하는 사람이 많지만 실제로는 소스코드를 읽는 것과 크게 다르지 않다. 단지 어셈블리 명령을 읽는 방법만 새로 익히면 된다.

27


28

Part 01 _ 바이너리 분석

어쨌든 바이너리 분석은 어렵다는 막연한 생각을 버리고 실제로 바이너리를 실행하면서 프 로그램 상태를 관찰하고, 어셈블리 코드를 차근차근 읽어보자. 분명 새로운 세계가 보일 것 이다.

1.1.3 _ 바이너리를 분석한다는 것의 의의 바이너리를 분석한다는 것에는 어떤 의미가 있을까? 물론 CTF에서 우승하기 위한 것도 있 지만 CTF는 정보 보안과 관련된 경기이기 때문에 바이너리를 분석하는 것 자체는 어떤 형태 로든 정보 보안에 관련된 일이 된다. 여기서는 바이너리 분석 기술이 어떻게 도움이 될 수 있 는지를 다룬다. 먼저 보안 관점에서는 맬웨어(악의가 있는 소프트웨어) 분석에 가장 도움이 될 수 있다. CTF 의 바이너리 분석에서 사용하는 동적 분석과 정적 분석 기술은 대부분 맬웨어 분석에서도 필 요한 기술이다. 따라서 CTF의 바이너리 분석에 숙련된 사람이라면 맬웨어 분석에도 그 지 식을 활용해 비교적 간단하게 맬웨어를 분석할 수 있을 것이다. 그리고 바이너리 분석은 소 프트웨어를 분석해서 취약점을 찾는 취약점 진단에서도 유용하게 사용할 수 있다. 보안 분 야 외에는 개발한 소프트웨어의 디버깅에 활용되거나 더는 유지보수가 이뤄지지도 않고, 개발 사양도 남아있지 않은 소프트웨어를 수정해야 할 때 등에 도움될 수 있을 것이다. 이 처럼 바이너리 분석을 한다는 것에는 CTF를 즐기기 위한 것 말고도 사회적으로도 다양한 의미가 있다. 바이너리 분석은 배우기 어려운 기술일지도 모른다. 하지만 분석을 하는 데 의의가 있고, 그 기술을 살릴 수 있는 분야도 충분히 있다. 이 책을 통해 CTF의 바이너리 분석을 공부하고, 나아가 각종 분야에서 이 기술을 활용한다면 필자로서 그것 이상의 기쁨은 없을 것이다.

1.1.4 _ CTF의 바이너리 문제 여기서는 원래 목적으로 돌아가 CTF의 바이너리 분석 문제는 어떤 것인가를 다룬다.

CTF에서 바이너리 문제는 거의 모든 대회에서 나온다고 해도 과언이 아닐 정도로 자주 출제 되는 분야다. 비교적 문제 수가 많고, 배점도 높은 경우가 많으므로 CTF의 꽃이라고도 한다.


01장 _ 1단계: 바이너리 분석이란?

CTF에는 Pwn(또는 Exploitation)이라는 취약점을 공격하는 것이 중심이 되는 종목도 있 다. Pwn 관련 문제를 푸는 데 가장 중요한 요소가 되는 것이 바로 이 바이너리 분석 기술 이다.

CTF에 출제되는 바이너리 관련 문제는 구체적으로 어떤 문제일까? 물론 한마디로 말하면 ‘바이너리를 분석한다’라고 할 수도 있지만 그렇게 잘라 말하기에는 굉장히 다양한 유형의 문 제가 출제된다. 가장 단순한 문제는 동작을 분석하고 특정 조건을 만족시키는 입력 값을 찾 는 것이다. 조금 더 복잡한 형태로는 FLAG가 난독화된 것을 복원하는 문제도 있다. 게임 형 태로 만들어져서 클리어하면 FLAG를 획득하는 문제도 있다. 물론 이런 게임은 난이도가 굉 장히 높아서 클리어하기 힘들기 때문에 바이너리 분석 내용을 활용해야 하는 것이 대부분이 다. 그리고 실행 불가능한 바이너리를 정적으로 분석해서 파일이 실행되면 나올 결과를 예 측하는 문제도 있다. 그 밖에도 여기에 모든 유형의 문제를 적을 수 없을 만큼 다양한 종류의 문제가 출제된다. 바이너리 문제의 종목명도 CTF에 따라 다른 이름이 붙는 경우가 있다. 그냥 Binary라는 이 름으로 출제되는 CTF도 있고, Reversing이나 Reverse Engineering이라는 이름으로 출제 되는 CTF도 있다.

1.1.5 _ 바이너리 분석과 윤리 마지막으로 바이너리 분석을 공부할 때 갖추면 좋은 윤리에 대해 알아보자. 바이너리 분석 기술을 공부하고, 그것을 사용하는 것은 CTF에서는 아무런 문제가 되지 않는 행위다. CTF 에 출제되는 문제 파일은 참가자에게 분석되기 위해 제작된 파일이기 때문이다. 그리고 자신 이 공부한 바이너리 분석 기술을 자신이 만든 프로그램을 디버깅하는 데 사용하는 것에도 문 제가 없다. 악성코드를 분석하는 데 활용하는 것도 매우 좋은 사용 방법이다. 하지만 이런 용도 외 다른 용도로 사용하는 경우에는 주의해야 한다. 다른 사람이 만든 프로 그램을 분석할 때 제작자가 가진 권리를 존중해야 한다. 대한민국 법률을 살펴보면 저작권법

101조의 4(프로그램 코드 역분석) 제1항과 2항에 따라 바이너리 분석은 특정 사유가 있다면 가능하지만 그 밖의 불법적인 행위(불법 복제, 유사 프로그램 제작 등)를 위한 목적으로는 허 용되지 않는다. 독점(개발자 또는 개발 업체가 제품이나 시스템의 사양, 규격, 구조 기술을

29


30

Part 01 _ 바이너리 분석

독점적으로 보유하고 정보를 공개하지 않는 것. 오픈소스와 반대 개념) 소프트웨어의 사용권 계약(EULA - End User License Agreement) 등에서도 리버스 엔지니어링을 금지하는 부분을 명시한 경우가 많다. 이처럼 다른 사람의 프로그램을 분석해 리버스 엔지니어링을 하는 행위는 암묵적으로는 금 지돼 있다고 볼 수 있다. 그렇기 때문에 리버스 엔지니어링을 하기 전에는 본인이 하는 행위 가 타당성이 있는지 신중하게 생각해 봐야 한다. 공부한 바이너리 분석 기술을 함부로 사용 하지 말고 꼭 그 기술이 필요한 곳에 올바르게 사용하길 바란다.

1.1.6 _ 이 책의 대상 이번 장은 바이너리 분석에 대한 지식을 전혀 갖지 않고 있다는 것을 전제로 쓰여 있다. 하지 만 C 언어나 파이썬(Python) 등의 기본적인 프로그래밍 지식과 리눅스를 간단히 조작할 수 있는 정도의 운영체제 관련 지식은 있는 사람을 대상으로 한다. 필자가 요구하는 수준은 높 은 편은 아니지만 모르는 부분이 있는 경우 아래의 책을 읽어보자. ■■ C

언어: 윤성우의 열혈 C 프로그래밍

■■ 파이썬:

헬로 파이썬 프로그래밍

■■ 리눅스

조작: 이것이 리눅스다

■■ 운영체제 ■■ 컴퓨터

기초: 운영체제 제9판

구조: 컴퓨터 구조 및 설계

1.1.7 _ 정리 바이너리 분석을 공부하기 위해 먼저 ‘바이너리란 무엇인가’, ‘바이너리 분석이란 어떤 것일 까’, ‘왜 바이너리를 분석하는 것일까’, ‘CTF에서의 바이너리 분석은 어떤 것을 하는 것일까’ 등에 대해 설명했다. 그리고 이 책을 이용해 바이너리 분석을 배울 때 독자들이 꼭 가졌으면 하는 윤리에 대해서도 설명했다. 이를 잘 이해하고 나서 2단계 이후로 진행해 바이너리 분석 을 공부하길 바란다.


02

2단계 : 바이너리 분석 환경 구축

바이너리 분석 방법을 공부하고 실제 CTF 문제를 풀려면 바이너리를 분석할 수 있는 환경 을 구축해야 한다. 이번 장에서는 바이너리 분석에 필요한 도구를 설명하고, 어떻게 환경 구축을 해야 하는지 알아본다.

1.2.1 _ 분석용 도구 소개 먼저 바이너리 분석에 사용하는 도구를 소개한다. 여기서는 간단한 개요와 용도를 설명한 다. 자세한 사용법에 대해서는 다음 단계 이후에서 실제로 바이너리 분석을 진행하면서 설 명한다.

리눅스 명령어 현재 CTF에 출제되는 바이너리 분석 문제는 대부분 리눅스 실행 파일인 ELF 파일을 분석 하는 문제로 구성돼 있다. 그렇기 때문에 분석 환경으로 리눅스를 준비해야 하는 경우도 많 다. 또한 바이너리 분석에 유용한 리눅스 명령어를 파악하는 것도 중요하다.

file file은 파일의 종류를 조사하는 명령어다. CTF 문제에서는 문제로 배포된 파일에는 확장자 가 없는 경우가 대부분이라서 파일명으로 그 파일이 어떤 파일인지 파악하는 것은 힘들다.


32

Part 01 _ 바이너리 분석

그래서 문제 파일을 다운로드하면 먼저 이 file 명령을 사용해 어떤 형식의 파일인지 알아내 야 한다. 바이너리 분석을 할 때도 실행 파일인지, 어떤 구조로 작동하는지, 32비트인지 64 비트인지, 어떤 운영체제에서 작동하는 것인지 등 다양한 정보를 알 수 있기 때문에 매우 유 용하다.

readelf readelf는 리눅스나 BSD 같은 유닉스 계열 운영체제용 실행파일 형식인 ELF 파일의 정보 를 표시하는 명령어다. 32비트와 64비트 모두 지원한다.

strings strings는 파일 안에 들어 있는 내용 중 표시할 수 있는 문자열을 추출해서 표시하는 명령 어다. 구체적으로는(기본값은) 4글자 이상 연결된 표시 가능한 문자열(시퀀스)을 추출한다.

CTF에서는 FLAG나 분석에 도움될 만한 문자열을 찾는 데 사용한다. grep grep은 실행한 결과 또는 파일 안의 내용에서 찾고 싶은 문자열 또는 문자열 패턴을 찾아내 는 명령어로, 일치하는 패턴이나 문자열이 있으면 해당 열을 추출해 준다. 실행한 결과 내에 서도 찾을 수 있기 때문에 strings 명령의 결과 등을 파이프로 grep 명령에 전달해 바이너 리 내에 있는 표시 가능한 문자열 중에서 특정 패턴을 찾아내거나 하는 식으로 활용할 수 도 있다.

unzip/tar/gunzip/xz 등 CTF 문제로 배포되는 파일은 압축파일 형태로 배포되는 것도 있다. 그럴 때 압축된 파일을 처리하는 명령어를 사용해 압축을 풀어야 한다. CTF에서 자주 사용되는 압축 형식은 zip,

tar.gz, gz, xz 등이 있다. 이 파일들을 푸는 명령어로 unzip, tar, gzip/gunzip, xz가 있다. 이 책에서 사용할 운영체제인 Ubuntu 14.04 LTS에는 모든 명령이 포함돼 있다. 아래 표에 서 각 압축 형식의 확장자와 압축을 푸는 명령을 알아보자. 확장자

명령어

.zip

unzip file.zip


02장 _ 2단계 : 바이너리 분석 환경 구축

확장자

명령어

.tar.gz

tar zxvf file.tar.gz

.gz

gzip -d file.gz 또는 gunzip file.gz

.xz

xz -d file.xz

트레이서 트레이서란 어떤 프로그램을 실행하면서 그 프로세스를 감시해 특정 동작을 추적하는 프로 그램이다. 여기서는 시스템 콜을 추적하는 strace와 표준 함수 라이브러리 콜을 추적하는

ltrace를 소개한다. strace: strace는 리눅스용 트레이서의 하나로, 리눅스 프로그램이 호출하는 시스템 콜을 추적한다. ltrace: ltrace는 리눅스용 트레이서의 하나로, 리눅스 프로그램이 호출하는 공유 라이브러리 함수를 추적 한다.

디버거 디버거란 원래 디버그(프로그램에서 오류나 결함을 일으키는 버그를 없애는 작업)를 지원하 기 위해 만들어진 프로그램이다. CTF에서는 바이너리를 분석하는 데 디버그 기능을 사용한 다. 이 책에서는 아래에 소개한 디버거 중에서 GDB 및 OllyDbg를 사용한다.

GDB GDB는 GNU 프로젝트를 따르는 CLI 기반 디버거다. 다수의 리눅스 배포판과 BSD 기반 운영체제에서 사용되고 있다. ELF 형식의 실행파일을 처리할 일이 많은 CTF에서 가장 많이 사용되는 디버거 중 하나다.

OllyDbg OllyDbg(http://www.ollydbg.de/)는 윈도우 실행 파일인 PE 형식의 바이너리를 분석할 수 있는 디버거다. 64비트 지원은 아직 개발 중이며, 현재까지도 완벽하게 작동하지 않기 때 문에 32비트 PE 파일 분석에 사용한다. 윈도우 디버거 중에서는 역사가 긴 편이며, 악성코 드 분석 전문가들이 애용하며 안정성도 높다. 또한 다양한 플러그인이 개발돼 있어 사용하기

33


34

Part 01 _ 바이너리 분석

에 좋다. 그리고 OllyDbg와 인터페이스가 비슷한 디버거도 다수 있기 때문에 OllyDbg를 잘 다룬다면 다른 디버거도 비교적 쉽게 익숙해질 수 있을 것이다.

Immunity Debugger Immunity Debugger2는 OllyDbg에서 파생된 프로젝트로, Immunity라는 회사에서 기 능 개발이나 유지보수를 하고 있다. 뿌리가 되는 OllyDbg와 유사한 부분이 매우 많지만 파 이썬 API를 제공한다는 점이 다르다. 그리고 힙(heap) 분석에 강한 면모를 보인다. 하지만

CTF의 바이너리 분석 문제 풀이에서는 OllyDbg와 크게 차이가 나지 않을 것이다. x64dbg x64dbg(http://x64dbg.com/)는 64비트 PE 파일 분석도 지원하는 디버거다. 인터페이스 는 OllyDbg나 뒤에 설명할 IDA와 유사한 부분이 많기 때문에 이러한 디버거에 익숙하다면

x64dbg도 바로 사용할 수 있을 것이다. 64비트 PE 파일을 분석할 일은 많지 않지만 만약 분석하게 된다면 유용하게 활용할 수 있을 것이다.

WinDbg WinDbg는 마이크로소프트에서 제공하는 윈도우용 디버거다. GUI 형태지만 많은 조작을 명령어로 처리하기 때문에 OllyDbg보다는 gdb에 가까운 느낌을 준다. 32비트/64비트 PE 파일을 분석할 수 있다. 그리고 지금까지 소개한 디버거는 사용자단(User Land) 디버깅 도 구였지만 WinDbg는 커널단(Kernel Land) 디버거로 사용할 수도 있다. 즉, 커널에서 작동 하는 소프트웨어를 디버깅하는 데도 사용할 수 있다는 의미다. CTF에서는 이런 수준까지 디 버깅할 일이 많지는 않지만 여유가 된다면 사용해 봐도 좋을 것이다.

프로세스 메모리 에디터 프로세스 메모리 에디터란 실행 중인 프로세스의 메모리를 추출해 값을 찾거나 변경할 수 있 는 소프트웨어다.

2 http://www.immunityinc.com/products/debugger/index.html


CTF 정보보안 콘테스트 챌린지 북: Capture The Flag 문제 풀이로 배우는 해킹 테크닉  

우스이 토시노리, 타케사코 요시노리, 히로타 카즈키, 호요우 타카아키, 마에다 유우토, 미노우 케이스케, 미무라 사토시, 야기하시 유우 지음 | 양현 옮김 | 해킹 & 보안 시리즈_008 | ISBN: 9791158390433 | 25,000원 | 2...

Read more
Read more
Similar to
Popular now
Just for you