kaka09
Reversing.kr Easy_CrackMe Write Up 본문
[사진]1-1
정확한 키(시리얼)을 찾아야 하는 문제임을 알 수있다. Ollydbg를 이용하여 해당 파일을 디스어셈블 후 문자열을 찾아보자
[사진]1-2
문자열을 살펴본 결과 Congratulation 과 Incorrect Password가 존재하는것을 알 수 있는데 이는 분기문을 통해 출력될 메세지를 지정하는 구조라고 할 수있다. 일단 Congaratulation이라는 문자열이 PUSH되는 지점으로 가서 코드를 살펴보자
[사진]1-3
사진을 보면 조건문을 통해 00401135로 분기를 할지 말지를 정하는것을 알 수 있다. 정확한 키값을 역추적하기 위해 코드를 살펴본 결과 다음 4개의 조건문과 반복문, 서브루틴에서 키값을 검증하는것을 알아내었다.
1. 004010B0 |. 807C24 05 61 CMP BYTE PTR SS:[ESP+5],61
2. 004010C3 |. E8 88000000 CALL Easy_Cra.00401150
3. 004010DA |> /8A10 /MOV DL,BYTE PTR DS:[EAX] ~~~ 004010FC |.^\75DC\ JNZ SHORT Easy_Cra.004010DA (반복루틴)
4. 0040110D |. 807C24 04 45 CMP BYTE PTR SS:[ESP+4],45
우선 1번 조건문은 입력한 key값의 두번째가 "a"임을 묻는 조건문이다. 만약 "a"가 아니면 "incorrect Password"를 출력하는 메세지박스 쪽으로 분기한다. [esp+5] 주소에 내가 입력한 키값이 들어가 있다.
[사진]1-4
[사진]1-4 에서 보여지는 스택은 1번 조건문에 브레이크 포인트가 걸려있는 시점의 스택구조이다. 즉 esp가 0019f58이면 esp+5는 0019f5d가 된다. 따라서 입력값의 2번째 자리가 해당 시점에서는 [esp+5]임을 알 수 있다.
2번에서 사용된 서브루틴은 key값의 3번째 자리가 "5" 인지 4번째 자리가 "y"인지 검증하는 로직이 존재한다.
[사진]1-5
0040116F 주소를 살펴보면 ESI와 EDI 각각 1BYTE씩 비교하는것을 알 수 있다. 여기서 사용자 입력값은 EDI에 저장된다. 문제는 5를 입력해야하지만 몇번째 자리에 입력해야 하는것이다. 따라서 다음 사진을 참고하자
[사진]1-6
0019F95C 영역에 내가 입력한 값이 들어가 있다. [사진]1-5의 조건문에서는 0019F95E에서 1BYTE 부분만 비교한다. 시작지점이 0019F95C라면 0019F95E는 3번째 자리임을 알 수있다(리틀 엔디안 방식). 따라서 3번째 값에는 "5"가 와야한다.
[사진]1-7
다음 조건문은 0019F95F에 있는 값이 "y"인지 비교하는 조건문이다. 위에서 0019F95E가 3번째 자리임을 알았으니 F는 4번째 자리임을 알 수있다. 따라서 4번째 자리에는 "y"가 와야한다.
[사진]1-8
해당루프는 입력한 키값 "xa5y" 4자리를 제외한 5자리부터 입력의 끝까지 반복을 돌면서 "R3versing" 이라는 문자열과 한글자씩 비교를 하는 루프문이다. 따라서 입력값의 5자리부터 R3versing을 입력해야한다.
[사진]1-9
마지막 조건문은 입력값의 첫번째 자리가 'E"인지 비교한다. 따라서 각각의 루틴을 통해 도출된 키값을 조합하면 다음과 같다.
"Ea5yR3versing" 프로그램을 실행시켜 저 문자열을 입력해보자
[사진]1-10
'Reversing' 카테고리의 다른 글
Reversing.kr Easy_UnpackMe Write up (0) | 2017.11.02 |
---|---|
Reversing.kr Easy_Keygen Write Up (0) | 2017.11.01 |
code engn basic 18 (0) | 2017.08.03 |
code engn basic 17 (0) | 2017.08.02 |
code engn basic 16 (0) | 2017.08.02 |