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

Korea 
Name이 CodeEngn 일때 Serial을 구하시오 
(이 문제는 정답이 여러개 나올 수 있는 문제이며 5개의 숫자로 되어있는 정답을 찾아야함, bruteforce 필요) 
Ex) 11111 

English 
Find the Serial when the Name of CodeEngn 
(This problem has several answers, and the answer should be a 5 digit number. Brute forcing is required.) 
Ex) 11111 

 

Bruteforce 하란다;; ㅋㅋㅋ

아까도 노가도 했는디 ㅠㅠ

그래도 하라면 해야지 ㅠㅠ ㄱㄱㄱㅅ

 

UPX pack이네??ㅋㅋ 요건 뭐ㅋㅋ

이젠 쉽다ㅋㅋ

 

프로그램 디자인이 ㅋㅋㅋ 엄청 나다ㅋ 독수리 오형제?? 사자 머리?? 뭐야 저건ㅋㅋㅋ

자 MUP부터 하고 시작하자. ㅋㅋ 쉽게 되넹ㅋㅋ

 

코드를 보면 GetDlgItemTextA라는 함수가 두번 보인다.

대충 짐작이 가겠지만 입력한 아이디, 시리얼의 값을 받아 오는 곳이다

그리고 아래쪽의 비교코드를 잘 살펴보면 ESI에 어떤 값이 오는 것을 알 수 있는데 그것이 5자리의 10진 숫자가 올 때 까지 계속 보자.

어느 순간!! 값이 보인다. ㅋㅋ

 

Bloger: moltak.net

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

CodeEngn 16  (0) 2010.04.13
CodeEngn 15  (0) 2010.04.13
CodeEngn 13  (0) 2010.04.12
CodeEngn 12  (0) 2010.04.12
CodeEngn 11  (0) 2010.04.12

Korea 
정답은 무엇인가 

English 
Find the answer 

 

문제 한번 엄청 심플하네;ㅋㅋㅋ

자 풀어보자!!ㅋㅋ

오호ㅋ 닷넷으로 짰네?? ㅋㅋ

처음보는 유형이네. 하지만 닷넷으로 짜면 더 쉽지!!

자 쉽게 풀어버리자!!

 

일단 이 닷넷을 이야기 하자면 자바와 같이 IL코드를 생성한다. IL(Intermediate Language)코드에는 심볼정보가 포함되어 있는데 C++, C같은 Native Language가 심볼정보를 포함하지 않는 것과 대조적이다. 그래서 NL은 디버깅하려면 심볼 파일이 따로 필요로 하게 되며 그것이 없을 경우 어셈 코드로 분석을 해야한다. 하지만 심볼정보가 포함되는 IL는 어셈을 몰라도 쉽게 분석을 할 수 있다.

자 그럼 시작해 보자.

우선 .NET프로그램을 분석하려면 .NET reflector란 프로그램이 필요하다.

다운은 알아서 받으시고 프로그램을 실행하면

아예 대놓고 소스코드가 다 보인다. ㅋㅋㅋ

참 편하다. ㅋㅋㅋ 쉽게 풀 수 있을 것 같다. 자 가자ㅋㅋㅋ

저 프로램을 다 분석하기는 힘들고 소스를 다 볼 수 있다면!! 그래!! 컴파일을 하면 된다.ㅋ

그럼 원하는 값이 톡 튀어나오겠찌??ㅋㅋ

 

VS2008을 이용해 컴파일하고 reflector에서 모든 소스를 긁었다.

그리고 plainText를 봤더니.. 왐마 답이ㅋ

자자 해보세요ㅋㅋㅋ

 

Bloger: moltak.net

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

CodeEngn 15  (0) 2010.04.13
CodeEngn 14  (0) 2010.04.12
CodeEngn 12  (0) 2010.04.12
CodeEngn 11  (0) 2010.04.12
CodeEngn 10  (0) 2010.04.12

eKorea : 
Key를 구한 후 입력하게 되면 성공메시지를 볼 수 있다 
이때 성공메시지 대신 Key 값이 MessageBox에 출력 되도록 하려면 파일을 HexEdit로 오픈 한 다음 
0x???? ~ 0x???? 영역에 Key 값을 overwrite 하면 된다. 

문제 : Key값과 + 주소영역을 찾으시오 
Ex) 7777777???????? 


English : 
You will see a success message after finding the key. 
If you would want the Key itself to replace the success message in the MessageBox, 
open up a Hex Editor and overwrite the key value in the offset range 0x???? ~ 0x????. 

Q : find the key value and the offset range and write the solution in this format : key???????? 
(first ???? for the start and the next 4 ?s for the end). 

 

