CrackMe02 에서 VB 덕분에 좌절을 맛보고

앞으로 어떻게 하지 하다가 그냥 계속 풀어보기로 했습니다..

다행히 03은 01과 구성이 비슷해서 손 쉽게 풀어볼 수 있었내요

 

 

먼저 심플스에서 요구한 문제는 아래와 같내요 

키파일의 사이즈는 몇 바이트인가

일단 실행을 해보겠습니다.

      

메시지 창이 두 번 뜨더니 그냥 끝이 나는 프로그램이내요.

첫 번째 메시지는 .. 확인 버튼을 누르면 키파일을 체크한다는 것 같내요

확인을 눌렀을 때 나오는 두 번째 메시지는 찾은 파일이 유효한 키파일이 아니라는거 같내요

 

실행시켰을 때 사용자가 마땅히 더 할게 없어보이니 바로 올리디버거로 까(?)보겠습니다.

까보면 01 때 처럼 눈에 확 들어오는 영단어들이 많이 보입니다. 마음이 편하죠..

까보면 01 때 봤던 MessageBoxA가 보이내요

첫 번째 메시지를 띄울 때 사용된 것 같습니다.

이 API는 특별히 설명할게 없으니 넘어가겠습니다.

그 다음 아래로 내려오면 CreateFileA 라는 API가 보입니다.

MSDN 공식홈에 있는 것 중에 필요 할 것 같은 것을 캡쳐해왔내요

 

대충 보면 이 API는 어떠한 파일을 오픈하거나 새로만드는 듯하내요

MSDN 내용을 보다보니 OPEN_EXISTING 에 대한 설명이 있는데요

올리디버거의 API부분을 잘 보면 OPEN_EXISTING이라고 써져있는 곳이 있습니다.

아무래도 MSDN에서 가져온 부분은 이 API가 사용하는 모드에 대한 내용인 것 같내요

그렇다면 문제에서는 이 API의 OPEN_EXISTING 모드를 사용하고 있다는걸 알게 됬내요

대략 모드 내용을 보면 파일이나 장치가 '있다면' 오픈을 하는 것 같습니다.

캡쳐화면을 보면 모드 이름 밑에 숫자가 써있는데 아마 해당 모드에 대한 번호인 것 같습니다.

그런데 올리디버거를 잘 보면 Mode = OPEN_EXISTING라고 써있는 줄에

PUSH 3 이라고 써져있습니다.

MSDN 설명상에 OPEN_EXISTING의 모드 번호도 3번이구요

뭔가 서로 연관되어있다는 것 같다라고 생각하고 넘어가겠습니다.

내려오다보면 getfilesize라는 API가 사용되고 있는 걸 볼 수 있는대요

MSDN에서 보면 특정 파일의 크기를 byte단위로 알려주는 API인 것 같내요.

아마 CreateFile API로 생성된 파일의 크기를 알기 위해서 사용하는 것 같습니다.

그 후론 MessageBox만 나오내요.

 

이제 어셈블리어 부분을 볼껀데요

개인적인 생각으로 초반 크랙미 풀이의 핵심은 어셈블리어쪽에 있는 비교하는 부분이나

점프만 잘 봐도 손 쉽게 풀 수 있을 것 같내요

이 문제에서 바로 찾을 수 있는 비교하는 곳에는 CMP가 사용되고 있는대요

CreateFile API 바로 아래 부분과 getfilesize API 아래 부분에서 사용되고 있내요

 

 

먼저 CreateFile API 밑에 있는 CMP를 보면 EAX의 값과 -1을 비교하고 있습니다.

바로 아래는 JE가 사용되어 두 값이 같다면 00401075로 이동하게 되어있내요

실제로 이 문제파일을 아무 작업없이 그냥 실행을 하면 EAX에는 -1 값이 들어가게 됩니다.

 

 

아무 작업을 하지 않고 실행했을 때 EAX의 모습입니다.

보면 EAX에 FFFF FFFF가 들어가있는걸 볼 수 있는데 이 값은 Hex 값이고 이 값을

10진수로 바꿔보면 -1이라는 것을 알 수 있습니다.

그럼 CMP의 결과는 두 값이 같다고 나오고 JE는 두 값이 같기 때문에 실행이 되겠죠

JE가 실행이 안되야 원하는 메시지 창이 출력될텐데 말이죠

그럼 우선 이 CMP가 참이 되지않도록 CreateFile 실행 이후 EAX의 값이 -1이 되면 안된다는 걸 알았습니다.

EAX는 함수나 연산 후 값이 저장되는 곳이니 아마 -1이라는 값은 CreateFile API의 리턴값이라는 걸 알 수 있습니다.

현 상태에서 CreateFile API는 모드3번, 그러니까 OPEN_EXISTING을 사용하는데

이 모드는 위에 써놨듯이 파일이나 장치가 존재해야만이 정상작동을 합니다.

근데 지금 상태에는 이 문제에서 사용할 파일이 존재하지 않죠.

