Avex crackme 1번
Hacking/Reversing

Avex crackme 1번

리버싱에 대해 아무것도 모르는 상태이므로 기초적인 Avex crackme부터 시작하도록 하겠다.

처음이므로 상세하게 설명하겠다.

일단 올리디버거를 다운받는다 


odbg110.zip

올리디버거 상세 설정은 링크로 대신한다.

http://t0x1c07.tistory.com/entry/%EC%98%AC%EB%A6%AC%EB%94%94%EB%B2%84%EA%B1%B0OllyDBG-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B8%B0%EB%B3%B8-%EC%84%A4%EC%A0%95

avexcrackme도 다운받는다 

abexcm1.exe


실행하면 이런화면이 뜬다 해석해보자면 

내가 너의 hdd를 CD-ROM으로 생각하게 만들어라


확인을 누르면 Error가 뜨면서 이것은 CD-ROM이 아니라고 한다

이제 이파일을 올리디버거로 열어보자


열면 이렇게 매우 복잡해보이는 화면이 펼쳐진다.


기초 화면 설명은 이사진으로 대신한다

출처: http://zzaps.tistory.com/120    

이제 코드를 해석해보자


0040100C까지 PUSH로 스택에 값을 집어넣고 있다.

오른쪽 주석을보니 MessegeBoxA 함수가 필요한 4개의 인자를 스택에 넣고있는거같다.

MessegeBoxA 함수가 어떻게 생겻는지 보자

MessegeBoxA함수가 있는 줄로가서 Ctrl+F1을 누르면 도움말이 뜬다 


설명을 보자면 4개의 인자를 받는 함수라는걸 알수있다. 주석을보면 아까 스택에 집어넣은 순서와는 정반대로 되어있다.

스택구조는 LIFO(Last In Last Out)  나중에 들어간 놈이 나중에 나오는 구조이기때문이다.

이 5줄이

이 화면을 띄우는 코드이다 


그다음인 00401013을 보면 00402094를 스택에 집어넣고있다. 아마 다음함수에서 쓰이는거같다

그다음줄에있는 GetDriveTypeA 함수에 대해 알아보자


디스크의 루트패스를 전달해주면 반환값으로 0,1,DRIVE_REMOVABLE등을 전달해준다.

주석을보면 HDD는 3번이다 


코드를 더 보자면  00401028부터 00401036까지는 CD-ROM이 아닐때 메세지를 띄우는 코드이고


0040103D부터 0040104B까지는 CD-ROM으로 인식했을때 성공 메세지를 띄우는 코드이다.

그다음을 보자


오류 메세지가 출력되면 00401050으로 점프하게 되어있다. 점프하면 프로그램이 끝난다.

0040101D부터 00401026까지가 성공/실패를 결정하는 코드인듯하다.

코드를보자

0040101D  |. 46             INC ESI

0040101E  |. 48             DEC EAX

0040101F  |. EB 00          JMP SHORT abexcm1.00401021

00401021  |> 46             INC ESI

00401022  |. 46             INC ESI

00401023  |. 48             DEC EAX

00401024  |. 3BC6           CMP EAX,ESI

00401026  |. 74 15          JE SHORT abexcm1.0040103D


출처 :  http://zzaps.tistory.com/120

어셈블리를 해석해보자면 

INC는  해당 레지스터의 값을 증가시키는 명령어다

DEC는 감소시키는 명령어이고

JMP는 지정된 주소로 점프한다

CMP는 2개의 값을 비교하는데 다음과 같은 형식이다 


 CMP dest, source

 ZF

CF 

 dest < source

 0

 1

  dest > source

 0

 0

  dest == source

 1

 0

출처: http://zzaps.tistory.com/120

JE는 비교값이 같을 경우 점프한다 즉 ZF=1 이면 점프한다

다 합쳐보자면 

ESI를 증가시키고 EAX를 감소시키고 004021로 점프한다

계속해서 ESI를 2번 증가시키고  EAX를 감소시킨다 그리고 ESI와 EAX를 비교한후 값이 같으면

성공 메세지를 띄우는 0040103D로 점프한다.

이제 코드분석은 그만하고 올리디버거를 사용해보자.

F9를 누르면  프로그램이 실행된다 RUN이다

Ctrl+F2를 눌러 초기상태로가자

F8은 한줄씩 실행이된다

F7은 한줄씩 실행되는건 F8과 같지만 함수를 만나면 함수 내부로 들어간다

다시 초기상태로 가자

F8을 눌러보면 뭔가 레지스터값이 바뀌는것을 볼수있다. 레지스터값은 바뀌면 빨간색으로 표시되어 알아보기 편하다.

성공이 뜨게하려면 어떻게 하면될까

00401026 의 점프문을 조건을 비교하고 점프하는 JE말고 무조건 점프하는 JMP로 바꾸면 될거같다.

00401026으로 가 스페이스바를 누르면 값을 변경할수있는 창이뜬다

 JE를 JMP로 변경해준다 



처음으로 돌아가서 F8로 실행을 시켜주면 



성공이다.

그런데 Abexcm1.exe 파일 자체는 변하지않았다.

흔히말하는 패치를 해보자.

JE를 수정한 상태에서 마우스 우클릭을해  Copy to executable -> All modifications 를 클릭한다.


아래창이 나타나면 Copy all을 선택한다 





이런창이 뜬다. 마우스 우클릭을 눌러 Save file을 눌러서 저장해준다


수정된 패치파일을 실행하면 성공메세지창이 뜬다 


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

어셈블리어 (1)  (0) 2015.07.29