아~~ 이 문제 허져 헤맸당ㅠㅠ

문제가 좀;; 헷갈리게 되어 있어서 해결책은 진작 찾았는뎅 범위 찾는 것이 너무 헷갈려ㅋ

아무튼 시작!!ㅋ

 

자 또 MASM이다. ㅋㅋ 쉽게 풀어 버리자.

 

코드를 보면 바로 아래에 GetDlgItenInt와 CMP가 보이는데 딱 봤을 때 드는 생각은

"아하 숫자를 갖고 와서 비교를 해서 끝나나 보다" 였다.

그런데 가운데에 CMP아래쪽에 JNZ JMP등 알 수 없는 코드와 ASCII 값이 들어 있었다.

가운데 함수가 뭐 하는 함수인지는 몰라도 우리가 공략 해야 할 곳은 CMP EAX, 7A2896BF 이다.

이곳을 잘 해결 하면 금방 답이 뽕하고 나온다. 다음은 이제 그 답을 코드에 입력을 해야한다.

난 Fileinsigt라는 프로그램을 쓰는데 좋은 줄은 모르겠고 ezbeat이 쓰더라ㅋ

그래서 그냥 쓴다.

 

프로그램을 실행시키면 위와 같은 섹션들이 보인다. 우리가 프로그래밍 공부할 때 잘 보이는 것들이다.

텍스트영역에는 코드가, 데이터 영역에는 전역변수나 텍스트가 존재한다. 저곳을 가보자.



그럼 위와 같은 문자열이 보이고 우리는 직감상 아 저곳을 고치면 되는 구나! 라는 것을 알게 된다.

맞다 하지만 난 헤맸다. ㅠㅠ 프로그램 사용도 서툴렀고 다른 헷갈린것도 여럿 있었다;;;

다른 분들은 쉽게 해결 하길!!ㅋㅋ

 

Bloger: moltak.net

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

CodeEngn 14  (0) 2010.04.12
CodeEngn 13  (0) 2010.04.12
CodeEngn 11  (0) 2010.04.12
CodeEngn 10  (0) 2010.04.12
CodeEngn 09  (0) 2010.04.12

Korea 
OEP를 찾으시오. Ex) 00401000 / Stolenbyte 를 찾으시오. Ex) FF35CA204000E84D000000 
정답인증은 OEP+ Stolenbyte 
Ex ) 00401000FF35CA204000E84D000000 

English 
Find the OEP. Ex) 00401000 / Find the Stolenbyte. Ex) FF35CA204000E84D000000 
The solution should be in this format : OEP + Serial 
Ex ) 00401000FF35CA204000E84D000000 

 

아까 봤던 문제다!!ㅋㅋ

뭐야ㅋ 재탕이야ㅋ

아까 너무 빡시게 해놔서ㅋㅋ 그냥 답 인증을 해버렸다 -_-;

Bloger: moltak.net

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

CodeEngn 13  (0) 2010.04.12
CodeEngn 12  (0) 2010.04.12
CodeEngn 10  (0) 2010.04.12
CodeEngn 09  (0) 2010.04.12
CodeEngn 08  (0) 2010.04.12

Korea 
OEP를 구한 후 "등록성공"으로 가는 분기점의 OPCODE를 구하시오. 정답인증은 OEP + OPCODE 
EX) 00400000EB03 

English 
After finding the OEP, find the OPCODE of the branch instruction going to the "goodboy routine" 
The solution should be in this format : OEP + Serial 
EX) 00400000EB03 

 

문제를 보면 역시나 Packing이 되어 있다는 것을 알 수 있다.

하지만 이몸은 이미 UPX에 익숙해져 있는 몸!ㅋㅋㅋ

쉽게 해주마!!

 

그래서 일단 프로그램을 다운 받고 PEiD를 돌려봤다.

왐마…. 요건 뭐냐;;; ASPack이당ㅠㅠ 댄장… CodeEngn이 나를 여러 방면으로 키워 주는구나!!

 

그리고 실행을 해봤더니…. 뭐야;; 이름이랑 시리얼이 쳐지지도 않네!!ㅋㅋㅋ

어쩌냐ㅋㅋㅋ

 

올디로 열어보니 UPX와 똑같이 PUSHAD로 시작하고 있었다. 어쩐지 전부는 아니더라도 다른 Packer들도 PUSHAD로 시작하는 것이 몇 개 있을 거 같다.

그리고 똑같이 F8->Dump->HP 하고 보니 POPAD아래로 떨어졌다. 흠 여기까지는 같네??

 

