오늘은 위의 파일을 이용해 실습을 진행해 보겠다.
파일을 실행시키면 다음과 같은 창이 뜬다.
일단 ollydbg로 열어서 파일을 분석해본다.
우선 성공과 실패의 분기점을 찾기 위해 문자열 검색 기능(All referenced text strings)를 사용해 보겠다.
문자열 검색 기능을 통해 성공과 실패의 메시지 박스의 위치를 알아냈다.
메시지 박스가 있는 주소를 확인해보니 4023E4위치의 값을 EBP-D4에 입력하는 명령어가 있다.
혹시 모르니 4023E4 주소로 이동해본다.
놀랍게도 문자열이 모여 저장되어있는 곳을 볼 수 있다.
그렇다면 지난번과 마찬가지로 틀림을 의미하는 문자열을 수정하면 되지 않을까...?
-> 이게 되면 null패딩에 값을 입력하고 전달인자를 수정하는 방법도 되지 않을까?
위치를 찾아 값을 수정한다.
아무 값이나 입력한다.
ㅋㅋㅋ... 되긴 되는데 이건 좀 아닌 거 같다.
다른 방법을 찾아보자!
처음부터 F8 연타를 하면서 분석하는 방법은 이번엔 통하지 않는 거 같다...
계속 시도해 본 결과 잘 모르겠어서 책의 도움을 받았다ㅠ
위 명령어들이 분기문을 포함한 코드라고 한다.
403329 주소의 __vbaVarTstEq() 함수를 호출해서 리턴 값(AX)을 비교(TEST명령)한 후 40332 주소의 조건 분기(JE 명령)에 의해서 참, 거짓 코드로 분기하게 된다.
....TEST랑 JE를 모르고 있었다.
정리하자면
TEST : 논리 비교(Logical Compare) - bit-wise logical 'AND' 연산과 동일(operand 값이 변경되지 않고 EFLAGS 레지스터만 변경됨) 과 두 operand 중에 하나가 0이면 AND 연산 결과는 0 -> ZF = 1 로 세팅됨
JE : 조건 분기(Jump if equal) - ZF = 1 이면 점
가 되겠다.
그럼 이제 403329 주소로 이동해 디버깅을 해보자
처음에 어떻게 403329로 이동할 수 있는지 좀 헤맸다. 403329에 BP를 만들고 실행을 하면 위쪽에서 막혀서 더 이상 내려가지 않았기 때문이다.
답은 간단했다.
프로그램에 아무 값이나 입력해 프로그램을 진행 시키면 되는거였다.
Check 버튼을 누르니
00403329 주소로 이동이 된다.
00403321 주소부터 해석을 해보면
EDX 인자에 EBP-44 주소를 저장시킨다.
EAX 인자에 EBP-34 주소를 저장시킨다.
스택에 EDX 값을 넣는다.
스택에 EAX 값을 넣는다.
403329 주소의 __vbaVarTstEq() 함수를 호출한다.
리턴 값(AX)을 비교(TEST명령)한 후 40332 주소의 조건 분기(JE 명령)에 의해서 참, 거짓 코드로 분기하게 된다.
의 순서로 진행된다.
추측컨데 EDX 인자와 EAX 인자에 저장되어있는 주소를 살펴보면 정답을 찾을 수 있을 것이다.
EAX와 EDX 인자를 확인한다.
EAX와 EDX 인자 주소엔 아무것도 없고 근처에 뭐가 많다.
내가 입력한 값과 정답으로 유추되는 값들이 분포되어 있다.
AC 아래에 CAD7C5C8이 있고 BC 아래에 내가 입력한 값이 있다.
CAD7C5C8이 정답이 아닐까?
한번 입력해 본다.
로 입력하고 진행한다.
틀렸단다....
이유가 뭘까 고민을 해봤다. 혹시 시리얼키 라는게 입력한 이름에 대해 어떤 계산과정을 거쳐 나오는 값이라고
가정을 해보았다.
이렇게 입력을 해서 실행해본다.
추측이 맞는 거 같다!! 정상적으로 크랙이 되었다.
'컴퓨터와 보안 > 리버싱' 카테고리의 다른 글
함수 호출 규약(Calling Convention) (0) | 2021.04.17 |
---|---|
Lena's Reversing for Newbies (0) | 2021.04.15 |
abex' crackme #1 분석 (0) | 2021.04.06 |
프로세스 메모리 구조와 스택 프레임 구조 (1) | 2021.04.04 |
어셈블리어와 레지스터 (0) | 2021.04.04 |