'WarGame'에 해당되는 글 47건

  1. 2010.02.20 Vortex level3 풀이
  2. 2010.02.16 Vortex level2 풀이
  3. 2010.02.10 Vortex level1 풀이
  4. 2010.02.04 Vortex level0 풀이
  5. 2010.02.03 Code Gate 2009 본선 문제 stego_win 풀이
  6. 2010.01.08 Crackme#15
  7. 2010.01.06 CrackMe#14

2010.02.20 20:25 WarGame




level2 보다 다소 난이도가 상승했군요

쉘코드를 삽입해야 하고

exit 때문에 일반적인 bof는 통하지 않습니다

일단 Reading Material 의 dtors 영역을 이용하는 방법을 읽어보도록 합시다

dtors 영역을 bof에 적용해보기는 처음이군요

fsb 에서는 그 영역에 접근해서 수정하는게 가능했지만..

아무튼 dtors 영역을 이용하라는 힌트도 얻었으니

본격적으로 분석으로 들어가봅시닼



dtors 영역의 주소를 알아낸 모습입니다

0x8049000 이후에 자리잡고 있군요

스택과는 너무 동떨어져있어서 어떻게 손대야 하나 했습니다만

문제에 답이 있습니다

전역 변수가 어디에 저장되는지 기억을 해내신다면

문제 푸는게 훨씬 수월해집니다

다시 objdump 로 확인해봅시다



0x8049490 부터 data 영역의 시작입니다

data 영역에는 val 값과 lp 값 [ val의 주소 ] 가 들어있을 것이라고 짐작할 수 있습니다

31337... 16진수로 7a69 입니다

감이 오시나요?

좀더 자세히 확인해보기 위해서 gdb로 열어보죠




흠.. dso_handle , p.0 , val, lp 값이 있군요

일단 val에는 7a69 가 들어있는걸 확인했습니다

lp는 val의 주소 0x804949c가 들어있구요

자 이제, 우리가 이 값을 어떻게 수정할 수 있을지 코드를 뜯어봅시다

이중 포인터까지 나오는 아름다운 코드로군요 -.-





먼저 lp -> val 인 상황에서 lpp가 lp를 가리키게 했습니다

즉, lpp-> lp -> val

이고 tmp 는 지정을 해주지 않았군요

그리고 buf[128] 를 할당하고

bof의 인기함수 strcpy가 등장합니다

인자를 buf에 덮어씌우는군요

다음은 lpp가 0x8040000 영역을 지정하는지 검사합니다

일반적인 경우라면 val을 가리키고 있으므로 걸릴게 없겠죠

그리고.. 주의 깊게 보셔야 될게

**lpp = (unsigned long) & buf

바로 이부분입니다

lpp가 포인팅 하고 있는 곳의 포인터 값에 buf의 주소값을 넣는다

말이 좀 어려운가요?

그러니까 현재 상황에서 보자면

lpp -> lp -> val 이니까  val 값에 buf의 주소를 넣어준다

이 말이 되겠죠

tmp는 크게 신경을 쓰지 않아도 될것 같습니다

자 그럼 이제 어떻게 해야 할까요

dtors 가 우리가 생성한 쉘코드 값이 있는 곳을 가리키도록 하면 되겠죠

dtors -> buf 이렇게요

그런데 좀전에 lpp -> lp -> val [31337 ]  기억하고 계신가요?

val 에 buf의 주소가 들어가죠

lpp -> lp -> val [ &buf ]

이 부분을 이용할 수 있겠군요

lpp -> lp -> dtors [ &buf ]

이렇게 넣어준다면 dtors 영역의 값이 buf 주소로 들어가고

쉘 코드 값이 실행 될 수 있습니다

슬슬 복잡해지죠?

자 그럼 lp가 dtors를 가리키도록 해야 합니다

우리는 stack에 위치한 lpp 의 값을 바꿀순 있습니다만

lp 의 값을 직접적으로 바꿀순 없습니다


좀전에 data 영역의 값을 유심히 살펴보신분이라면