그리고 소스를 보니 어쩐지 다 된거 같다.

근데 나중에 검색해 보니 저렇게 된게 맞고

http://blog.naver.com/kodoi486?Redirect=Log&logNo=70026289264참조

6) JNZ 로 시작하는 명령에서 실행이 멈춤

7) Step into (F7)을 2번 더 누름

8) Push로 시작되는 명령줄 밑 retn에 도달해 잇어야함

9) F7을 한번 더 누름

10) AS pack으로 암호화(?)된 문자열들 앞으로 이동함 (여기가 OEP)

11) Ctrl + A (Analyse Coed)를 누름

12) 코드가 제대로 보임

위와 같은 과정이 더 필요하다는 것을 알게 되었다.

 

위와 같은 코드가 ctrl+a를 누름으로써 알아 볼 수 있는 코드로 바뀌었다.

오호ㅋ 신기하다ㅋㅋ 곧 풀 수 있을 것 같다. ㅋㅋ

패킹을 한 후 텍스트를 보면 아래와 같은 문자열을 찾을 수 있다.

답이 곧 나올거 같다 bp를 걸고 진행해 보자

그럼 그림과 같은 곳에서 프로그램이 멈추게 된다.. 흠… 답은 저기 근처에 있다. ㅋ

Bloger: moltak.net

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

CodeEngn 12  (0) 2010.04.12
CodeEngn 11  (0) 2010.04.12
CodeEngn 09  (0) 2010.04.12
CodeEngn 08  (0) 2010.04.12
CodeEngn 07  (0) 2010.04.12

Korea 
OEP를 구하시오 
Ex) 00400000 

English 
Find the OEP 
Ex) 00400000 

문제 참 심플하다;; ㅋㅋ 뭐로 패킹이 되어 있는지부터 확인 해 보자.

프로그램이 UPX로 패킹이 되어있는 것을 확인 할 수 있었다.

저번에 했으니 빠르게 답을 찾아보자.

우선 F8을 누르고 ESP dump 해서 하드웨어 브레이크 포인트를 찍고 조금 밑으로 이동했더니 OEP가 보였다. 쉽게 해결 할 수 있었다.

Bloger: moltak.net

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

CodeEngn 10  (0) 2010.04.12
CodeEngn 09  (0) 2010.04.12
CodeEngn 07  (0) 2010.04.12
CodeEngn 06  (0) 2010.04.12
Code Engn L04 Start  (0) 2010.04.06

Korea 
컴퓨터 C 드라이브의 이름이 CodeEngn 일경우 시리얼이 생성될때 CodeEngn은 "어떤것"으로 변경되는가 

English 
Assuming the drive name of C is CodeEngn, what does CodeEngn transform into in the process of the serial construction

 

원래 그런지 모르겠지만.. 코드엔진은 유독 Packing 문제가 많더라;;

그래서 올디로 열기 전에 확인을 먼저 해야 한다.

예전에 PEiD라는 프로그램을 이용한 적이 있었고 블로깅도 조금 했었다.

일단 프로그램 실행

 

아하ㅋ MASM이다. 오랜만에 보니 반갑다. ㅋ

예전에 어셈으로 프로그래밍 할 때 사용했었는데. ㅋㅋ

암튼 문제를 보면 C드라이브랑 CodeEngn이 관련이 있는 거 같으니 이름을 바꾸고 올디로 열어보자.

 

소스를 천천히 찾다 보니 드라이브의 정보를 얻어오는 함수가 보였다.

아하 어떻게 하는지 감이 온다. 쉽게 해결 할 수 있었다.



Bloger: moltak.net

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

CodeEngn 09  (0) 2010.04.12
CodeEngn 08  (0) 2010.04.12
CodeEngn 06  (0) 2010.04.12
Code Engn L04 Start  (0) 2010.04.06
Code Engn L03 Start  (0) 2010.04.05

Korea 
Unpack을 한 후 Serial을 찾으시오. 정답인증은 OEP + Serial 
Ex) 00400000PASSWORD 

 

Unpack이란다.. 이젠 대놓고ㅋ 압축 풀라네ㅋㅋ

그럼 풀어줘야징. 일단 다운로드 받고

흠 이걸 하면 되는구나??

자 일단 Unpack을 해보자.

저번에 말했다시피 Unpack(이하 언팩)은 OEP를 찾아내는 과정이라고 말했다.

문제 자체도 OEP를 찾으라는 거니 일단 빨리빨리 해야지.

 

처음 시작하면 위 화면과 같다. 언패과정은 이전 블로깅에서 자세히 했기 때문에 그냥 지나치도록 하겠다.

 

