본문 바로가기

악성코드 분석

kernel32.dll vs kernel132.dll (feat. 악의적인 program)

반응형

이번 시간에는 winodows에서 악의적인 program이 어떻게 실행되는지와

내부 code 구성이 어떻게 설정되었는지 확인해보도록 할거야

바로 분석들어가볼게!

 

 

String 분석

 

 

IDA를 통해서 string 분석을 해보니까 kernel32.dll을 통해서 다음과 같은 API들을 호출한 것을 볼 수 있어

이쯤에서 한번 복습해보도록 할게 kernel32.dll이 하는 동작은 뭘까? 그리고 DLL이란 무엇일까?

 

Kernel32.dll = 메모리, 파일, 하드웨어 접근,조작과 같은 핵심 기능을 담은 공용 DLL

DLL (Dynamic Link Library)  = 동적 라이브러리 즉 필요할 때만 불러쓸 수 있는 함수

                                                 프로그램에서 자주 쓰이는 표준 함수나 데이터를 모아놓은 것

 

현재 호출한 API들이 수행하는 일들을 살펴볼게

 

CloseHandle: 열려 있는 개체 핸들을 닫는다.
UnmapViewOfFile: 호출 process의 주소 공간에서 파일의 매핑을 해제
IsBadReadPtr: 호출 process에 지정된 memory 범위에 대한 읽기 권한이 있는지 확인
MapViewOfFile: 파일 매핑의 보기를 호출 프로세스의 주소 공간에 매핑한다.
CreateFileMappingA: 지정된 파일에 대한 파일 매핑 개체를 만들거나 연다.
CreateFileA: 파일을 생성하거나 연다.
FindClose: 밑에 find 계열의 함수에서 연 파일 검색 핸들을 닫는다.
FindNextFileA: findfirstfilea에 대한 파일 검색을 지속적으로 한다.
FindFirstFileA: 디렉터리에 특정 이름과 일치하는 이름을 가진 파일이나 디렉터리 검색
CopyFileA: 파일을 복사한다.

 

string 분석을 통해서 알 수 있는 것은 file을 process와 mapping하고 이를 열거나 새롭게 생성하는 것 같아!

그리고 나서 파일의 이름을 비교하면서 검색한 후 파일을 복사하는 작업을 수행할 것 같아..!

좀 더 자세한 분석을 위해서 olly랑 IDA를 사용해보도록 할게

함수의 흐름을 확인하기 위해서 function flow를 확인해보자

 

 

 

 

Function Flow 분석 (1)

 

main 함수 호출 이후 subroutine 5개와 아까 우리가 kernel32.dll이 호출한 함수들과

string 분석에서 보지 못했던 API들도 들어있는 것을 볼 수 있어

그리고 main 함수를 실행한 이후에 CopyFileA와 exit 이 있는 것으로 보니 

main함수를 통해서 file을 복사하는 것 같아! 한 번 main 함수 부분을 확인해보도록 할게

 

 

 

 

 

 

 

IDA와 Ollydbg를 사용해서 assembly를 분석해보면 

mov eax , [esp+4] 이 있는데 [esp+4]에 들어있는 값이 eax로 들어가고 

cmp eax,2 를 통해서 eax와 2가 서로 같은 값이 아닐 경우

JNZ loc_401813으로 jump를 실행하게 되어 해당 program을 종료하게 되는 것을 볼 수 있어

그렇다면 eax에 들어간 [esp+4]의 값은 무엇일까...?

IDA에서 보면 [esp+4] 를 [esp+argc] 로 표기한 것을 보니 argc의 값을 표현한 것 같은데...?

여기서 잠깐 argc와 argv의 차이를 알고 있니? 모르면 한 번 정리하고 가보도록 할게

 

 

argc = count
argv = variable

 

argc는 해당 프로그램을 실행하는데 있어서 전달된 인자들의 개수를 뜻하고

argv는 전달된 인자들을 뜻하는거야!

그리고 argv는 문자열로 표기가 되는데 다음과 같이 배열로 표기할 수 있어!

 

argv[0] = 실행파일의 이름
argv[1] = 실행파일 실행 시 필요한 parameter

 

argv에 대해 좀 더 자세히 알아보기 위해  linux shell에서 예시를 들어보면 다음과 같이 비교할 수 있어 

test라는 file을 만들고 다음과 같이 echo 명령을 수행하고 

test 파일을 다음과 같이 인자값을 설정함과 동시에 실행시켜보면 다음과 같은 결과가 나오게 돼

 

 

 

위에서 표시한 $[num] 이란 명령어를 수행하는데 있어서 사용한 인자의 위치를 뜻해

인자의 위치는 0부터 시작하게 되는데 

$0 = test 

$1 = 1

$2 = 2

위와 같은 결과가 나오게 되는거야

 

다시 본론으로 돌아와서 그렇다면 eax와 2를 서로 비교한다는 것은 

현재 실행시킨 프로그램에 전달된 인자가 총 2개라는 것이고 

인자의 개수가 2개가 아닐 경우에는 프로그램을 종료시킨다는 것을 알 수 있어!