금방 방법을 찾으셨을 거라 생각합니다

_dso_handle
p.0
val
lp

이렇게 있었죠

p.0 의 값을 기억하나요?

0x080494558

네 dtors 영역이군요

p.0 가 dtors를 가리키고 있다

이걸로 문제는 또 한꺼풀 풀렸습니다

그러니까 최종적인 포인터 값은

lpp -> p.0 -> dtors

바로 이렇게 됩니다

자 이제 lpp에 p.0값을 넣어주고

buf에 쉘코드 값을 넣어주는 것만 남았군요

각 변수들의 dummy byte 만 찾아내면 됩니다

음 lpp 의 원래 값은 알고 있죠?

0x80494a0 입니다

gdb로 처음에 152 byte 만큼 할당해주신걸 기억해주신다면...

buf [ 128 ] + dummy1 [ ?? ] + tmp [ 4 ] + lpp [ 4 ] + dummy2 [ ??? ] = 152

이렇게 되신걸 알수 있겠죠

일단 인자로 아무값이나 128 개를 넣고 그 값 이후로 어느 정도 떨어진 지점에

저 주소값이 있는지 봅시다

그럼 dummy 1 의 크기를 알아낼수 있겠죠




0x90909090 이후로 8byte의 텀이 있는걸 볼 수 있습니다

tmp 까지 덮어씌워야 하니까 12byte 겠죠

어떻게 최종 코드를 짜셔야 하는지 감이 오시나요?

shell code  + dummy   =  128 + 12

쉘코드는 여기있던걸
http://www.shell-storm.org/shellcode/files/shellcode-399.php

썼답니다




\x6a\x31\x58\x99\xcd\x80\x89\xc3\x89\xc1\x6a\x46
\x58\xcd\x80\xb0\x0b\x52\x68\x6e\x2f\x73\x68\x68
\x2f\x2f\x62\x69\x89\xe3\x89\xd1\xcd\x80

총 34바이트 입니다

그러니까 이제 dummy 106byte 를 넣어주고 마지막으로

lpp 에 p.0 의 주소값을 넣어주면 되죠

최종 코드 입니다






어때요 참 쉽..지는 않군요?

'WarGame' 카테고리의 다른 글

[Python Challenge] level1 풀이  (0) 2010.03.05
[ Padocon 2010 ] Crackme 100 Breakme 풀이  (0) 2010.02.28
Vortex level3 풀이  (0) 2010.02.20
Vortex level2 풀이  (0) 2010.02.16
Vortex level1 풀이  (0) 2010.02.10
Vortex level0 풀이  (0) 2010.02.04
Posted by LinkC

2010.02.16 13:08 WarGame





특별한 tar 파일을 만들라고 합니다

먼저 level2.c 를 살펴보면

tar 명령어로 cf  옵션을 주고 tmp 폴더에 특정 이름의 tar 파일이 언급되구요

첨부된 문서를 읽어보면 cf 옵션이 뭘 의미하는지 아는것은 어렵지 않을 겁니다

뒤에 이어지는 파일 이름으로 tar 파일을 새로 생성한다는 것이죠

level3의 setuid가 걸려있으므로 실행시 tar 명령어는 level3의 유저가 실행한것과

동등한 권한을 갇게 됩니다

그러니까 level3 패스워드 파일에 접근할수 있게 되죠

level2의 인자로 level3 의 패스워드를 주면





/를 제거하라고 하는군요

vortex_pass 폴더에 가서 실행합시다




어때요, 참 쉽죠?

'WarGame' 카테고리의 다른 글

[ Padocon 2010 ] Crackme 100 Breakme 풀이  (0) 2010.02.28
Vortex level3 풀이  (0) 2010.02.20
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
Posted by LinkC

2010.02.10 17:29 WarGame




level0랑 좀 분위기가 다른 문제로군요