POPAD로 이동을 하면 JMP문이 저 아래 있고 가운데에 어떤 코드가 삽입되어 있다.

이게 뭔지 지금은 자세히는 알지 못하고 일단은 JMP에서 점프를 하도록 하겠다.

자 찾았다 OEP다 일단 문제 하나는 풀었군ㅋㅋ

그럼 Serial만 찾으면 되겠구나

 

GetWindowText에 breakpoint를 걸고 따라가다 보면 답들이 보인다…

언팩만 하면 쉽구먼??

자 아까 구한 OEP와 답을 합쳐서 인증하면 레벨 클리어!!

 

Bloger: moltak.net

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

CodeEngn 08  (0) 2010.04.12
CodeEngn 07  (0) 2010.04.12
Code Engn L04 Start  (0) 2010.04.06
Code Engn L03 Start  (0) 2010.04.05
Reverse L02 Start  (0) 2010.04.05

4번 문제 갖고 한 시간 정도 헤맸는데 알고 봤더니…… unpack 문제였다.

사진을 보면 EP Section에 UPX1과 아래 UPX 0.89.6 이라는 문구가 있는 것을 알 수 있다.

예전 기억을 더듬어 보면 패킹이 되어 있으면 항상 ㅎㄷㄷ 했었는데… 지금도 역시 그렇다.

하지만 한번 해보니 UPX1은 블로깅이 많이 되어 있어서 쉽더라.

아무튼 한번 해보겠다.

 

일단 UPX는 시작 시에 PUSHA로 모든 레지스터 내용을 스택에 보존 시킨다.

위 사진이 그것인데 PUSHA로 되어 있는 것을 알 수 있다. 그리고 OEP로 점프하기 전에 POPAD로 레지스터 내용을 복구한다.

여기서 OEP가 무엇이냐 면 Orignal Entry Point의 약자입니다. Entry Point란 프로그램이 최초로 수행되는 코드 즉, 진입점 함수를 말합니다.

C에서 보면 main함수가 되겠네요. (사실 main함수가 아니죠?? Windows에서는 xxmainCRTStartup, 리눅스에서는 __libc_start_main이 main함수를 실행시킵니다._)

아무튼 우리는 OEP를 찾아야 합니다. 왜냐하면 패킹이 되면 EntryPoint가 우리가 원하는 프로그램 시작지점이 아니게 되기 때문입니다.

우리가 원하는 건 main함수 같은 그런 시작지점입니다.

블로깅된 정보를 보니 ESP를 이용해서 하드웨어 포인터를 사용해서 하더군요.

잠깐 unpacking 순서를 쫙 펼쳐보자면……….

ESP에 하드웨어 브레이크 포인트->실행->Olly Dump->Rebuild Import 해제 후 빌드->OEP 저장->패킹된 프로그램 시작->Import REC시작->Attach Process->OEP 입력->AutoSearch->Get Imports->Fix Dump 이 순서로 이루어 지더군요.

하나씩 따라가면서 해보도록 하겠습니다.

 

먼저 원하는 프로그램을 OllyDebuger(이하 올디)로 엽니다.

위 그림과 같이 한번 실행한 후 (step over) Folliow In Dump를 해서 아래 메모리 창에 데이터가 나오게 합니다.

 

그리고 4바이트를 선택한 후 Hardware Break Point를 겁니다. DWORD로요. 왜냐하면 처음 시작 부분에 보시면 알겠지만 PUSHAD라는 명령어가 있죠? 마지막에는 POPAD라는 명령어가 있습니다. 그 후 OEP로 점프하게 되는데 우리는 그 지점을 찾고 싶은 겁니다.

아무튼 하드웨어 브레이크 포인트를 설정하셨으면 F9를 눌러서 실행해 주세요.

 

그럼 위 그림과 같이 점프 구문으로 이동하게 됩니다. 그 곳이 바로 우리가 원하는 OEP로 점프하는 구문입니다.

자 F8을 눌러 봅시다. 어?? 왔네요… PUSH EBP로 시작합니까? 그럼 OEP를 맞게 찾으신 겁니다. 이제 다 성공하셨네요.

이제 Plugins를 눌러서 OllyDump를 실행해 주세요. 없으시면 다운 받으시면 됩니다. 구글에서 검색하니 바로 나오더군요.

이 플러그인의 역할은 현재 메모리를 덤프 뜨는 거라고 합니다. 우리는 현재 엔트리 포인트에 있기 때문에 이 쪽을 덤프뜨게 됩니다.


