Microsoft Word - Crackme 15 from Simples 문제 풀이_by JohnGang.docx

Similar documents
JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint Presentation

PowerPoint Presentation

C++ Programming

PowerPoint 프레젠테이션

Microsoft PowerPoint - Java7.pptx

PowerPoint Presentation

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

<B1E2BCFAB9AEBCAD5FB9DABAB4B1D45F F F64746F72732E687770>

정도전 출생의 진실과 허구.hwp

2007_2_project4

Microsoft PowerPoint - CSharp-10-예외처리

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 09. 예외처리

3ÆÄÆ®-14

Microsoft PowerPoint - additional01.ppt [호환 모드]

PowerPoint Presentation

Microsoft PowerPoint - C++ 5 .pptx

PowerPoint 프레젠테이션

TEST BANK & SOLUTION

Microsoft PowerPoint - ch07 - 포인터 pm0415

금오공대 컴퓨터공학전공 강의자료

12-file.key

PowerPoint Presentation

Design Issues

PowerPoint 프레젠테이션

PowerPoint Presentation

PowerPoint Template

JAVA PROGRAMMING 실습 02. 표준 입출력

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

슬라이드 1

C 언어 프로그래밊 과제 풀이

슬라이드 1

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

C++ Programming

<4D F736F F F696E74202D20C1A63234C0E520C0D4C3E2B7C228B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

02 C h a p t e r Java

PowerPoint Presentation

비긴쿡-자바 00앞부속

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

05-class.key

2014밝고고운동요부르기-수정3

2005프로그램표지

rmi_박준용_final.PDF

3ÆÄÆ®-11

목차 INDEX JSON? - JSON 개요 - JSONObject - JSONArray 서울시공공데이터 API 살펴보기 - 요청인자살펴보기 - Result Code - 출력값 HttpClient - HttpHelper 클래스작성 - JSONParser 클래스작성 공공

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

FileMaker ODBC and JDBC Guide

Microsoft PowerPoint - chap06-2pointer.ppt

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

슬라이드 1

ThisJava ..

PowerPoint Presentation

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Interstage5 SOAP서비스 설정 가이드

Java Programing Environment

슬라이드 1

Level A9(16 진수 ) 와 (2 진수 ) 의합을 10 진수로나타내시오 과 의 xor 연산을하고 10 진수로나타내시오 3. N e w H e a r t 각각의문자하나를 ascii 코드값의 10 진

Java

FileMaker ODBC and JDBC Guide

Microsoft PowerPoint - Chapter 6.ppt

ALTIBASE 사용자가이드 Templete

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

자바 프로그래밍

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Cluster management software

Microsoft PowerPoint - 2강

4장.문장

Java ...

Microsoft Word - java19-1-midterm-answer.doc

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - chap06-1Array.ppt

초보자를 위한 C# 21일 완성

Microsoft PowerPoint - additional06.ppt [호환 모드]

fundamentalOfCommandPattern_calmglow_pattern_jstorm_1.0_f…

Microsoft Word - newheart_report.docx

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

untitled

mytalk

2002년 2학기 자료구조

쉽게 풀어쓴 C 프로그래밍

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

자바-11장N'1-502

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap10-함수의활용.pptx

080629_CFP °ø°³¿ë.hwp

본 강의에 들어가기 전

gnu-lee-oop-kor-lec06-3-chap7

PowerPoint Presentation

파일로입출력하기II - 파일출력클래스중에는데이터를일정한형태로출력하는기능을가지고있다. - PrintWriter와 PrintStream을사용해서원하는형태로출력할수있다. - PrintStream은구버전으로가능하면 PrintWriter 클래스를사용한다. PrintWriter

Microsoft PowerPoint - e pptx

17장 클래스와 메소드

Microsoft PowerPoint - CSharp-2-기초문법

Transcription:

CrackMe 15.exe (in Simples) 문제풀이 동명대학교정보보호동아리 THINK www.mainthink.net 강동현 Blog: johnghb.tistory.com e-mail: cari2052@gmail.com 1

목차 : 1. 문제설명및기본분석 --------------------------- P. 03 2 상세분석 --------------------------- P. 05 2

문제설명및기본분석 Crackme 15 from Simples 사용툴 : PEiD v0.95, HashCalc.exe, IDA Pro, Visual Studio 2005 Q : 정답인증은 Password의 MD5 해쉬값 ( 대문자 ) 답 : 718070D944DE096F3A6696B077E4E2CE -------------------------------------------------------------------------------------------------------------- 먼저프로그램실행모습입니다. 그림 1 그림 1과같이 Please enter the password 라는문자열이외는아무런정보가없습니다. 또한아래줄부터사용자입력을대기하는것을보면 password입력후정상적인값과비교하도록되어있음을예측할수있습니다. 3

임의의값을넣고진행해보면아래그림 2 와같은결과를확인할수있습니다. 그림 2 잘못된입력값을넣으면 Bad Luck! Try again! 이라는문자열이나오는것을보면정상적인입력값을넣으면그와반대되는문자열이있음을예측할수있습니다. 또한컴파일정보를알아보기위해 PEiD 툴로확인해보았습니다. 그림 3 확인결과.NET 으로컴파일했음을알수있습니다. 4

