exe 파일을 실행시키면 다음과같이 나온다
코드를 살펴보면 위 에러가 출력되게 하는 메시지 박스와 YEAH! Ok, I really think that your HD is a CD-ROM! :p이 있다. 아마 이 문장이 출력되는 메시지 박스를 띄워야 하는 것 같다.
* MessageBoxA
int MessageBoxA(
HWND hWnd,
LPCSTR lpText,
LPCSTR lpCaption,
UINT uType
);
MessageBoxA(핸들, 내용, 제목, 박스 종류) 함수로 메시지 박스는 총 4개의 인수를 가진다.
* GetDirveType
함수를 호출하기 바로 전에 'c:\\'로 설정했기 때문에 함수에서 반환 값이 3이 되어 고정 미디어라는 것을 알 수 있다.
UINT GetDriveTypeA(
LPCSTR lpRootPathName
);
지정한 디스크가 어떤 형태의 저장소인지 특정 정수 값을 반환해 판단해준다. 아래 표는 특정 정수 값에 대한 설명입니다.
Return code | value | Description |
DRIVE_UNKNOWN | 0 | 드라이브 유형을 확인할 수 없다 |
DRIVE_NO_ROOT_DIR | 1 | 루트 경로가 잘못되었다 (최상위 경로가 없음) |
DRIVE_REMOVABLE | 2 | 드라이브에는 이동식 미디어가 있다 |
DRIVE_FIXED | 3 | 드라이브에는 고정 미디어가 있다 |
DRIVE_REMOTE | 4 | 드라이브는 원격(네트워크)드라이브다 |
DRIVE_CDROM | 5 | 드라이브는 CD-ROM드라이브다 |
DRIVE_RAMDISK | 6 | 드라이브는 RAM디스크다 |
둘 중 문장을 선택하는 건 JE 명령어가 수행하는 것을 볼 수 있다. cmp를 통해 eax와 esi가 같은 지 확인했는데 만약 같다면 점프를 통해 우리가 원하는 문자열을 출력해줄 것이다. 하지만 같지 않다면 아까 처음에 봤던 에러 메시지 박스를 띄운다.
그런데 뭐가 같아야 할지는 잘 모르겠어서 다른 쉬운 방식을 생각해보면 원래 같을 때 점프해 성공한 메시지 박스에 갔다면 반대로 같지 않을 때 점프하도록 만들면 된다. 그 명령어는 je 대신 jne를 쓰면 된다.
그러면 이렇게 성공한 메시지 박스를 볼 수 있다.
< 참고 >
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxa
https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea
'Study > Reversing' 카테고리의 다른 글
[Reversing] PE Header 개념 정리 & wow64 fs redirection (0) | 2020.09.21 |
---|---|
[Reversing] 어셈블리어 C언어로 변환하기 #1 (0) | 2020.09.14 |
[Reversing] x86(32 bit) / x64(64 bit) 호출규약 (0) | 2020.09.14 |
[Reversing] Stack 구조와 Stack Frame (0) | 2020.09.08 |
[Reversing] 32bit 레지스터의 종류와 특징 (0) | 2020.09.07 |
댓글