[Reversing] 리버싱 핵심원리 [5-2].abex' crackme1.exe 풀이 2
내용 : 다양한 풀이 방법을 소개한다.
1. EAX / ESI 레지스터 조작.
코드를 따라가다보면 EAX와 ESI를 비교하는 구문이 나오고
CMP EAX,ESI ;00401024
바로 그 아래줄에
JE SHORT 0040103D
으로 위의 비교 결과가 같으면 0040103D로 점프해라! 라는 명령구문이 있다.
0040103D를 보면 성공 MessageBox가 출력되는것으로 보아 EAX와 ESI가 같아야 한다는 것을 알 수 있다.
여기서 2가지 방법으로 풀이할 수 있는데 첫번째는 비교하는 메모리주소에 브레이크 포인트를 걸어주고 F9를 이용하여 실행해준 후, 오른쪽 레지스터 영역에서 EAX 또는 ESI를 더블클릭 후 직접 값 조작을 하면 된다.
위 그림에선 ESI를 조작하였다.
2. 비교 연산자 구문 바꿔주기
아래 JE 로 비교하는 부분이 있는데 이를 JNE로 수정해주는 방법이다.
이렇게 되면 값이 다르면 정답 로직으로 점프하는 구문으로 바뀌게 된다.
3. 모든 로직이 정답 구문으로 가도록 조작!
GetDriveTypeA API 호출이 끝나게 되면, 비교를위해 00401021로 JMP 하라는 메모리 번지로 가게 된다.
이때 비교하는 구문을 건너뛰고, 바로 정답을 뿜어내게 하는 메모리 주소로 점프하도록 하면 된다.
4. API 후킹? / API에서 리턴 값을 조작하기
말 그대로 API에서 리턴 하는 값을 바꿔주어 CD-ROM인척 하려 했다.
GetDriveTypeA 내부에서 밖으로 리턴하는 값은 3으로, DRIVE_FIXED이다.
이를 5로 바꿔주게 되면 DRIVE_CDROM으로 인식 시킬수 있어 시도해봤지만 아직까진 시기상조인듯하다..