안녕하세요. 이번에 풀어볼 문제는 Basic Malware RE 입니다.
https://tryhackme.com/room/basicmalwarere
TryHackMe | Cyber Security Training
TryHackMe is a free online platform for learning cyber security, using hands-on exercises and labs, all through your browser!
tryhackme.com
문제 1. This executable prints an MD5 Hash on the screen when executed. Can you grab the exact flag?
목표 : strings1.exe_ 실행 파일이 출력하는 MD5 해시의 원본 문자열 플래그를 찾는 것입니다.
Ghidra를 이용해 analyze 시작
Ghidra를 이용해 reverse engineering을 할 때는 entry 함수를 처음으로 분석하면서 프로그램의 실행 과정을 추적해나가시면 됩니다.
entry 함수는 프로그램이 실행될 때 가장 먼저 호출되는 초기 함수를 의미합니다.
프로그램이 시작할 때 main 함수로 바로 가는 것이 아니라, runtime 초기화 과정을 거친 후 main 함수를 호출하게 됩니다.
따라서 entry 함수에서는 필요한 라이브러리를 load하고 global 변수들을 초기화 하는 작업이 수행됩니다.
따라서 Ghidra에 Symbol Tree에서 Functions의 entry에 집중해봅시다.
lpText = md5_hash(PTR_s_FLAG{);
해당 함수를 보면 md5_hash를 통해 parameter의 내용을 해싱하게 됩니다.
따라서 해당 parameter가 challenge 1의 flag가 됩니다.
문제 2. This executable prints an MD5 Hash on the screen when executed. Can you grab the exact flag?
목표 : strings2.exe_ 실행 파일이 출력하는 MD5 해시의 원본 문자열 플래그를 찾는 것입니다.
문제 1과 마찬가지로 entry 함수부터 시작합니다.
여기서 decompile된 코드중 집중해서 봐야 할 내용은
char local_2c;
local_2c = 'F';
char *local_8;
local_8 = md5_hash(&local_2c);
이러합니다.
char *local_8; 을 클릭하면
위 사진과 같이 local_8이 문자형 포인터 변수로 004022b0 PUSH EBP를 가르키고 있습니다.
여기서 EBP는 stack frame의 시작점을 가르킴 이후 MOV를 이용해 포인터를 옮겨가며 순차적으로 데이터를 저장해 나가고 있습니다.
이는 stack 의 형태입니다.
그렇게 local_2c 부터 local_9까지의 문자열을 stack에 push하여 문자를 저장하게 되고
이후 위 사진과 같이 local_8 =. md5_hash(&local_2c); 와 같이 local_2c의 메모리 주소에서 시작하는 문자열을 md5_hash를 통해 해싱하게 됩니다.
따라서 local_2c 부터 local_9까지의 값을 cyberChef를 통해 16진수를 변환하게 되면 challenge 2의 flag가 됩니다.
*여기서 중요한 사실은 *local_8이 가르키는 곳(stack 시작 지점)부터 local_2c를 push하며 저장을 함. 허나, &local_2c의 주소부터 순차적으로 불러오니 stack의 특징인 Last In First Out은 고려할 이유가 없음)
문제 3. This executable prints an MD5 Hash on the screen when executed. Can you grab the exact flag?
목표 : strings3.exe_ 실행 파일이 출력하는 MD5 해시의 원본 문자열 플래그를 찾는 것입니다.
문제 1,2와 마찬가지로 entry 함수부터 시작합니다.
entry함수를 클릭하여 Decompile 내용을 보시면 LoadStringA라는 외부 함수가 보입니다.
LoadStringA라는 함수를 클릭하게 되면 이는 User32라이브러리에서 가져온 것을 알 수 있습니다.
또한 해당 함수에 대한 작동 과정을 볼 수 있습니다.
LoadStringA는 Windows API에서 제공하는 함수로, 리소스 파일 내에 정의된 문자열을 로드하는 데 사용됩니다. 이 함수는 주로 애플리케이션의 리소스 파일에 포함된 문자열을 가져오는 데 사용됩니다.
int LoadStringA(
HINSTANCE hInstance, // 리소스의 인스턴스 핸들
UINT uID, // 문자열 리소스의 ID
LPSTR lpBuffer, // 문자열이 로드될 버퍼
int nBufferMax // 버퍼의 최대 크기
);
결론적으로 LoadStringA는 0x110 문자열을 로드해서 &local_4a4에 저장합니다.
이후 해당 함수에서 Call을 클릭하여 함수 호출 결과를 보면
이러한 Flag들이 있는 문자열들이 나옵니다.
여기서 우리는 LoadStringA가 0x110 문자열을 로드한다는 사실을 알고 있습니다.
0x110의 경우 decompile창에서 0x110을 마우스 포인터로 가리키면 이를 demical된 수가 272임을 알 수 있습니다.
따라서 문자열의 ID가 272인 것이 정답이 되는 flag가 됩니다.
'보안 프로젝트' 카테고리의 다른 글
[TryHackMe] The Blob Blog 문제풀이 -- 중 kali linux 고장남 (0) | 2025.02.05 |
---|---|
[TryHackMe] CyberLens 문제풀이 (0) | 2025.01.25 |
[TryHackMe] Light 문제풀이 (0) | 2025.01.21 |
[TryHackMe] Silver Platter 문제풀이 (0) | 2025.01.16 |
[TryHackMe] Enumeration & Brute Force 문제풀이 (0) | 2025.01.13 |