'심플스'에 해당되는 글 4건

  1. 2010.01.08 심플스 해킹? (2)
  2. 2010.01.08 Crackme#15
  3. 2010.01.06 CrackMe#14
  4. 2010.01.05 UnpackME Clear!

2010.01.08 09:29 Etc../잡담




오늘 아침 남은 crackme 를 풀려고 심플스에 들어가려고 했는데

저런 화면이 절 반겨주는군요

관리자 분께서 점검하는거 같지는 않은 듯한 문구로군요

zone-h 에 등재는 되지 않았습니다

누가 심플스 커뮤니티에 이런 악의적인 장난을 친건지

아니면 단순사고인지는 모르겠습니다만

안좋은 일은 아니었으면 좋겠네요

'Etc.. > 잡담' 카테고리의 다른 글

해커스쿨에서 개발한 툴 & 서비스  (0) 2010.01.29
Crackme Clear!  (0) 2010.01.25
심플스 해킹?  (2) 2010.01.08
UnpackME Clear!  (0) 2010.01.05
Great site for Reversing!  (0) 2010.01.02
What is Augmented Reality? 증강현실?  (0) 2009.12.29
Posted by LinkC

2010.01.08 00:34 WarGame


문제를 받고 실행해보면

콘솔창에 비밀번호를 입력하라는 메세지만 덩그러니 나온다

문제가 엄청 쉽게 풀릴거 같은 느낌을 가지고

올리디버거를 실행시켰는..?

실행이 안된다 -

나만 그런가 싶어 다른 사람들은 어떤지 봤는데

아무문제 없이 실행되는거 같더라

OS 때문인가. Unpack 할때도 간간히 실행 안되더니

이럴때 말썽이다

아무튼 다른 방법으로 풀어야했다

PEID 로 보니



위와 같다

C# 으로 만들어진걸 crack 하기는 처음인데

아무튼 ..

.NET 이라니 .NET Reflector 가 떠올랐다

여기에 넣고 돌리면



ConsoleApp 3 가 추가된걸 확인 할 수 있고

여기서 소스를 그대로 거의 그대로 확인할 수 있다

정말 이정도로 소스가 쉽게 나올 줄은 몰랐는데

있는 함수 그대로 C# 프로젝트에 옮겨

붙여넣어주면 끝이다

좀 싱겁다면 싱거울 수 있는 문제지만

처음엔 이걸 어떻게 풀어야 하나 했다 -.-

아, 소스를 작성할 때 유의할 점이 있는데

RijdaelSimple class 구현부이다.

C#을 처음 접하다 보니

자꾸 RijdaelSimple 에서 오류가 나는데

왜 오류가 나는지 한동안 헤멨다

Google 을 약간 뒤져보면 어떤 식으로 구현하는지

직접 볼 수 있다.

이렇게 소스를 구현하고

