[해킹 대회 문제] pwnable.kr - lotto 문제풀이(Write Up)
pwnable.kr - lotto 문제풀이(Write Up)
문제 분류: 공격(Attack)
이번 시간에 풀어 볼 문제는 pwnable.kr의 lotto입니다. 기존에 기초 프로그래밍 위주로 학습하고 보안 분야로 넘어오신 분들에게 적합한 문제라고 생각되어 이 문제 또한 앞 부분에서 다루게 되었습니다. 더불어 난이도 또한 낮은 기초 문제라서 기초 C언어 지식으로도 문제를 해결하실 수 있답니다.
▶ 문제풀이 사이트 주소: http://pwnable.kr/play.php
이 문제는 SSH를 이용해 통신해야 하는 문제입니다. SSH는 원격지에 있는 서버에 접속하여 서버를 관리할 수 있도록 해주는 프로토콜입니다. 윈도우 10은 기본적으로 OpenSSH를 내장하고 있어 쉽게 SSH를 사용할 수 있지만 사용이 어려운 경우 Putty와 같은 별도의 소프트웨어가 필요할 수 있습니다. Putty는 https://www.putty.org에 접속하여 설치가 가능합니다.
저는 위와 같이 윈도우에 내장된 OpenSSH를 이용해 서버에 접속해보았습니다.
접속 이후에는 ls 명령어를 이용해 위와 같이 현재 루트 디렉토리에 어떠한 파일이 존재하는지 확인할 수 있습니다. lotto 실행 파일과 lotto.c 소스코드 파일이 존재합니다. 일반적으로 이러한 분석 및 공격 분류의 문제는 소스코드를 보면서 취약점을 파악해 실행 파일에 적용하여 Flag 값을 얻을 수 있는 방식입니다. 일단 간단히 ./lotto 명령어로 로또 프로그램을 테스트해보겠습니다.
6자리의 로또 코드를 입력하라고 하는 군요. 다만, 제가 알기로 로또는 1부터 45까지의 숫자를 넣는 것인데 6자리를 문자열로 넣는 것이 조금 이상하다는 생각이 들었습니다. 일단 아래와 같이 cat lotto.c 명령어를 입력해 lotto.c 소스코드를 분석할 수 있습니다.
소스코드를 확인한 결과 랜덤한 6개의 숫자가 lotto[] 배열에 저장되고, 숫자는 아스키 코드로 1부터 45까지의 랜덤한 숫자로 추출됩니다. 다만 아래쪽을 보면 이중 For문을 이용해 우리가 입력한 문자열과 배정된 당첨 lotto[] 번호가 일치하는지 확인하는 구문이 나옵니다. 저의 문자열 매칭 알고리즘 강의(https://blog.naver.com/ndb796/221240660061)를 들으신 분이라면 위 알고리즘이 잘못되었다는 것을 쉽게 파악할 수 있을 겁니다. 위 알고리즘은 단 하나의 로또 번호라도 일치한다면, match 변수의 값이 6이 됩니다. 즉, 하나만 번호가 일치해도 당첨이 되어버리는 잘못 작성된 소스코드라고 할 수 있습니다.
우리는 이렇게 잘못 작성된 알고리즘을 이용하여 로또에 쉽게 당첨되는 공격(Attack) 시도를 할 것입니다.
먼저 아스키 코드표를 봅시다. 이제 위에서 보이는 1부터 45까지의 아스키 코드 중에서 아무거나 6개를 넣으면 됩니다. 그러면 우연히 1개의 문자라도 로또 당첨 번호와 일치하는 경우 플래그(Flag) 값을 내뱉을 것입니다. 통계적으로 생각했을 때 대략 3~4번만 시도해도 답이 도출될 것이라 판단할 수 있습니다.
위와 같이 문자열 "######"으로 몇 번 입력을 시도하니 플래그 값이 나왔습니다.
'해킹 방어 대회(CTF)' 카테고리의 다른 글
| [해킹 대회 문제] wargame.kr - EASY_CrackMe 문제풀이(Write Up) (1) | 2019.07.06 |
|---|---|
| [해킹 대회 문제] pwnable.kr - flag 문제풀이(Write Up) (0) | 2019.07.06 |
| [해킹 대회 문제] pwnable.kr - coin1 문제풀이(Write Up) (0) | 2018.07.14 |
| 자바(Java)를 이용해 Netcat 없이 문제풀이 서버와 통신하기 (0) | 2018.07.14 |
| 네트워크 통신을 위한 넷캣(Netcat) 설치 및 사용법 (1) | 2018.07.14 |
[해킹 대회 문제] pwnable.kr - coin1 문제풀이(Write Up)
pwnable.kr - coin1 문제풀이(Write Up)
문제 분류: 코딩(Coding)
이번 시간에 풀어 볼 문제는 대표적인 CTF 문제풀이 사이트인 pwnable.kr의 기초 문제 중 'coin1' 문제입니다. CTF 공부 카테고리에서 실질적으로 풀어보는 첫 번째 문제가 될 겁니다. pwnable.kr 공식 웹 사이트에서 coin1 문제를 확인하실 수 있습니다.
▶ 문제풀이 사이트 주소: http://pwnable.kr/play.php
문제를 확인해보면 pwnable.kr에 9007번 포트로 접속해보라고 나오는 것을 알 수 있습니다.
문제를 요약하면 다음과 같습니다.
- N은 코인의 개수, C는 시도 횟수
- 서버로 코인의 번호들을 보내면 서버는 해당 코인들의 무게 합을 반환합니다.
- 가짜 코인이 하나 숨어있는데, 가짜 코인의 무게는 9이고 정상 코인의 무게는 10입니다.
따라서 이 문제를 해결하기 위해서는 이분 탐색을 수행하면 됩니다. 예를 들어 전체 코인이 4개가 있고, 각 코인의 무게가 다음과 같다고 해봅시다.
코인: 0 1 2 3
무게: 10 10 9 10
이 때 맨 처음에 서버로 “0 1”을 보낼 수 있습니다. 그러면 서버에서는 두 코인의 무게 합인 20을 반환할 겁니다. 우리는 이 20이라는 결과를 통해서 ‘아, 0과 1 중에는 가짜 코인이 없구나.’ 라는 것을 알 수 있습니다. 그러면 0과 1은 더 이상 볼 필요 없이 2와 3을 보면 됩니다.
2와 3 중에서 반드시 하나는 가짜 코인이 섞여있다는 것을 알고 있기 때문에 “2”만 보내면 됩니다. 만약에 서버로부터 돌아오는 결과가 9라면 2가 가짜 코인이고, 서버로부터 돌아오는 결과가 10이라면 3이 가짜 코인이 되는 것입니다.
이와 같이 현재 ‘가짜 코인’이 섞여있는 코인의 집합 중에서 계속해서 절반(Half)만 확인하는 식으로 매 번 검사할 때마다 검사하는 집합의 크기를 1/2로 줄일 수 있습니다. 이것은 이분 탐색의 대표적인 예라고 할 수 있으며 통상적으로 코인의 개수가 N개일 때 O(logN)의 시간 복잡도를 가집니다.
이제 문제를 푸는 방법을 알았으므로 Java를 이용해 서버 통신 모듈을 개발합니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class Main {
private static Socket sock = null;
private static OutputStream out = null;
private static InputStream in = null;
private static BufferedWriter bw = null;
private static BufferedReader br = null;
public static void init() {
try {
sock = new Socket("pwnable.kr", 9007);
out = sock.getOutputStream();
in = sock.getInputStream();
bw = new BufferedWriter(new OutputStreamWriter(out));
br = new BufferedReader(new InputStreamReader(in));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void close() {
try {
bw.close();
br.close();
sock.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static int findAnswer() {
try {
// 서버로부터 메시지를 전달 받습니다.
String line = null;
while((line = br.readLine()) != null){
// 전달 받은 메시지를 출력합니다.
System.out.println(line);
// 첫 번째 문자가 'N'인 경우 문제 풀이가 시작된 것입니다.
if(line.length() != 0 && line.charAt(0) == 'N') break;
}
// N과 C를 파싱하여 각각 숫자로 변환합니다.
int N = Integer.parseInt(line.split("N=")[1].split(" C")[0]);
int C = Integer.parseInt(line.split(" C=")[1]);
System.out.println("N의 값은 " + N + ", C의 값은 " + C);
} catch (Exception e) {
e.printStackTrace();
}
return -1;
}
public static void main(String[] args) {
try {
init();
findAnswer();
close();
} catch (Exception e) {
System.out.println(e);
}
}
}
전체 소스코드는 소켓 통신 관련 객체를 초기화하는 init() 함수, 소켓 통신 관련 객체를 파기하는 close() 함수, 서버와 직접 통신해 답을 찾아내는 findAnswer() 함수로 구성됩니다. 일단은 간단하게 findAnswer() 함수에서 서버로부터 메시지를 계속 전달 받되, 첫 번째 문자가 “N"인 라인을 만나면 N과 C의 값을 파싱하여 변수에 담는 것까지 작업해보았습니다.
실행 결과는 위와 같습니다. 서버로부터 계속 데이터를 전달 받다가, “N=숫자 C=숫자”의 형태를 만나면 이를 Java의 split() 함수를 이용해 숫자 정보만 파싱하는 것입니다. 이제 N과 C를 받아오는 모듈까지 작성했으므로 이를 확장시켜서 이분 탐색을 활용해 정답을 도출하도록 확장시키면 됩니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class Main {
private static Socket sock = null;
private static OutputStream out = null;
private static InputStream in = null;
private static BufferedWriter bw = null;
private static BufferedReader br = null;
public static void init() {
try {
sock = new Socket("pwnable.kr", 9007);
out = sock.getOutputStream();
in = sock.getInputStream();
bw = new BufferedWriter(new OutputStreamWriter(out));
br = new BufferedReader(new InputStreamReader(in));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void close() {
try {
bw.close();
br.close();
sock.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static int findAnswer() {
try {
// 서버로부터 메시지를 전달 받습니다.
String line = null;
while((line = br.readLine()) != null){
// 전달 받은 메시지를 출력합니다.
System.out.println(line);
// 첫 번째 문자가 'N'인 경우 문제 풀이가 시작된 것입니다.
if(line.length() != 0 && line.charAt(0) == 'N') break;
}
// N과 C를 파싱하여 각각 숫자로 변환합니다.
int N = Integer.parseInt(line.split("N=")[1].split(" C")[0]);
int C = Integer.parseInt(line.split(" C=")[1]);
int up = N - 1;
int down = 0;
while(down <= up && C > 0) {
int middle = (up + down) / 2;
String message = "";
for(int i = down; i <= middle; i++) {
message += i + " ";
}
// 서버로 확인하고자 하는 코인들의 번호를 전달합니다.
System.out.println("보낸 값: " + message);
bw.write(message);
bw.newLine();
bw.flush();
C--;
// 서버로부터 결과 정보를 전달 받습니다.
line = br.readLine();
System.out.println("받은 값: " + line);
int next = Integer.parseInt(line);
// 10으로 나누어진다면 해당 범위에 가짜 코인이 없습니다.
if(next % 10 == 0) {
down = middle + 1;
}
// 그렇지 않다면 해당 범위에 가짜 코인이 있습니다.
else {
up = middle - 1;
}
}
// 아직 확인할 수 있는 횟수가 더 남았다면 다 쓸 때까지 전송합니다.
if(C > 0) {
bw.write(down + "");
bw.newLine();
bw.flush();
}
// 결과적으로 찾은 가짜 코인의 번호는 down에 담겨있습니다.
return down;
} catch (Exception e) {
e.printStackTrace();
}
return -1;
}
public static void main(String[] args) {
try {
init();
// 게임이 여러 차례 존재하므로 무한정 실행시킵니다.
while(true) {
int bottom = findAnswer();
String message = bottom + "";
System.out.println("가짜 코인 발견: " + message);
// 한 차시 게임에서 찾은 답을 전송합니다.
bw.write(message);
bw.newLine();
bw.flush();
}
} catch (Exception e) {
System.out.println(e);
}
}
}
결과적으로 총 100차례의 게임이 빠르게 수행되고 플래그 값으로 b1NaRy_S34rch1nG_1s_3asy_p3asy를 찾았습니다. 이를 입력하면 정답 처리를 받게 됩니다.
'해킹 방어 대회(CTF)' 카테고리의 다른 글
| [해킹 대회 문제] pwnable.kr - flag 문제풀이(Write Up) (0) | 2019.07.06 |
|---|---|
| [해킹 대회 문제] pwnable.kr - lotto 문제풀이(Write Up) (2) | 2018.07.14 |
| 자바(Java)를 이용해 Netcat 없이 문제풀이 서버와 통신하기 (0) | 2018.07.14 |
| 네트워크 통신을 위한 넷캣(Netcat) 설치 및 사용법 (1) | 2018.07.14 |
| 해킹 방어 대회(CTF)를 위한 기본적인 도구 알아보기 (2) | 2018.07.14 |
자바(Java)를 이용해 Netcat 없이 문제풀이 서버와 통신하기
자바(Java)를 이용해 문제풀이 서버와 통신하기
나동빈
일반적으로 시스템 해킹을 공부하기 위한 각종 포너블(Pwnable) 사이트나 실제 CTF 대회에서는 Netcat 모듈을 이용해 문제풀이 서버와 통신하는 경우가 많습니다. 또한 실시간으로 서버와 상호작용을 해야 하는 경우가 많기 때문에 실제로 문제를 풀 때는 파이썬(Python)을 이용해서 서버와 통신하는 모듈을 구현하곤 합니다. 하지만 저와 같이 국내 개발자 출신의 해커들은 자바(Java)가 더 익숙한 경우가 많기 때문에 자바를 이용해 문제를 푸는 방법에 대해 소개하고자 합니다.
먼저 기본적인 Netcat(nc) 명령어를 이용해 서버와 통신하는 화면은 다음과 같습니다. 저는 윈도우 운영체제를 이용하고 있어서 별도의 Netcat 프로그램을 환경변수로 설정했습니다.
pwnable.kr의 coin1 문제를 풀기 위해 접속한 모습은 위와 같습니다. 어차피 nc 모듈도 서버와 소켓 통신을 이용해 메시지를 주고받는 프로그램에 불과하기 때문에 어떠한 프로그래밍 언어를 이용하던지 간에 똑같은 기능을 구현할 수 있습니다.
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class Main {
public static void main(String[] args) {
try {
Socket sock = new Socket("pwnable.kr", 9007);
InputStream in = sock.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
br.close();
sock.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
따라서 위와 같이 Java에서 Socket 통신 기본 라이브러리를 활용해서 동일한 기능을 구현할 수 있습니다. 프로그램의 실행 결과는 다음과 같습니다. 저는 이클립스(Eclipse) 개발환경에서 실행해보았습니다.
요약하여 설명하자면 서버로부터 어떠한 명령어를 기다리고자 하는 경우에는 두 개의 라이브러리 InputStream과 BufferedReader를 이용해 서버로부터 특정한 메시지를 전달받을 수 있습니다. 구체적 동작 과정을 살펴보면 InputStream을 이용해 서버로부터 전달 받은 메시지 스트림(Stream)을 일정 크기의 버퍼(Buffer)에 지속적으로 담아서 문자(Character) 형태로 읽어들여 String 객체에 문자열 데이터를 담은 것입니다. 이 때 이렇게 버퍼를 쓰는 이유는 매 번 CPU 자원을 활용하지 않고 일정 주기로 CPU 자원을 활용하도록 해서 프로그램의 효율성을 높이는 것입니다.
그렇다면 서버로 어떠한 데이터를 전달하고자 할 때는 어떻게 할 수 있을지 알아봅시다. 직관적으로 생각했을 때 InputStream과 BufferedReader의 반대인 OutputStream과 BufferedWriter를 쓰면 될 것 같다는 생각이 드실 겁니다. 결과적으로 다음과 같이 소스를 작성할 수 있습니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class Main {
public static void main(String[] args) {
try {
Socket sock = new Socket(특정한 서버, 포트 번호);
InputStream in = sock.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
OutputStream out = sock.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
if(line.contains("Enter your name:")) break;
}
bw.write("Dongbin, Na");
bw.newLine();
bw.flush();
bw.close();
br.close();
sock.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
위 소스코드는 특정한 서버에 접속해서 메시지를 계속해서 전달 받다가 “Enter your name:"이 포함된 문장을 만나면 더 이상 서버로부터 데이터를 전달받지 않고 "Dongbin, Na"라는 메시지를 서버로 전송하는 것입니다. 실제로 이러한 방식으로 서버와 클라이언트 통신을 진행할 수 있습니다. 물론 일반적으로 서버로부터 들어오는 데이터가 정형화되어있지 않다면 split(), contains(), substring() 등의 함수를 이용해서 메시지에서 필요한 내용만 파싱하여 사용할 필요도 있습니다.
'해킹 방어 대회(CTF)' 카테고리의 다른 글
| [해킹 대회 문제] pwnable.kr - lotto 문제풀이(Write Up) (2) | 2018.07.14 |
|---|---|
| [해킹 대회 문제] pwnable.kr - coin1 문제풀이(Write Up) (0) | 2018.07.14 |
| 네트워크 통신을 위한 넷캣(Netcat) 설치 및 사용법 (1) | 2018.07.14 |
| 해킹 방어 대회(CTF)를 위한 기본적인 도구 알아보기 (2) | 2018.07.14 |
| 해킹 방어 대회(CTF) 소개 및 공부하는 방법 (3) | 2018.07.03 |
네트워크 통신을 위한 넷캣(Netcat) 설치 및 사용법
네트워크 상에서 특정한 컴퓨터와와 통신하기 위한 유틸리티(Utility)로 넷캣(Netcat)을 사용할 수 있습니다. TCP/UDP 프로토콜을 이용하는 환경에서는 범용적으로 적용이 가능하다는 점에서 간단한 네트워크 통신을 위한 목적으로 간단히 사용할 수 있습니다. 줄여서 NC(Network Connection)라고도 부르며 해킹(Hacking)에 있어서도 이용범위가 넓다는 특징이 있습니다. 리눅스 운영체제에서는 Netcat을 사용하기 어렵지 않지만 윈도우(Windows) 운영체제를 사용하는 사람들은 별도의 소프트웨어를 설치해서 사용할 수 있답니다.
▶ Netcat 다운로드 사이트: https://eternallybored.org/misc/netcat/
사이트 접속 이후에는 위와 같이 netcat 1.12 버전을 다운로드하여 윈도우에서 사용할 수 있습니다.
다운로드 이후에는 압축을 풀어줍니다. 저는 위와 같이 C 드라이브에 압축을 풀어주었습니다.
이후에 제어판 -> 시스템 -> 고급 시스템 설정 -> '환경 변수'로 들어가서 우리가 방금 다운로드 해 준 Netcat 유틸리티를 커맨드 라인에서 사용할 수 있도록 변수 설정을 해주도록 하겠습니다.
시스템 변수 -> 'Path'에서 사용할 유틸리티의 경로를 설정해 줄 수 있습니다. 여기에서 새롭게 자신이 압축을 푼 Netcat 폴더의 위치를 넣어주시면 됩니다. 이후에 명령 프롬프트(CMD)에서 Netcat 유틸리티를 사용하실 수 있습니다.
1. 서버 열기 및 접속하기
서버를 열 때는 nc -l 명령어를 사용합니다. l(Listen)은 단순한 채팅 서버와 같은 역할을 수행합니다. 클라이언트에서 접속할 때는 호스트 주소와 포트 번호를 공백으로 구분하여 이어서 작성하면 됩니다.
일반적으로 다음과 같이 해킹 문제풀이 서버에 접속하면 서버에서 미리 준비된 메시지를 출력하고, 사용자와 상호작용을 하는 식입니다.
Netcat은 말 그대로 네트워크 통신 도구이므로 다음과 같이 웹 사이트에 접속할 수도 있습니다. 다음 사진은 제 개인 웹 사이트에 접속하여 요청(Request) 패킷을 Netcat 유틸리티 상에서 전송해 본 것입니다. 서버에서 성공적으로 응답(Response) 패킷이 날아온 것을 알 수 있습니다.
'해킹 방어 대회(CTF)' 카테고리의 다른 글
| [해킹 대회 문제] pwnable.kr - lotto 문제풀이(Write Up) (2) | 2018.07.14 |
|---|---|
| [해킹 대회 문제] pwnable.kr - coin1 문제풀이(Write Up) (0) | 2018.07.14 |
| 자바(Java)를 이용해 Netcat 없이 문제풀이 서버와 통신하기 (0) | 2018.07.14 |
| 해킹 방어 대회(CTF)를 위한 기본적인 도구 알아보기 (2) | 2018.07.14 |
| 해킹 방어 대회(CTF) 소개 및 공부하는 방법 (3) | 2018.07.03 |
해킹 방어 대회(CTF)를 위한 기본적인 도구 알아보기
해킹 방어 대회(CTF)에서는 다양한 문제들이 가리지 않고 출제됩니다. 이번 시간에는 해킹 방어 대회를 위해 사용할 수 있는 기본적인 소프트웨어 및 프로그래밍 언어에 대해 알아보겠습니다. 사실상 기본적인 도구가 없으면 해킹 자체를 할 수 없는 경우가 많기 때문에 아래에서 언급된 소프트웨어는 필수적으로 설치를 할 수 있으면 좋습니다. 또한 아래 언급되는 대다수의 소프트웨어가 기초적인 프로그래밍 능력이 없으면 활용하기 어렵습니다. 하지만 당장 잘 모르는 소프트웨어라고 하더라도, 필요할 때마다 설치하며 공부하시면 효율적인 학습이 가능합니다.
어떠한 CTF라도 출제되는 문제 유형에서 요구하는 모든 도구(Tool)를 정확히 파악하기는 매우 어려우며 출제자의 의중을 파악하기도 어렵습니다. 특히 특정 분야에 대한 매우 전문적인 지식을 요구하는 고난이도의 문제가 자주 출제됩니다. 따라서 처음 CTF를 출전할 때 다양한 고충을 겪으시는 것은 당연하니 처음에 너무 모르는 도구가 많다고 하시더라도 겁먹지 말고, 천천히 하나씩 접해보시는 걸 추천합니다.
▶ 파이썬(Python) 및 IDE: 파이썬은 해킹을 위한 매우 강력한 기능을 제공합니다. 특히 pwntools와 같은 라이브러리를 활용할 수 있습니다. 프로그래밍 언어는 도구에 불과하다고는 하지만 사실상 오늘날의 CTF는 파이썬을 다루지 못하면 상당한 제약을 느낄 수 있습니다.
▶ C/C++/C# 및 Visual Studio: 비주얼 스튜디오 개발 환경에서 C언어 계열을 활용하는 문제는 매우 많이 출제되고 있습니다. 최근 F#까지 간혹 출제되는 추세입니다. 사실상 매우 기본적인 C언어 개발환경이므로 설치가 필수적입니다.
▶ 가상 머신(Virtual Machine): 상당수 문제는 리눅스(Linux) 환경이 아니면 접근조차 할 수 없는 경우가 많으므로 다른 운영체제 시스템 환경을 다루기 위해 가상 머신을 사용할 필요가 있습니다.
▶ SSH/Netcat: 원격지에 존재하는 서버(Server)에 접속하기 위한 목적으로 사용할 수 있는 유틸리티(Utility)입니다. 일반적으로 CTF 대회 문제 서버에 접속하기 위해 자주 사용됩니다. 또한 이러한 도구는 비단 해킹이 아니라 특정 서버를 관리하기 위한 목적으로 사용됩니다.
▶ IDA Debugger: 디버깅(Debugging) 도구 중에서 가장 강력한 소프트웨어 중 하나입니다. 다양한 플러그 인을 직접 개발하거나 사용할 수 있는데, 대표적인 플러그 인으로는 기존 기계어를 C언어 문법과 흡사하게 재구성해서 보여주는 기능을 가진 Hex-Rays가 있습니다.
▶ Cygwin/MinGW: 유닉스 계열의 명령어나 기능을 윈도우 운영체제에서 소스코드로부터 컴파일할 수 있도록 해주는 소프트웨어입니다. 물론 이러한 프로그램을 설치한다고 해서 리눅스 전용 바이너리 파일을 실행할 수 있는 것은 아니므로 가상 머신을 따로 설치하는 것이 좋습니다.
▶ 와이어샤크(Wireshark): 대표적인 네트워크 패킷(Packet) 분석 소프트웨어입니다. 사실 CTF 뿐만 아니라 네트워크를 통한 대부분의 소프트웨어를 분석하거나 개발할 때 사용할 수 있습니다.
▶ 칼리 리눅스(Kali Linux): 침투 테스트 목적으로 가장 인기있는 운영체제(OS)입니다. 기본적으로 해킹에 필요한 대부분의 기능 및 도구가 베이직하게 설치가 되어 있다는 점에서 매우 편리하게 사용 가능합니다. 보안을 시작하는 사람들이 가장 먼저 설치하는 것 중 하나입니다.
▶ 반디집: 윈도우 운영체제를 베이스로 사용하는 유저들이 리눅스나 맥(MAC) 개발 환경에서 압축된 다양한 파일을 쉽게 해제할 수 있도록 도와줍니다. 다양한 압축 기능을 사용하기 편리하게 해놓았다는 점에서 활용도가 높습니다.
▶ HxD: 바이너리 코드(2진수)보다 가독성이 높아 컴퓨터 분야에서 널리 쓰이는 16진수 형태의 데이터를 헥사 코드라고 말합니다. 특정한 파일이 있을 때 이를 16진수 코드로 분석하고자 할 때 사용할 수 있는 소프트웨어입니다. 이를 활용해 JPG, PNG 등의 이미지 파일 등을 16진수 데이터 형태로 분석할 수도 있으며 적절하게 변경하여 사용할 수 있습니다.
▶ Pwn Debugger: 리눅스 환경에서 손쉽게 사용할 수 있는 디버깅 도구입니다. 기본적인 gdb보다 더 가시적이며 동적인 환경에서
▶ 버프 수트(Burp Suite): 웹 취약점 분석 도구 중에서 가장 유명한 도구 중 하나입니다. 자체적인 프록시(Proxy) 기능을 제공하며 다양한 파라미터 변조 및 반복적인 패킷 전송 공격 등 다양한 공격이 가능합니다.
▶ 크롬 & EditThisCookie: 크롬(Chrome) 개발자 도구만 잘 이용해도 다양한 웹 취약점 테스트를 별도의 프로그래밍 도구 없이 할 수 있는 시대가 왔습니다. 특히 EditThisCookie와 같은 별도의 확장 프로그램을 잘 활용하시면 매우 편리한 웹 취약점 분석이 가능합니다.
▶ 볼라빌리티(Volatility): 파이썬으로 개발된 메모리 분석 및 포렌식 전용 소프트웨어입니다. 기본적으로 칼리 리눅스 운영체제에 포함되어 있는 도구 중 하나입니다.
▶ FTK Imager: 포렌식 및 메모리 이미징을 위한 전문 소프트웨어입니다. 다양하고 강력한 부가적인 기능을 제공합니다.
▶ dex2jar: 대표적인 안드로이드 어플리케이션 디컴파일러입니다. 이를 활용하면 APK 파일을 뜯어 분석한 뒤에 smali 파일을 수정해 다시 패키징하고, 어플리케이션으로 제작하여 해적판까지 배포할 수 있습니다.
▶ jd-gui: 자바(Java)로 개발된 JAR 파일을 손 쉽게 분석할 수 있도록 도와주는 GUI 소프트웨어입니다.
▶ PHP/JSP 개발환경: 웹 해킹 문제로 가장 많이 출제되는 PHP 및 JSP 언어에 대한 개발환경을 구축해놓고, 기초적인 프로그래밍까지 할 수 있도록 공부하시면 많은 도움이 됩니다.
'해킹 방어 대회(CTF)' 카테고리의 다른 글
| [해킹 대회 문제] pwnable.kr - lotto 문제풀이(Write Up) (2) | 2018.07.14 |
|---|---|
| [해킹 대회 문제] pwnable.kr - coin1 문제풀이(Write Up) (0) | 2018.07.14 |
| 자바(Java)를 이용해 Netcat 없이 문제풀이 서버와 통신하기 (0) | 2018.07.14 |
| 네트워크 통신을 위한 넷캣(Netcat) 설치 및 사용법 (1) | 2018.07.14 |
| 해킹 방어 대회(CTF) 소개 및 공부하는 방법 (3) | 2018.07.03 |