상세분석 먼저 IDA Pro 를통해파일의내부를확인해봅니다. 그림 4 위그림 4는문제파일의 Main 부분의소스입니다. 그림의빨간박스를통해확인가능하며그아래내용들은각각암호화되어있는문자열인것인지를의심해보아야합니다. 또한메인함수가 RijndaeSimpleTest 클래스내부에있음을기억해둡니다. 5

좀더아래코드를확인해봅니다. 그림 5 위그림 5에서는이전암호화된문자열을복호화하여두개의문자열을비교하는것을볼수있습니다. ( 그림 5 에서의빨간줄의내용들은길이가길어서캡쳐그림에서누락된것임.) 그림의 Please enter the password 라는문자열과 Bad Luck! Try again! 문자열은이전사전조사한내용과일치하며나머지 Well Done! You cracked it! 은정상적인 password를입력시나타나는문자열임을알수있습니다. 또한그림의빨간박스 ( 첫번째 ) 위의라인은 Equality함수로비교구문임을쉽게확인할수있습니다. 그결과를통해어느위치의문자열을출력할것인지를구분되어집니다. 6

그림 5 의빨간라인의함수는 Encrypt, Decrypt 함수로함수형식은아래와같습니다. String Encrypt( String plaintext, String passphrase, String saltvalue, String hashalgorithm, int passworditerations, String initvector, int keysize ) String Decrypt( String ciphertext, String passphrase, String saltvalue, String hashalgorithm, int passworditerations, String initvector, int keysize ) 7

.NET 분석툴인 reflextor 을이용하여문제파일을불러옵니다. 그림 6 8

이전에분석해두었던 Main, Decrypt, Encrypt 함수들을볼수있습니다. 또한더블클릭을하게되면그함수의세부소스를볼수있습니다. 그림 7 그림 8 9

그림 9 그림 10 10

분석한소스들의바탕으로암호화되어있는값을복호화시켜그값을출력하도록합니다. using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Security.Cryptography; namespace Simples_Crackme15 { class Program { static void Main(string[] args) { string plaintext = ""; string ciphertext = "BnCxGiN4aJDE+qUe2yIm8Q=="; string passphrase = "^F79ejk56$\x00a3"; string saltvalue = "DHj47&*)$h"; string hashalgorithm = "MD5"; int passworditerations = 0x400; string initvector = "&!\x00a3$%^&*()cvhge!"; int keysize = 0x100; plaintext = RijndaelSimple.Decrypt(cipherText, passphrase, saltvalue, hashalgorithm, passworditerations, initvector, keysize); Console.WriteLine(String.Format("Encripted : {0}", plaintext)); } } public class RijndaelSimple { // Methods public static string Decrypt(string ciphertext, string passphrase, string saltvalue, string hashalgorithm, int passworditerations, string initvector, int keysize) { byte[] bytes = Encoding.ASCII.GetBytes(initVector); byte[] rgbsalt = Encoding.ASCII.GetBytes(saltValue); byte[] buffer = Convert.FromBase64String(cipherText); byte[] rgbkey = new PasswordDeriveBytes(passPhrase, rgbsalt, hashalgorithm, passworditerations).getbytes(keysize / 8); RijndaelManaged managed = new RijndaelManaged(); managed.mode = CipherMode.CBC; ICryptoTransform transform = managed.createdecryptor(rgbkey, bytes); MemoryStream stream = new MemoryStream(buffer); CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Read); byte[] buffer5 = new byte[buffer.length]; int count = stream2.read(buffer5, 0, buffer5.length); stream.close(); stream2.close(); return Encoding.UTF8.GetString(buffer5, 0, count); } 11

public static string Encrypt(string plaintext, string passphrase, string saltvalue, string hashalgorithm, int passworditerations, string initvector, int keysize) { byte[] bytes = Encoding.ASCII.GetBytes(initVector); byte[] rgbsalt = Encoding.ASCII.GetBytes(saltValue); byte[] buffer = Encoding.UTF8.GetBytes(plainText); byte[] rgbkey = new PasswordDeriveBytes(passPhrase, rgbsalt, hashalgorithm, passworditerations).getbytes(keysize / 8); RijndaelManaged managed = new RijndaelManaged(); managed.mode = CipherMode.CBC; ICryptoTransform transform = managed.createencryptor(rgbkey, bytes); MemoryStream stream = new MemoryStream(); CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Write); stream2.write(buffer, 0, buffer.length); stream2.flushfinalblock(); byte[] inarray = stream.toarray(); stream.close(); stream2.close(); return Convert.ToBase64String(inArray); } } } 위의소스로컴파일하여실행해보면아래그림과같은결과를얻을수있습니다. 그림 11 12

Password 값은 Leteminman 임을확인하고이문자열을 HashCalc 툴을이용하여 MD5값을얻습니다. 그림 12 문제의인증값인 718070D944DE096F3A6696B077E4E2CE 를얻을수있습니다. 13