Decrypt 함수의 리턴 부분을 출력 시켜주면 끝이다

    1 using System;

    2 using System.Collections.Generic;

    3 using System.Linq;

    4 using System.Text;

    5 using System.IO;

    6 using System.Security.Cryptography;

    7 

    8 

    9 namespace ConsoleApplication1

   10 {

   11     class Program

   12     {

   13         private static void Main(string[] args)

   14         {

   15             string plainText = "";

   16             string cipherText = "BnCxGiN4aJDE+qUe2yIm8Q==";

   17             string passPhrase = "^F79ejk56$\x00a3";

   18             string saltValue = "DHj47&*)$h";

   19             string hashAlgorithm = "MD5";

   20             int passwordIterations = 0x400;

   21             string initVector = "&!\x00a3$%^&*()CvHgE!";

   22             int keySize = 0x100;

   23 

   24             plainText = RijndaelSimple.Decrypt(cipherText,

passPhrase, saltValue, hashAlgorithm, passwordIterations, initVector, keySize);

   25             Console.WriteLine(plainText);

   26         }

   27 

   28         public class RijndaelSimple

   29         {

   30             public static string Encrypt(string plainText, string passPhrase, string saltValue, string hashAlgorithm,

int passwordIterations, string initVector, int keySize)

   31             {

   32                 byte[] bytes = Encoding.ASCII.GetBytes(initVector);

   33                 byte[] rgbSalt = Encoding.ASCII.GetBytes(saltValue);

   34                 byte[] buffer = Encoding.UTF8.GetBytes(plainText);

   35                 byte[] rgbKey = new PasswordDeriveBytes(passPhrase,

rgbSalt, hashAlgorithm, passwordIterations).GetBytes(keySize / 8);

   36                 RijndaelManaged managed = new RijndaelManaged();

   37                 managed.Mode = CipherMode.CBC;

   38                 ICryptoTransform transform = managed.CreateEncryptor(rgbKey, bytes);

   39                 MemoryStream stream = new MemoryStream();

   40                 CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Write);

   41                 stream2.Write(buffer, 0, buffer.Length);

   42                 stream2.FlushFinalBlock();

   43                 byte[] inArray = stream.ToArray();

   44                 stream.Close();

   45                 stream2.Close();

   46                 return Convert.ToBase64String(inArray);

   47             }

   48 

   49 

   50             public static string Decrypt(string cipherText, string passPhrase, string saltValue,

string hashAlgorithm, int passwordIterations, string initVector, int keySize)

   51             {

   52                 byte[] bytes = Encoding.ASCII.GetBytes(initVector);

   53                 byte[] rgbSalt = Encoding.ASCII.GetBytes(saltValue);

   54                 byte[] buffer = Convert.FromBase64String(cipherText);

   55                 byte[] rgbKey = new PasswordDeriveBytes(passPhrase,

rgbSalt, hashAlgorithm, passwordIterations).GetBytes(keySize / 8);

   56                 RijndaelManaged managed = new RijndaelManaged();

   57                 managed.Mode = CipherMode.CBC;

   58                 ICryptoTransform transform = managed.CreateDecryptor(rgbKey, bytes);

   59                 MemoryStream stream = new MemoryStream(buffer);

   60                 CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Read);

   61                 byte[] buffer5 = new byte[buffer.Length];

   62                 int count = stream2.Read(buffer5, 0, buffer5.Length);

   63                 stream.Close();

   64                 stream2.Close();

   65                 return Encoding.UTF8.GetString(buffer5, 0, count);

   66       }

   67 

   68         }

   69 

   70     }

   71 }


'WarGame' 카테고리의 다른 글

Vortex level2 풀이  (0) 2010.02.16
Vortex level1 풀이  (0) 2010.02.10
Vortex level0 풀이  (0) 2010.02.04
Code Gate 2009 본선 문제 stego_win 풀이  (0) 2010.02.03
Crackme#15  (0) 2010.01.08
CrackMe#14  (0) 2010.01.06
Posted by LinkC

2010.01.06 17:25 WarGame

심플스 crack 부분의 14번 문제

Key 값이 154C-6505-D2ADD0F3-A223-2870 일때 Name은 무엇인가
힌트 : Name은 두자리인데.. 알파벳일수도 있고 숫자일수도 있고..

정답인증은 Name의 MD5 해쉬값(대문자)


지금까지 Crackme 와는 다른 방식이다

보통 Name을 주고 올바른 Serial Key를 찾으라고 하는데 반대가 됐다.

그덕에 나중에 값의 참여부를 증명하는 구간을 잡아내기만 하면

쉽게 확인할 수 있었는데 그게 불가능하게 되었다.

이젠 Name으로 들어간 부분이 어떻게 연산되어서

Serial 값으로 들어가는지 체크를 해야 한다

먼저 String 을 기준으로 성공 루틴을 찾은다음

그 위를 훝어가도록 하자.



