발자취

악성코드 Pre-Lab5. 계산기 후킹 본문

3-2/악성코드

악성코드 Pre-Lab5. 계산기 후킹

해린 2024. 1. 9. 02:06

본 실습은 리버싱 핵심원리 교재의 32장에 해당하는 실습이다.

 

1. 인젝션 실습

사용코드는 다음과 같다.

https://github.com/reversecore/book

(소스코드\04_API_Hooking\32_계산기_한글을_배우다)

 

본 실습에서 사용하는 계산기는 Windows 7용이므로, 다운로드 받아줘야 한다.

 

1. 코드 수정

hookiat.cpp의 MySetWindowTextW 함수 내부에서

wchar_t* pNum = L"영일이삼사오육칠팔구";

를 

 

const wchar_t* pNum = L"영일이삼사오육칠팔구";

로 변경한다.

 

=> 빌드하여 InjectDllcalc.exe 파일과 hookiat.dll 파일을 만들어준다. 두 파일을 같은 경로에 둔다.

 

2. 실습 시작

옛날 계산기를 실행 후, procexp에서 PID를 확인한다.

 

PowerShell을 띄운 후, cd 명령어를 통해 두 파일이 존재하는 경로로 이동한다.

 

.\InjectDllcalc.exe i [PID 정보] [hookiat.dll의 경로]

를 입력한다. 에러메시지가 나오지 않으면 제대로 실행된 것이다.

 

procexp > Find > Find Handle or DLL에서

 

'hookiat.dll'를 검색해보면 성공적으로 인젝션된 것을 확인할 수 있다.

 

계산기에 숫자를 입력해보면 숫자가 한글로 나오는 것을 확인할 수 있다.

 

인젝션을 성공한 것이다!

 

 

2. 이젝션 실습

이젝션은 간단하다.

앞서 PowerShell에 입력했던 내용에서 옵션만 i에서 e로 바꿔주면 된다.

.\InjectDllcalc.exe e [PID 정보] [hookiat.dll의 경로]

 

procexp > Find > Find Handle or DLL > 'hookiat.dll'을 검색해보면 이젝션된 것을 확인할 수 있다.

 

계산기에 숫자를 입력해보면 숫자로 출력되는 것도 확인할 수 있다.

 

 

3. 코드 분석

1. InjectDllcalc.cpp

[24] 프로세스를 오픈하여 프로세스를 만듦

[30] 프로세스를 위한 메모리 공간을 마련함

[35] CreateRemoteThread(): 해당 프로세스에 LoadLibrary 함수를 통해 hookiat.dll을 로드한다.

 

앞선 다른 공격 실습에서 배웠던 내용과 유사하므로 InjectDllcalc.cpp 파일 분석은 이정도로만 하고 넘어갈 것이다.

 

 

2. hookiat.dll

핵심 기능을 하는 코드는 이 코드라고 할 수 있다.

 

[113] DLL_PROCESS_ATTACH: 프로세스에 연결됨

[115] GetProcAddress를 통해서 주소를 가져온다. 정상적인 함수 타겟을 정하여 우리가 후킹할 것이다. 본 실습에서는  SetWindowsTextW가 후킹 대상임을 알 수 있다. 이 SetWindowsTextW 함수는 user32.dll에 정의된 함수이기 때문에 이 dll을 임포트하여 이 안의 함수의 주소를 가져오려고 하는 것이다.

 

SetWindowsTextW: 계산기 내용을 화면에 띄워주는 함수. 윈도우 상에서 보여지는 텍스트 내용을 지정해주는 함수이다. 우리는 이 함수를 후킹하여 우리가 악의적으로 만든 함수(=한글로 보여주는 함수)를 쓰려고 하는 것이다.

따지고 보면 이건 악성행위는 아니지만, 충분히 공격자가 악용하여 악성행위를 할 수 있다.

 

[120] SetWindowsTextW가 아니라 hookiat.dll에 있는 MySetWindowText(변조된 함수)를 사용하도록 연결해준다.

 

[84] VirtualProtect: 특정 페이지 메모리 영역의 권한을 바꿔준다. 

우리는 SetWindowsTextW 함수의 주소만큼만 쓸(Write) 수 있도록 4바이트만 권한을 주었다.

 

[93] 이제 바꿔줬기 때문에 굳이 우리가 주소를 알고 있을 필요가 없으므로 메모리 속성을 복원해준다.

 

[16] MySetWindowText 함수: 사용자가 만든 함수. 한글로 바꿔주는 기능이 정의되어 있음.

수 → 문자 변환 기법: 숫자 순서대로 한글 순서를 맞춰 매핑시켜줘서 숫자가 나오면 그 숫자에 대응되는 한글로 바꿔준다.

 

[37] g_pOrgFunc: 오리지널 함수. 마지막에 오리지널 함수를 호출해준다.

이유? 오리지널 함수(=SetWindowsTextW) 함수가 호출되지 않았다는 것을 알면 쉽게 탐지될 수 있기 때문에, 들키지 않기 위해서 우리가 원하는 작업 수행 후 호출해주는 것이다.

 

 

4. 개념 정리

후킹을 간단하게 말하자면 "후킹은 흐름의 변조를 만드는 것이다."

본 실습에서는 IAT 후킹으로 원래 함수 주소를 다른 함수 주소로 바꿔서 흐름을 바꿔주었다. 

 

위 그림과 같이 동작한다고 할 수 있다.

 

우선 정상 흐름은 calc.exe를 실행했을 때, user32.dll에 있는 SetWindowsTextW 함수를 실행하는 것이다.

그러나 이 SetWindowsTextW 함수의 주소를 hookiat.dll의 MySetWindowTextW의 함수의 주소로 후킹하여 흐름을 가로채 MySetWindowTextW가 실행되도록 만들어준 것이다. SetWindowsTextW가 아예 실행되지 않으면 방어자가 정상적이지 않다는 것을 눈치챌 수 있기 때문에  중간에 한글로 바꿔준 뒤,  SetWindowsTextW도 호출되도록 만들어준 것이다.

 

 

5. 생각해보기

1. 공격자가 IAT 후킹을 이용하여 공격할 때 얻을 수 있는 이익은 무엇인가?

IAT 부분만 바꿔주면 원하는 동작을 하도록 쉽게 흐름을 바꿀 수 있다.

 

 

IAT 후킹 공격 실습도 끝!