주의 하실 점은 Rebuild Import를 해제해 주세요. 올디가 IAT를 재구성해 주는데 잘 안 된다고 하네요. 그 후 Dump를 해주시면 됩니다. 파일이름은 대충 맘에 드시는 걸로 지우시되 Entry Point를 저장해 주세요. 저는 41270 이네요.

그 후 Import REC라는 프로그램을 다운 받아서 실행시켜 주세요. 그리고 언패킹할 프로그램도 실행시키시구요.

Import REC는 IAT를 복구 시켜주는 툴인데요. OEP가 필요합니다. 하지만 우리가 아까 OEP를 찾았죠?? 그걸 입력해 주시면 됩니다. 자 해볼께요.

 

OEP에 Entry Point를 입력했습니다. 그 후 AutoSearch, Get Imports를 누르시고 Fix Dump를 누르세요. 파일 저장은 아까 올디에서 메모리 덤프했던 그 파일을 선택해주시면 됩니다. 그러면 성공했다는 메시지와 함께 IAT가 복구됩니다.

실행하면 잘 실행되네요.

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

CodeEngn 07  (0) 2010.04.12
CodeEngn 06  (0) 2010.04.12
Code Engn L03 Start  (0) 2010.04.05
Reverse L02 Start  (0) 2010.04.05
Code Engn Reverse L01 Start  (0) 2010.04.02

Code Engn 두번 째!

Korea 
패스워드로 인증하는 실행파일이 손상되어 실행이 안되는 문제가 생겼다. 패스워드가 무엇인지 분석하시오 

 

일단 실행했더니

그리고 한가지 툴을 써서 잘 살펴보니 보이더라ㅋ

더 이상의 블로깅은ㅋㅋ

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

CodeEngn 07  (0) 2010.04.12
CodeEngn 06  (0) 2010.04.12
Code Engn L04 Start  (0) 2010.04.06
Code Engn L03 Start  (0) 2010.04.05
Code Engn Reverse L01 Start  (0) 2010.04.02

리버싱 시그를 시작했다.

예전부터 하고 싶었던 과목이지만 어렵고 다른 것도 할것이 많아서 못하고 있엇지

이젠 시그로 묶었으니깐 열심히 해야징ㅋㅋ

 

Ezbeat이 추천해준 사이트 중 Code Engn의 문제를 풀어보기로 했다.

한글이고 쉬울거 같아서??ㅋㅋ

 

암튼 시작!!

 

문제:

Korea 
HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가

실행하면 하드를 씨디로 인식하게 하라는 창이 뜨면서 프로그램이 죽는다.

위에 문제를 보면 GetDriveTypeA의 리턴값을 적절하게 수정하면 될 것 같다.

 

어제 ezbeat이 알려준 방법대로 Search for->All Intermodular Calls를 실행한다.

위 기능은 Import된 함수들의 목록을 보여주는 역할을 한다. 고로 API를 잘 하면 더 쉽게 Reversing을 할 수 있겠지??ㅋㅋ

문제에서 나왔던 GetDriveTypeA가 보인다. 일단 우클릭을 해서 브레이크 포인트를 찍고 실행해 보자.
참고로 F2: Break Point, F9: Run, F8: Step Over, F7: Step Into 이다. 잘 기억해 놓자.

암튼 F9를 눌러서 실행해서 리턴값이 뭐가 나오는지 확인해보자.

실행하면 위 GetDriveTypeA에서 멈춘 것을 확인할 수 있다. 이제 우리는 리턴값을 확인하면 되는데.

여기서 잠깐 x86의 Windows와 Linux는 리턴값을 대부분 EAX 레지스터에 저장한다는 것을 알아야 한다.

그래서 우리는 EAX 레지스터를 확인 할 것이다.

위 그림에서 보면 알겠지만 EAX의 값이 0x00000003 인것을 알 수 있다. 이 값이 아마도 HDD를 가리킬텐데 우리는 CD-ROM

으로 바꿔야한다. 어떻게 해야하나? MSDN을 봐야지.

자 위에서 보면 3이 드라이브를 가리킨다는 것을 알 수 있으며 우리가 원하는 것은 5번이라는 것을 쉽게 알 수 있다.

이제 EAX 레지스터를 수정하기만 하면 된다.

EAX 레지스터를 클릭해서 0x00000005로 바꾸고 실행.

올바른 결과가 출력됐다.

1번 문제 끝ㅋ

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

CodeEngn 07  (0) 2010.04.12
CodeEngn 06  (0) 2010.04.12
Code Engn L04 Start  (0) 2010.04.06
Code Engn L03 Start  (0) 2010.04.05
Reverse L02 Start  (0) 2010.04.05

+ Recent posts