분명 성공 루틴 위의 점프문 JNZ는 Name 과 Key가 일치 하는지 여부를 검사할 것이고

그 위의 함수 호출 두 부분 중 하나가 될 것이다.

각각 BP를 걸고 확인해보면

첫번째 함수 부분에서 Key값이 계산되어 스택에 저장되어 있는 것을 볼 수 있다.

그럼 첫번째 함수로 진입해보자

진입해서 살펴보면



상당히 복잡해 보이는데

차근 차근 살펴보면 작은 구간들이 4개 있는걸 볼 수 있다.

key 값이 크게 4부분으로 나뉘어지는 것과 숫자 연산이 이루어지는 걸로 보아

한 구간 마다 key 한 부분씩 연산 됨을 유추해볼 수 있다.

이젠 그 다음부터 문제인데 -.-

일일히 거꾸로 계산해서 답을 맞추는 방법도 있겠지만

매우 비효율적일게 뻔하므로

간단한 프로그래밍을 이용하기로 했다

   10 int _tmain(int argc, _TCHAR* argv[])

   11 {

   12  char name[2];

   13  char total[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

   14  char cmp[10];

   15 

   16  int ESI=0,EBX=0,EDX=0,EDI=0,EAX=0,ECX=0;

   17 

   18  for(int i=0;i<strlen(total);i++)

   19  {

   20        name[0]=total[i];

   21 

   22   for(int j=0;j<strlen(total);j++)

   23   {

   24     name[1]=total[j];

   25 

   26     ESI=0,EBX=0,EDX=0,EDI=0,EAX=0,ECX=0;

   27 

   28    for(int k=0;k<2;k++)

   29    {

   30     ESI=name[k];

   31     ESI=ESI+EDX;

   32     ESI=ESI*0x772;

   33     EDX=ESI;

   34     EDX=EDX*ESI;

   35     ESI=ESI+EDX;

   36     ESI=ESI*0x474;

   37     ESI=ESI+ESI;

   38     EDX=ESI;

   39    }

   40 

   41    sprintf(cmp,"%X",EDX);

   42 

   43    if(strstr(cmp,"154C"))

   44    {

   45        printf("%c%c\n",name[0],name[1]); return 0;

   46    }

   47 

   48   }

   49  }

   50  return 0;

   51 }


각 단락마다 Name의 모든 부분을 사용하므로

첫번째 단락만을 이용해서 추출해냈다

답은 CT

이를 MD5로 암호화하면 끝~

대문자로 입력해야 하니 주의하자 -_-

'WarGame' 카테고리의 다른 글

Vortex level2 풀이  (0) 2010.02.16
Vortex level1 풀이  (0) 2010.02.10
Vortex level0 풀이  (0) 2010.02.04
Code Gate 2009 본선 문제 stego_win 풀이  (0) 2010.02.03
Crackme#15  (0) 2010.01.08
CrackMe#14  (0) 2010.01.06
Posted by LinkC

2010.01.05 16:37 Etc../잡담




해킹, 파괴의 광학을 보고

윈도우 프로그래밍을 공부하다가

관련있는 unpacking 을 하기 시작했고

심플스에 unpacking 문제가 있는 것을 기억해내고 풀기 시작했다 :)

여차 저차 해서 Clear~

빨리 CrackME 남은것도 깨야 할텐데 -.-

'Etc.. > 잡담' 카테고리의 다른 글

Crackme Clear!  (0) 2010.01.25
심플스 해킹?  (2) 2010.01.08
UnpackME Clear!  (0) 2010.01.05
Great site for Reversing!  (0) 2010.01.02
What is Augmented Reality? 증강현실?  (0) 2009.12.29
What is Virtualization?  (0) 2009.12.29
Posted by LinkC
이전버튼 1 이전버튼

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday57
Today61
Total309,989

달력

 « |  » 2018.05
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

최근에 받은 트랙백

글 보관함


. .