티스토리 뷰
코드엔진 basic 1. HDD를 CD-ROM으로 인식시키는 GetDriveTypeA의 리턴값이 무엇인지 아는게 문제1의 목적입니다. 먼저 디버거 없이 그냥 열어보니 이런 메세지박스들이 나오는군요. HDD를 CD-ROM으로 인식하지 않고 있습니다. Immunity debugger로 열어보니 이 파일은 이런 형태를 가지고 있습니다. 이 부분은 아까 보았던 이 메시지박스를 출력하는 부분이니 넘어갑니다. 원래 이랬던 레지스터 값이 이 부분을 지나고나서 이렇게 바뀌었습니다. 즉 EAX는 00000003 -> 00000001로 2가 감소됐고 ESI는 00401000 -> 00401003
으로 3이 증가했습니다 cmp는 2 레지스터의 값을 비교해서 값이 같으면 ZF(Zero Flag)를 1로 만듭니다. JE는 ZF가 1이면 점프문을 실행합니다. 여기선 cmp EAX,ESI로 EAX와 ESI의 값을 비교하는데 둘의 값이 00000001과 00401003으로 다릅니다.
즉 둘의 값을 같게 만들어주려면 패치를 진행해야합니다. 이 부분에서 패치를 하는 방법에는
1.EAX 값을 패치한다. 2.ESI 값을 패치한다. 3.어셈블리어(JE)를 패치한다. 로 3가지 방법이 있습니다.'
저는 ESI값을 패치하는 방법을 선택했습니다.
이제 EAX와 ESI값이 모두 00000001로 같으므로
00401028이 아닌 0040103D로 이동해서
HDD를 CD-ROM으로 인식하는 매세지박스를 출력합니다.
사실 이문제는 이 파일과는 연관이 없이 GetDriveTypeA의 리턴값을 아는게 목적이기 때문에
msdn에서 GetDriveTypeA 함수의 드라이브가 CDROM일때의 리턴값을 찾아보면 됩니다.
즉 답은 5입니다.
2번문제로 이동하는 것을 보니 정답이군요.