[풀이 방법 1] - 야매
- 같은 메세지 박스에서 메시지를 불러오는 명령행 확인.
- 복사해서,
- 붙여넣기,
- 진짜 엄청난 꼼수였지만 성공.
[풀이 방법 2] - 정석
- 엔트리 포인트를 확인하고 F8을 눌러 GetDriveTypeA 전까지 실행시켜보자.
- 코드가 실행되면서 우측 레지스터 값이 바뀌는 걸 알 수 있다.
- call <jmp.&KERNEL32.GetDriveTypeA> 를 실행시켰더니 EAX가 3으로 설정된다.
해당 함수의 return 값은 위와 같다. 3은 flash drive거나 hard disk drive라는 뜻이다. 우리가 띄우고자 하는 메시지 박스는 드라이브가 CD-ROM일 때 실행되므로 리턴값을 5로 바꿔주면 된다.
EAX 3 ESI 401000
//F8 - INC ESI
EAX 3 ESI 401001
//F8 - DEC EAX
EAX 2 ESI 401001
//F8 - JMP 401021
EAX 2 ESI 401001
//F8 - INC ESI
EAX 2 ESI 401002
//F8 - INC ESI
EAX 2 ESI 401003
//F8 - DEX EAX
EAX 1 ESI 401003
이 다음의 401024에서 CMP EAX, ESI 명령을 수행하는데,
EAX, ESI 두 값이 동일하면 401026에서 40103D로 이동하는 것으로 추측된다.
ESI 값은 수정하지 않는 상태에서, GetDriveType 함수의 CD-ROM 리턴 값 5를 EAX에 대입한다면...
EAX 5 ESI 401000
//F8 - INC ESI
EAX 5 ESI 401001
//F8 - DEC EAX
EAX 4 ESI 401001
//F8 - JMP 401021
EAX 4 ESI 401001
//F8 - INC ESI
EAX 4 ESI 401002
//F8 - INC ESI
EAX 4 ESI 401003
//F8 - DEX EAX
EAX 3 ESI 401003
CMP EAX, ESI에서 EAX(3) ESI(401003)이 된다.
이를 통해 ESI 값을 0으로 수정할 경우 EAX(3), ESI(3)으로 결과값이 같아진다는 것을 알 수 있다.
EAX 5 ESI 0
//F8 - INC ESI
EAX 5 ESI 1
//F8 - DEC EAX
EAX 4 ESI 1
//F8 - JMP 401021
EAX 4 ESI 1
//F8 - INC ESI
EAX 4 ESI 2
//F8 - INC ESI
EAX 4 ESI 3
//F8 - DEX EAX
EAX 3 ESI 3
이제 레지스터의 ESI 값과 GetDriveTypeA에 들어가는 인자를 변경해 리턴 값을 5로 만들어보자.
- 수정하고자 하는 부분을 선택하고 Binary edit(Ctrl+E)하면 수정 가능하다.
- 레지스터에서도 수정하고자 하는 부분을 더블클릭하면 수정 가능하다.
- 성공적으로 원하는 메시지 박스를 띄워냈다.
'System & Reversing > 실습' 카테고리의 다른 글
[CrackMe#4] test.exe 루틴 분석 및 풀이 (0) | 2023.03.31 |
---|---|
[CrackMe#3] CrackMe3.exe 루틴 분석 및 풀이 (0) | 2023.03.27 |
[Crackme#2] CrackMe2.exe 루틴 분석 및 풀이 (1) | 2023.03.19 |