2023-02-02에 쓸 예정
CodeEngn Challenge 링크 https://ch.codeengn.com/
정답인증은 OEP + Serial
Ex) 00400000PASSWORD
Author: Raz0r
File Password: codeengn
동영상: https://www.youtube.com/watch?v=suP65mzgVeA
상세설명
이번에는 XP환경 구축 및 Visual Studio 설치를 해 똑같이 만들어볼 계획입니다.
하지만 없을 수도 있고 사실상 가장 중요하다고 생각하는 건 코드의 이해라 생각하기 때문에
Visual Studio 2022로 따라하고 XP는 2에서 다루도록하겠습니다.(영상은 둘다 함)
https://www.vmware.com/kr/products/workstation-pro/workstation-pro-evaluation.html
https://gist.github.com/PurpleVibe32/30a802c3c8ec902e1487024cdea26251
vmware Workstation Pro 17 시리얼
MC60H-DWHD5-H80U9-6V85M-8280D < worked for me! | |
4A4RR-813DK-M81A9-4U35H-06KND | |
NZ4RR-FTK5H-H81C1-Q30QH-1V2LA | |
JU090-6039P-08409-8J0QH-2YR7F | |
4Y09U-AJK97-089Z0-A3054-83KLA | |
4C21U-2KK9Q-M8130-4V2QH-CF810 |
설치는 영상을 참고해주시고 참고로 윈도우 SP3 한국버전은 검색해서 알아서 구해주시길바랍니다.
하지만 밑에 제가구한 링크는 남겨두죠
https://m.blog.naver.com/appleheart/221732165448
설치는 영상을 참고해주세요.
이 3개의 함수들을 윈도우 프로그래밍으로 구현해볼거다.
Visual Studio로 빈프로젝트로 만듭니다.
소스코드와 해더파일을 위에 완성된 프로젝트를 참고해서 가져옵니다.
저희는 소스코드 해석을 조금 더 중점적으로 보죠(만드는 과정이 궁금하면 영상 ㄱㄱ)
위에 전처리부터 봅시다.(전처리는 #include등 #으로 이해하면 편합니다.)
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers // Windows Header Files #include <windows.h> // C RunTime Header Files\ //resource only #include "main.h"
#define WIN32_LEAN_AND_MEAN는 왜 사용하는가? 속도때문이라 하지만 확실하지는 않다.(인터넷)
#include <windows.h>는 윈도우API등 윈도우 함수(MessageBoxA)등을 위해 필요하다.
#include "main.h"는 나중에 resource를 추가하기위한 용도다.
INT_PTR WINAPI DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { //IDD_DIALOG1 = 101 //IDI_ICON1 = 1 //ICON GROUP은 생성방법 몰라서 패스 DialogBoxParamA(hInstance, MAKEINTRESOURCEA(IDD_DIALOG1), NULL, DlgProc, 0); LoadIconA(hInstance, MAKEINTRESOURCEA(IDI_ICON1)); return 0; }
INT_PTR WINAPI DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);는 C언어 문법인 함수 프로토타입으로 위에 먼저 선언하지 않으면 인식 못하는 C언어의 특성상 했다.
wWinMain 윈도우 메인 함수다.
//IDD_DIALOG1 = 101
//IDI_ICON1 = 1
//ICON GROUP은 생성방법 몰라서 패스
DialogBoxParamA(hInstance, MAKEINTRESOURCEA(IDD_DIALOG1), NULL, DlgProc, 0);
LoadIconA(hInstance, MAKEINTRESOURCEA(IDI_ICON1));
return 0;
위에 주석은 해당 define 값을 의미한다. 윈도우 프로그래밍에서 리소스를 넣을 수 있는데 그걸 IDD_DIALOG1처럼 관리하고 본질은 ID로 숫자(int)다.
DialogBoxAParamA함수로 대화상자를 생성하고 LoadIcon으로 아이콘을 불러온다.
HWND hWnd; const char Str1[] = "AD46DFS547"; char Str2[100]; int sub_401030() { GetDlgItemTextA(hWnd, 1000, Str2, 100); if (!strcmp(Str1, Str2)) MessageBoxA(hWnd, "You got it ;)", "Good Job!", 0x40u); else MessageBoxA(hWnd, "Wrong serial!!!", "ERROR", 0x10u); return 0; } INT_PTR WINAPI DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CLOSE: EndDialog(hwnd, 0); return 1; case WM_INITDIALOG: hWnd = hwnd; return 1; case WM_COMMAND: switch (wParam) { case IDD_DIALOG1_Button_CheckSerial: sub_401030(); return TRUE; } break; } return FALSE; }
HWND hWnd;
const char Str1[] = "AD46DFS547";
char Str2[100];
hwnd는 밑에 대화상자 생성시 대화상자 핸들을 가져오기위한거다.
(가져오면 GetDlgItemTextA로 문자를 가져올 수 있다.)
위에 것들은 전역 변수들로 Str1은 시리얼 값이다.
Str2는 GetDlgItemTextA로 문자를 가져올때 저장하는 변수다.
int sub_401030() 함수는
GetDlgItemTextA(hWnd, 1000, Str2, 100);로 우리가 입력한 문자를 Str2로 복사한다.
if (!strcmp(Str1, Str2))는 두문자 가 같은 경우
MessageBoxA(hWnd, "You got it ;)", "Good Job!", 0x40u);로
위에처럼 메시지 박스를 출력한다.
else 두 문자가 같지않은 경우
MessageBoxA(hWnd, "Wrong serial!!!", "ERROR", 0x10u);
위에처럼 Wrong Serial 메시지박스를 출력한다.
return 0;
위에 return 0;로 sub_401030를 호출한 함수로 돌아간다.
}
INT_PTR WINAPI DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
위에 인자를 보면 hwnd(윈도우 핸들-> 대충 윈도우 다루기위해 필요한 값들이라 생각하면 됩니다.)
uMsg(대화상자에서 오는 메시지(이벤트)들이라 보면 됨(종료, 버튼 입력등)
wParam및 wParam
https://devblogs.microsoft.com/oldnewthing/20031125-00/?p=41713
위에걸 참고해서(구글 번역)
옛날 옛적에 Windows는 16비트였습니다. 각 메시지는 WPARAM 및 LPARAM이라는 두 가지 데이터를 전달할 수 있습니다. 첫 번째는 16비트 값("워드")이므로 W라고 합니다. 두 번째는 32비트 값("롱")이므로 L이라고 합니다. W 매개 변수를 사용하여 전달했습니다. 핸들과 정수처럼. L 매개변수를 사용하여 포인터를 전달했습니다. Windows가 32비트로 변환되었을 때 WPARAM 매개변수도 32비트 값으로 증가했습니다. 따라서 "W"는 "단어"를 나타내지만 더 이상 단어가 아닙니다. (그리고 64비트 Windows에서는 두 매개변수 모두 64비트 값입니다!) 용어의 기원을 이해하는 것이 도움이 됩니다. 창 메시지의 디자인을 보면 메시지가 포인터를 사용하는 경우 포인터는 일반적으로 LPARAM으로 전달되는 반면 메시지가 핸들이나 정수를 사용하면 WPARAM으로 전달되는 것을 볼 수 있습니다. (그리고 메시지가 둘 다 사용하는 경우 정수는 WPARAM에 들어가고 포인터는 LPARAM에 들어갑니다.) 일단 이것을 배우면 창 메시지에 대한 매개변수를 좀 더 쉽게 기억할 수 있습니다. 반대로, 어떤 메시지가 이 규칙을 어기면 뇌가 "아니, 그건 옳지 않아"라고 말하게 만듭니다.
{
switch (uMsg) {
메세지를 switch한다.
case WM_CLOSE: // 값이 16이다. 닫기키를 누르시 전해지는 메시지
EndDialog(hwnd, 0); //대화상자를 종료한다.
return 1;
case WM_INITDIALOG: //값이 227이다. 대화상자 실행시 주는 메시지
hWnd = hwnd; //여기서 핸들을 넘긴다.
return 1;
case WM_COMMAND://값이 273이다.
switch (wParam) {
case IDD_DIALOG1_Button_CheckSerial://버튼의 id가 1001이다
확인 방법은 Resource Hacker로 입력한 리소스를 볼 수 있다.
sub_401030(); // 그러므로 이 함수는 Serial Check버튼이 눌렀을 떄 호출된다.
return TRUE;
}
break;
}
return FALSE;
}
위에걸 통해 내가 알려주고자 한 이미지는 밑에 넣어두겠다.
위에 알수없는 값들이 나올때 그것들이 설정값일 수 있다.
이러한 사실을 알고 앞으로 저런 값이 나오면 분석을 잘하길 바란다.(핵심)
리소스 해커를 이용하여 리소스를 볼 수 있다. Check Serial의 값이 1001인걸 확인할 수 있다.
리소스를 따라만드는건 영상을 참고하길바란다. 조금 더 자세한건 2편에 더 자세히 나온다.
https://dhhd-goldmilk777.tistory.com/246
- #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
- // Windows Header Files
- #include <windows.h>
- // C RunTime Header Files\\cf2
- //resource only
- #include "main.h"
- #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
- // Windows Header Files
- #include <windows.h>
- // C RunTime Header Files\\cf2
- //resource only
- #include "main.h"
'코드엔진 Basic RCE L' 카테고리의 다른 글
코드엔진 Basic RCE L06 번외풀이2 (0) | 2023.02.02 |
---|---|
코드엔진 Basic RCE L06 풀이 (0) | 2023.02.02 |
코드엔진 Basic RCE L05 풀이 (2) | 2023.02.02 |
코드엔진 Basic RCE L04 번외풀이 (0) | 2023.01.31 |
코드엔진 Basic RCE L04 풀이 (0) | 2023.01.31 |