CreateFile API 부분을 잘 보면 친절하게도 FileName=abex.l2c라고 파일명을 알려주고 있내요.

이 파일명을 가진 파일을 크랙미 문제 파일과 같은 경로에 메모장이나 여러방법으로 생성해주면 되겠내요.

그러면 첫 번째 CMP부분을 지나갈 수 있습니다.

하지만 제가 여기서 궁금했던건 위에 언급했던 PUSH 3에 대한 것이었습니다.

3번 모드인 OPEN_EXISTING이 설정되는 부분에서 스택에 3이라는 값을 넣는다는건 왠지 3번 모드를 사용하겠다고

설정한걸 스택에 저장해두려는 것 같았거든요.

그래서 혹시나하고 다른 숫자를 넣어보기로 해봤습니다.

MSDN에 있는걸 참고해서 OPEN_ALWAYS의 번호인 4를 넣어보기로 했습니다.

이 모드는 파일일이 있다면 덮어쓰고 없으면 새로 생성하는 모드인 것 같더라구요

 

 

기존 PUSH 3을 PUSH 4로 바꿔서 실행시켜 봅니다. 

 

 

그러면 아까와는 다르게 EAX에 FFFF FFFF가 아닌 0000 01D4라는 값이 들어갔습니다.

그리고 잘 보면 그 값이 바로 아래 GetFileSize API 안에 들어가는 걸 볼 수 있는대요

 

아무래도 CreateFile로 생성된 파일과 관련된 어떠한 주소가 아닌가 싶습니다.

어쨌든 PUSH 3 부분의 값을 MSDN에서 알려주고 있는 다른 숫자로 바꿔도 작동 하는걸로 봐서

이 PUSH 부분이 CreateFile의 설정(다르게는 옵션?)을 스택에 밀어넣고 있는 것 같내요

 

abex.l2c 라는 파일을 직접 생성했든, 저 처럼 모드를 바꿔서 생성했든

이제 문제 파일과 같은 경로에 abex.l2c 라는 파일이 생성되어있는걸 볼 수 있습니다.

그럼 이제 더이상 CMP EAX, -1은 신경쓰지 않아도 되겠내요

여기서 끝이라면 좋겠지만 ... 일단 그냥 실행시켜 보겠습니다.

 

 

간단하게 이 파일이.. 아니라내요

해서 다시 한 번 올리디버거를 보면 GetFileSize API가 실행된 직 후 다시 한 번 더 CMP가 나옵니다.

 

 

보면 CMP EAX, 12 라고 되어있는데요

API 실행 직 후니까 EAX에는 아마도 실행됬던 GetFileSize의 반환값이 저장되어있겠내요

그럼 이 API의 반환값은 Byte 단위니까 파일 크기가 12Byte면 되겠내요

라고 생각하고 처음에 했다가 안되서 뭔지 모르고 헤맸었내요.

CMP EAX, 12에 써있는 이 '12'는 흔히 알고 있는 10진수의 숫자가 아니라 16진수로 써있던거였내요

16진수로 '12'는 10진수의 '18'에 해당하니 이 CMP에서 비교하는 걸 10진수로 쓰자면

CMP EAX, 18(10)이 되겠내요

그럼 위에 말햇던걸 다시 말하면 파일의 크기가 12바이트가 아닌 18바이트여야 된다는 말이되죠

abex.l2c 파일을 열어서 18바이트를 만들어줍니다.

 

 

간단하게 123456789012345678 이라는 값을 넣고 저장을 했습니다.

이렇게 파일의 크기를 변경시킨 뒤 문제 파일을 실행시켜보면 ...

 

 

키파일을 제대로 찾았다고 메시지창이 뜨는걸 확인 할 수 있습니다.

그러면 심플스에서 출제한 문제의 답은 18Byte가 되겠내요

이렇게 이 문제는 끝입니다.

 

 

업무하면서 틈틈히 포스팅을 하려고하니 이 문제를 푼지 벌써 10일이 지났내요

최초 작성 날짜가 5월 16일인거 보니 ..

그 사이 크랙미를 9번까지 풀었습니다. (18번까진가 있던데 언제 다풀지..)

속도가 더디긴해도 한 문제 한 문제 포스팅할 예정입니다.

확실히 그냥 혼자 풀면 빠르긴한데 이렇게 글로 쓰니 좀 더 자세히 들여다볼 수 있으니 좋내요

다만 확실히 첫 번째 문제 풀 때 보다는 이해하고 설명할게 상대적으로 줄었다보니

분량은 적어졌내요 ~ 기억에 4번 문제가 VB이었던거 같은데 ..

제대로 포스팅할 수 있을지 모르겠내요 ..

어쨌든

끝.

' 2016년 이전 > CrackMe' 카테고리의 다른 글

abex CrackMe L02  (0) 2014.05.15
abex CrackMe L01  (2) 2014.05.07

+ Recent posts