Korea 
이 프로그램은 몇 밀리세컨드 후에 종료 되는가 
정답인증은 MD5 해쉬값(대문자) 변환 후 인증하시오 

 

저번에 봤던 문제랑 똑 같은 문제입니다. 하지만 MD5로 변형을 하라고 하는 군요.

저번에 키를 얻었던 곳에서 똑같이 키를 얻을 수 있습니다. (물론 키 값은 바뀌었습니다.)

키를 얻었으면 인터넷에서 MD5 generator로 검색해 보세요. (아주 많이 나옵니다.)

 

전 위에서 두 번째 페이지로 갔습니다.

 

사용법은 간단합니다. 거기에 들어가셔서 우리가 얻은 키를 String에 넣고 MD5를 누르시면 바로 위에 hash된 값들이 나오게 되죠.

그것을 대문자로만 바꿔서 인증하면 간단히 됩니다.

 

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 20  (0) 2010.04.27
CodeEngn 19  (0) 2010.04.27
Reverse Engineering  (0) 2010.04.22
CodeEngn 18  (0) 2010.04.14
CodeEngn 17  (0) 2010.04.14

대망의 마지막 이네요. 기분 좋네요 마지막 까지 다 풀다니.

마지막 문제도 힘차게 블로깅 시작하겠습니다.


 

Korea 
이 프로그램은 Key파일을 필요로 하는 프로그램이다. 
위 문구가 출력되도록 하려면 crackme3.key 파일안의 데이터는 무엇이 되어야 하는가 
Ex) 41424344454647 
(정답이 여러개 있는 문제로 인증시 맞지 않다고 나올 경우 게시판에 비공개로 올려주시면 확인해드리겠습니다) 

 

 

프로그램을 시작하면 아무것도 나오지 않습니다. 메뉴를 눌러봐도 마찬가지더군요

이 실행파일은 aseembly로 짜져 있다는 것을 알 수 있습니다.

 

이 프로그램을 제대로 실행하기 위해선 두가지 과정이 필요합니다.

첫번째 것은 키 파일을 만드는 것인데요. 키 파일이 존재하지 않으면 프로그램은 아무것도 하지 않습니다.

두번째는 메시지가 나오게 살짝 코드를 수정하는 것입니다.

중간쯤에 무조건 점프를 시키는 구간이 있는데 그곳을 없애야 되더군요.

 

 

문자열로 검색하시면 우리가 원하는 문자열을 쉽게 찾을 수 있습니다.

Cracked by: 사이에 우리가 원하는 문자열을 생성 시켜주는 것이 답이죠??

문자열을 생성해 내는 곳은 분명 키 파일에서 키를 읽어오고 난 후라는 것을 짐작해 볼 수 있습니다.

그럼 진짜로 그런지 보죠.

 

전 crackme3.key 파일을 만들어서 숫자를 대충 집어 넣고 프로그램을 실행 시켰습니다.

 

ReadFile()가 실행된 후 메모리에는 우리가 적어놓은 값들이 들어와 있는 것을 볼 수 있습니다.

 

그리고 선택되어 있는 함수가 실행된 후 키 값이 바뀌는 것을 확인 할 수 있군요.

그럼 위 함수만 분석하면 문제는 풀 수 있습니다.

 

이 루틴이 우리가 분석해야 할 루틴입니다.

여길 잘 진행해 보시면 여기서 키를 바꾸고 있다는 것을 알 수 있죠.

분석해 보면.

 

for( BL = 41; BL <= 4F; BL ++ )

{

    Buffer[ I ] = Buffer[ I ] ^ BL;

}

위 함수와 같습니다. 우리가 파일에 적은 값을 가져와서 BL을 하나씩 증가시키면서 XOR연산을 해서 키를 만들고 있더군요.

그럼 저것을 반대로 하는 프로그램을 만들면 되겠네요..

 

위 함수는 많은 부분이 생략 되어 있는데요. 결국은 우리가 분석한 로직을 반대로 바꾼 것입니다.

대신 원하는 키 값을 찾을 때 까지 brute force만 하게 됩니다.

저렇게 하면 키 값을 찾아 낼 수 있는데요. 그것을 파일에 그대로 써 넣는 다는 것은 불가능합니다.

하지만 우리가 레지스터의 값을 변경한다면 원하는 결과를 만들어 낼 수는 있습니다.

 