처음엔 execlp 를 못보고 쉘코드도 짜서 넣어줘야 하나 했습니다 :(

아무튼 ptr 의 첫바이트에 ca를 넣어주면 됩니다

대략 스택을 살펴볼까요






여기서 Ptr은 Buf[256]을 가리키게 되겠습니다

소스코드를 보면

\를 입력하면 한칸 앞을 가리키게 됩니다

그렇다면 Ptr의 맨 첫번째 바이트를 변경하려면 어떻게 해야 할까요?

1. 아무 문자나 입력해서 ptr이 가리키는 값을 계속 늘린다

2. \ 문자를 입력해서 한칸씩 앞으로 이동해서 ptr에 직접 접근을 한다


1번

은 훼이크죠

스택 주소의 한계점때문에 접근이 불가능합니다

제가 모르는 어떤 방법이 있을 지는 모르겠지만..

전 2번으로 했답니다

256 칸 앞의 1바이트를 수정하기 위해서는

257 번 전진하고 대입해줄 한바이트를 입력하면 됩니다

대략 \ x 257 , ca  그리고 e 함수를 실행시키기 위한 임의의 문자 하나면 됩니다




흠 쉘이 뜨자마자 바로 종료되는군요

문제를 유심히 살펴보면

bash에서 어떻게 EOF [ End Of File ] 을 관리하는지 알아야 한다고 합니다

저런식으로 문자열을 전달해주게 되면 마지막에 EOF가 자동으로 삽입되므로  자동으로 종료되버리죠

이를 방지 하기 위해서는



쉘 상에 값을 출력하고 이를 복사해서 하는 방법과


cat 등을 이용하는 방법이 있겠습니다


라고는 했는데 2번째 방식은 하고 나면 먹통이 되더군요

그래서 다른 방법을 모색해봤습니다

일단 저 명령을 스크립트로 만든 다음에

만든 파일에 다시 파이프로 연결해 주는 방법이나



스크립트를 이용하지 않고 ; 를 이용해서 우겨넣는 방법이 있겠습니다





어때요 참 쉽죠?


'WarGame' 카테고리의 다른 글

Vortex level3 풀이  (0) 2010.02.20
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
Posted by LinkC

2010.02.04 14:42 WarGame


저번에 몇문제 풀긴 했었는데

홈페이지가 닫혀서 상당히 오래 못풀어서

기억이 가물가물해진탓에 다시 풀어봅니다

또 얼마나 가서 지지 칠지는 모르겠습니다만 -.-

짬짬이 풀도록 노력하겠습니다 :D

목표는 다음과 같습니다



5842 번 포트에 연결해서 4개의 unsigned 정수형을 4개 받아온다음에

모두 합친다음에 다시 보내면 됩니다

위의 포트에서 응답하는 패킷을 캡쳐해서 손으로 일일히 더하는 수도 있습니다만

코드로 작성해봅시다

binary로 값이 little endian 형식으로 온다는 점을 주의하시구요~

변환을 위한 struct , 통신을 위한 socket 을 import 했습니다

이렇게 소스를 짜줍시다 , 이렇게 챠!

변환시 I 는 Unsigned int 형을

< 는 little endian 을 나타냅니다








p.s

코드를 작성하고 실행시키다보면 가끔



이런 경고가 뜨는데

이는 Vortex 서버에서 너무 큰 숫자가 넘어와서

 Unsigned 형의 범위를 넘어버린 것입니다

Unsigned 형은 2^32 -1 까지죠

실제로 sum을 출력해서 확인하면

2^32-1 인 4294967295 까지는

경고가 뜨지 않는 것을 확인할 수 있습니다


'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.02.03 00:57 WarGame

먼저 문제는 http://mins4416.tistory.com/

beist lab 오시리스님의 블로그에 올라와있습니다

문제를 보면

out.bmp 와 stego_win.exe 가 있군요

일단 stego_win.exe를 실행시키면

파일 이름을 입력하라고 나옵니다

파일 이름을 올바르게 입력하면 hidden string을 입력하라고 나오는데

다음과 같이 아무렇게나 입력해보면



out.bmp에 결과가 저장되었다고 합니다

out.bmp를 열어보면 아무 변화도 없는것 같지만

hex editor로 두 파일을 열어보면

결과 파일과 처음 지정한 파일이 특정 부분이 1비트씩 달라져있음을 볼 수 있습니다




처음에 보면 굉장히 무질서 하게 달라진것 같은데

분명 어떤 규칙을 가지고 이렇게 바뀌었을 것입죠

그럼 이제 코드를 살펴봅시다

hidden string을 받고 나서

잡다한 준비 과정을 거치고 나면

파일에 기록하는 부분이 나오는군요



위압적인 길이로군요

일단 Hey ray로 뽑아봅시다



소스코드 만만치 않군요 -,.-

소스코드 뒤로 가면 & 연산  | 연산 >> 연산 등이 나오는걸 볼 수 있습니다

bit 연산이 이뤄지는거 같군요 

디버거로 차근차근 진행하면서 소스코드와 비교해봅시다

먼저 처음에 코드를 따라가며 실행한 부분만 보겠습니다



입력한 string의 첫번째 bit 값을 가지고 3번 돕니다

그다음 실행되는

SHR 명령어에 의해서 EDI 값이 오른쪽으로 shift 되고

즉 10000000 에서 01000000 이 되죠

여기서 다시 and 값으로 확인 후 반복문 실행

한 bit 또 shift 하고 and

이런식으로 하다가 and 값이 1이 되는 경우가 있다면

파일에 1씩 더해서 기록합니다



예를 들어 봅시다

hidden string으로 아스키 코드 값이 31인 숫자 '1'을 넣었다고 하면

2진수로 00110001 가 됩니다

가장 안쪽의 반복문은 한 bit당 무조건 3번씩 실행되니까

한 문자당 총 24 ( 8*3 ) 번 반복문을 돌겠군요

0일 경우는 그대로, 1일 경우는 1을 더해서 파일에 기록합니다

그렇다면 파일에는

0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0
0 0 0 0 0 1 1 1

이런식으로 기록됩니다

이를 쉽게 알아보는 방법으론

헤더를 제외하고 모조리 0으로 채운 bmp 파일을 대상 파일로 지정해주면 되겠죠

한번 맞는지 확인해봅시다




header가 맨 처음에 포함되는걸 감안하면 결과가 생각한대로 나온거 같군요

다만 여기서 주의할 점은 코드값이 0 일때와 짝수, 홀수 일때 각각 다르게 적용된다는 것입니다

먼저 BMP 파일 내용은 모조리 짝수 인걸 눈여겨 봅시다

헤더를 제외한 BMP 파일의 내용중 홀수는 문자열에 의해서 바뀌었다는 것을 보실수 있습니다

0이면 +1을 더해주고 비트가 1이면서 짝수면 하나 빼줍니다

비트가 0이면서 홀수 인경우는 하나 빼줘야 하구요

이를  소스로 짜보면



정도로 생각해볼수 있겠습니다

아직 python 에 익숙하지 않아서 좀 삽질좀 했습니다만.. 아무튼

일단 이 소스는 입력한 문자열 뒤에 BMP 내용은 손대지 않았으니

전에 입력했던 내용이 고스란히 남습니다

하지만 정답을 추출해내는데는 별 상관 없으니 이쯤 하고

거꾸로 파일에서 문자열을 추출해보도록 합시다

24바이트가 한 문자임을 고려하면 추출하는건 훨씬 간단합니다





이렇게 코드를 짜고 돌려보면 쨘~

어때요  참, 쉽죠?






너무 삽질을 많이해서 저런말은 못하겠네요 -,.-

아무튼 좋은 문제 내주신 beist lab 여러분 감사합니다 :D

'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.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
이전버튼 1 2 3 4 5 이전버튼

블로그 이미지
LinkC

태그목록

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

공지사항

Yesterday30
Today7
Total328,679

달력

 « |  » 2019.5
      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  

최근에 받은 트랙백

글 보관함


. .