그리고 전달하는 인자를 비교해가는 구간이 있는데 바로 밑에 사진을 보면 전달 인자값을 비교해가는 것을 볼 수 있어

 

 

위에 그림에서보면 stack 구조에서 004030B0 에 위치한 data를 보면 어떤 글이 들어가있는 것을 볼 수 있어

WARNING_THIS_WILL_DESTORY_YOUR_MACHINE

이제 여기에 해당한 값을 ESI 로 data를 옮겨놓은 다음......

 

 

 

EAX+4 라고 위치한 부분이 바로 382470 위치에서 4칸 움직인 382474로 이동해보니까

해당 stack에는 003824BB 라는 data가 들어가있어

이제 EAX에 3824BB에 들어간 data를 넣겠다는 의미인데 자세히 들여다보면...!

3824B0이 위치한 부분에서 B만큼! 즉, 11칸만큼 움직이면 data가 들어있다는 것을 보여줘

그래서 11칸을 움직여보니까 57로 시작하는 data인데

57은 ASCII 문자로 치환하면 W!

아까 위에서 입력한 문장과 동일한 data가 들어있지?

바로 WARNING_THIS_WILL_DESTORY_YOUR_MACHINE 문장이 들어있네? 

 

 

 

그리고 이어진 assembly 진행상황을 보면 

- EAX에 있는 data를 1byte씩 EDX로 이동

- ESI에 있는 data를 1byte씩 EBX로 이동한 후,

- 또 EDX에 입력된 1byte 값을 ECX로 이동 시킨 후에

- CMP DL, BL 을 통해서 두 값이 동일한지에 대한 여부를 확인하고 있어

 

그렇게 한 글자 한 글자씩 서로의 data를 비교해가다가 같지 않은 경우 해당 함수를 종료시켜버려! 

처음 함수를 실행할 때 data parameter 값을 미리 정한 상황이라 정상적으로 함수가 흘러가지만

parameter 값이 해당 code에서 원하는 값이 아니었을 경우 종료하는 함수임을 알 수 있어

 

 

 

 

Function Flow (2)

 

자 위에서 먼저 분석한 결과 전달인자 값을 한글자씩 비교해서 

전부 동일하면 통과 아니면 함수 종료를 한다는 것을 알 수 있었지?

이제 data 비교가 끝나고 어떤 API들이 실행되는지 살펴보도록 할게

 

 

1. CreateFileA : 특정 file을 open 하고 (여기서 특정 file 이름이 뭔가 했더니... Kernel32.dll이네)

2. CreateFileMappingA : 해당 file을 memory에 적재

3. MapViewOfFile : memory에 올려진 file의 첫번째 주소값을 얻게 된다.

 

위 그림을 보면 알 수 있듯이 다음과 같은 API 함수들을 통해서 

Kernel32.dll과 Lab07-03.dll에 접근하는 것을 볼 수 있어

 

 

 

함수의 마지막 부분으로 가면 드디어 우리가 찾고자 했던 kerne132.dll이 만들어지고

Lab07-03.dll에 접근함과 동시에 기존에 있던 Lab07-03.dll을 kerne132.dll로 복사하는 것을 볼 수 있어

그러면 해당 프로그램을 실행시키면 어떻게 동작하는지 한 번 확인해볼까?

 

 

 

 

다음과 같이 실행파일을 WARNING_THIS_WILL_DESTORY_YOUR_MACHINE 인자와 함께 실행시키니

kernel32.dll 옆에 kerne132.dll 파일이 생성된 것을 볼 수 있어!

그러면 해당 dll이 무슨 일을 하는걸까? 이러한 동적분석에 필요한건 뭐다..? 바로 Process Explorer~

 

 

 

지금 악성코드가 들어있는 program을 실행한 이후에 메모장을 실행시켰더니

지금 notepad.exe에서 사용한 DLL 목록 중에 kerne132.dll이 들어있는 것을 볼 수 있어..!

헐랭... 그러면 다른 program도 그런지 확인해볼까..?

 

 

 

 

wow...! 모든 program에 지금 kerne132.dll을 호출하여 실행시키는 것을 확인할 수 있어

즉, 해당 악성 program을 실행시킨 후에 감염된 PC에서 어떤 program들을 실행시키던 간에

kerne132.dll을 통해서 program을 실행시킨다는 것을 알 수 있어

기존에 있던 kernel32.dll을 대신하여 kerne132.dll이 수행하고 있는거지...!

그렇다면 대체 이 kerne132.dll은 어디서 호출해 온 것일까? 궁금하지???

너무 길어져서 오늘은 여기까지만 하고 다음 시간에 이어서 kerne132.dll의 호출 경로와 행위를 알아보도록 할게

오늘은 여기까지~

 

 

 

 

 

 

반응형

'악성코드 분석' 카테고리의 다른 글

GINA intercept 악성코드 분석  (0) 2023.04.08
RAT 공격 정리  (0) 2023.04.06
DoS 공격분석 (feat. IDA)  (0) 2023.01.14
LAB1-2 (악성코드분석)  (1) 2023.01.12
PE 분석(2)  (0) 2023.01.12