20번 문제는 19번 보다 좀 덜 해멨기 때문에 쉽더군요. (더 재밌었습니다.)

그럼 모두 열공하세요!

 

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn Adv01  (0) 2010.04.27
CodeEngn 19  (0) 2010.04.27
Reverse Engineering  (0) 2010.04.22
CodeEngn 18  (0) 2010.04.14
CodeEngn 17  (0) 2010.04.14

KO : 이 프로그램은 몇 밀리세컨드 후에 종료 되는가 
EN : How many milliseconds does it take for this program to terminate 

 

프로그램을 실행시켜보면 몇 초 후에 멈추게 됩니다.

그 초를 정확히 재는 것도 한 방법이 될 거 같네요. (가능한가;;)

이 프로그램은 다른 툴로 열어 보면 위 그림처럼 오토잇이라는 것이 나타나게 됩니다.

오토잇은 스크립트 언어인데요. 저걸로 여러가지를 만들 수 있더군요. (윈도우 자동 설치 등)

 

선택 옵션 중에 UPX를 선택하면 자동으로 압축해주는 기능도 갖고 있습니다.

이번 문제가 그런 유형입니다.

 

그리고 이 프로그램은 디버깅을 하다보면 프로그램이 바로 종료되게 되는데요.

그 이유는 안티디버깅이 걸려 있기 때문에 그렇습니다. (간단한 거라서 여기서는 패스요)

 

한줄씩 디버깅 하다 보면 위 함수가 실행됐을 때 프로그램이 실행 되는 것을 알 수 있습니다.

이 프로그램은 오토잇으로 감싸져 있고 그 안에 우리가 원하는 프로그램이 있기 때문에

저 안으로 들어가서 더 분석을 해야 합니다.

 

한단계 한단계씩 가다 보면 또 위와 같은 함수가 나오고 그 안에 들어가면 안티디버깅이 들어있는 것을 볼 수 있습니다.

간단한 안티디버깅이기 때문에 쉽게 우회하실 수 있을 겁니다.

 

안티디버깅 우회 하시고 쭉 진행하시다 보면 위 함수가 나옵니다.

위에 주석을 보면 윈도우 리소스 등록, 트레이 아이콘 생성등 프로그램을 실행하기 위해서 하나하나 과정을 밟고 있는 것을 볼 수 있네요.

그리고 여길 분석해야 함 이라는 소스가 실제 우리가 분석해야 하는 프로그램이 됩니다.

 

위 함수에 들어가 보면

위와 같은 소스가 보이는 데요. 눈에 익죠? 이제 프로그램은 우리의 입력을 받기 위해 대기를 합니다.

그리고 몇 개의 초기화 과정을 더 거치는 데요. 마지막 쯤에 가보시면

위 함수가 있습니다.

다들 알다시피 WaitForSingleObject 함수는 어떤 스레드의 종료를 가리키는 함수 잖아요?

그래서 저는 다른 스레드를 만들고 그 스레드의 종료를 기다리고 있구나 라고 생각을 했습니다.

잘 찾아 보면 실제로 CreateThread를 호출 하는 것을 볼 수 있습니다.

 

자 위를 보죠. 우리가 봐야 할 것은 3번째 인자인 ThreadFunction인자 인데요.

그 인자에는 함수 주소가 들어가게 됩니다.

그래서 저 함수를 분석을 했습니다. 결과는… 뭐가 없더군요;; (사실 제대로 분석 못했습니다.)

저것은 고의로 만들어 두신건지…… 굉장히 어려운 함수가 안에서 실행됩니다.

나중에 저 문제를 푸시는 분은 저기서 헤메지 마세요. 답은 훨씬 가까운 곳에 있습니다.

 

이 문제는 이정도 까지만 해도 될거 같네요.

처음 보는 유형이라 굉장히 헤맸습니다. (오토잇 해제 하려고 하루죙일… 저 스레드 분석하는데.. 몇일 ㅠㅠ)

저를 굉장히 헷갈리게 하는 소스가 많더라구요.. 에휴ㅋㅋ;;

다들 열심히 푸세요!!

 

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn Adv01  (0) 2010.04.27
CodeEngn 20  (0) 2010.04.27
Reverse Engineering  (0) 2010.04.22
CodeEngn 18  (0) 2010.04.14
CodeEngn 17  (0) 2010.04.14

+ Recent posts