코드엔진 Basic RCE L

코드엔진 Basic RCE L06 번외풀이1

Lamed_Dhhd 2023. 2. 2. 00:34
반응형

2023-02-02에 쓸 예정

CodeEngn Challenge 링크 https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 세미나, 워크숍을 현업 실무자들과 함께 운영하고 있는 비영리 커뮤니티입니다.

ch.codeengn.com

Basic RCE L06
Unpack을 한 후 Serial을 찾으시오.
정답인증은 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

 

Download VMware Workstation Pro

VMware Workstation Pro is the industry standard desktop hypervisor for running virtual machines on Linux or Windows PCs. Discover why.

www.vmware.com

https://gist.github.com/PurpleVibe32/30a802c3c8ec902e1487024cdea26251

 

Free VMware Workstation Pro 17 full license keys

Free VMware Workstation Pro 17 full license keys. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

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

 

Windows XP Professional SP3

Windows XP Professional SP3 한글 윈도우XP 프로패셔날 서비스팩3 입니다. 테스트 해볼게 있어서 ...

blog.naver.com

설치는 영상을 참고해주세요.

이 3개의 함수들을 윈도우 프로그래밍으로 구현해볼거다.

Visual Studio로 빈프로젝트로 만듭니다.

06.zip
0.01MB

소스코드와 해더파일을 위에 완성된 프로젝트를 참고해서 가져옵니다.

저희는 소스코드 해석을 조금 더 중점적으로 보죠(만드는 과정이 궁금하면 영상 ㄱㄱ)

위에 전처리부터 봅시다.(전처리는 #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

 

What do the letters W and L stand for in WPARAM and LPARAM?

Once upon a time, Windows was 16-bit. Thus begins the story of where the letters came from.

devblogs.microsoft.com

위에걸 참고해서(구글 번역)

옛날 옛적에 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

 

코드엔진 Basic RCE L06 번외풀이2

2023-02-02에 쓸 예정 CodeEngn Challenge 링크 https://ch.codeengn.com/ CodeEngn.com [코드엔진] 코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 세미나, 워크숍을

dhhd-goldmilk777.tistory.com

Code Snippet
  1. #define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
  2. // Windows Header Files
  3. #include <windows.h>
  4. // C RunTime Header Files\\cf2
  5. //resource only
  6. #include "main.h"

 

Code Snippet
  1. #define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
  2. // Windows Header Files
  3. #include <windows.h>
  4. // C RunTime Header Files\\cf2
  5. //resource only
  6. #include "main.h"
반응형