본문 바로가기
악성코드 분석

악성코드 분석 16

by 윤라경 2024. 10. 8.

[2024.10.05 / 2024.10.07]

 

[정적 분석]

> 분석 파일: Lab05-01.dll

 

01. 자동화 분석

 

> 분석 도구: virustotal.com

> 분석 결과

> 64/75
AhnLab-V3(Backdoor:Win32/Idicaf.9f3a5556)
AlYac(Backdoor.XIW)

 

 

 

02. 패킹 여부 확인

 

> 분석 도구: PEiD, exeinfope

> 분석 결과

 

 

 

03. PE 구조 확인

 

> 분석 도구: PEView, pestudio

> 분석 결과

 

 

실행 파일이 아니기 때문에 별도의 테이블은 존재하지 않는다

 

 

pestudio의 라이브러리를 확인했을 때 PSAPI.DLL이 새로 생겼다

 

04. 관련 API  확인

 

> 분석 도구: D/W

> 분석 결과

 

 

 

05. 문자열 분석

 

> 분석 도구: strings, ollydbg

> 분석 결과

 

 

 

[동적 분석]

 

01. DLLMain 주소는 무엇인가?

 

> 분석 도구: IDApro

> 분석 결과: 1000D02E

 

 

 

02. Imports 윈도우를 이용해서 Gethostbyname을 검색하라

임포트 위치는 어디인가?

 

> 분석 결과

 

 

IDA의 imports 부분을 클릭한 다음 Alt+T를 이용하여 검색창을 활용할 수 있다

 

 

찾으면 라이브러리가 WS2_32로 네트워크 관련해서 getbyname이 나온다

 

 

임포트에서 더블 클릭을 하게 되면 해당 위치로 이동되며,

idate 섹션의 위치는 100163CC인 걸 확인할 수 있다

 

 

03. gethostbyname에 함수는 몇 개인가?

 

> 분석 도구: IDAPro

> 분석 결과

함수: 5개

호출: 9개

 

 

해당 부분에서 더블 클릭을 하게 되면 노란색으로 바뀌고,

Ctrl+X를 하게 되면 상호 참조 함수가 나오게 된다

 

 

 

 

 

04. 0x10001757에 위치한 gethostbyname 호출을 보면

어떤 DNS 요청이 이뤄지는가?

 

> 분석 도구: IDA Pro

> 분석 결과: pics.practicalmalwareanalys

 

 

 

그래픽 모드에서 10001757로 이동하게 되면 gethostbyname이 나온다

 

 

10001757 부분을 idata 모드에서 그래픽 모드로 전환 후 살펴보면

해당 줄에 mov 명령어를 실행한 흔적을 볼 수 있다

 

 

그렇기 때문에 10019040으로 이동하여 텍스트 모드로 살펴보면

pics.practicalmalwareanalys라는 문구를 찾을 수 있다

한마디로 해당 줄이 명령 줄로 gethostname으로 호출을 보내면

pics.practicalmalwareanalys의 요청이 이뤄진다고 볼 수 있다

 

 

05. 0x10001656에 있는 서브 루틴에서

지역 변수 몇 개를 인지하고 있는가?

 

> 분석 도구: IDA Pro

> 분석 결과

음의 오프셋: 지역 변수

양의 오프셋: 파라미터

 

 

 

06. 0x10001656에 있는 서브 루틴에서

파라미터는 몇 개를 인지하고 있는가?

 

> 분석 결과: 1개

 

 

 

07. String 윈도우를 통해서 디스어셈블리 내의

문자열 \cmd.exe /c를 찾아보자 어디에 있는가?

 

> 분석 결과: 100095B34

 

 

 

스트링에서 \cmd.exe /c를 검색하게 되면 해당 줄이 나타난다

 

 

해당 줄로 이동하게 되면 줄의 번호가 나오며

10095B34라는 곳에 \cmd.exe /c가 있는 것을 알 수 있다

 

 

08. \cmd.exe /c를 참조하는 코드 영역에서 무슨 일이 발생하는가?

 

> 분석 결과: HiMasterDDDDDD[]부터 Magic Number까지

 

 

 

무슨 일이 발생하냐는 질문에는 \cmd.exe /c 실행한 후를 보면 알 수 있다

현재 화면과 같이 HiMaster부터 Magic Number로 실행하는 화면이 나타난다

 

 

그렇기 때문에 해당 줄들이 모두 분석 결과가 된다

 

 

09. 같은 영역 0x100101C8에서 dword_1008E5C4는

경로를 지정하는 전역 변수로 보인다

악성 코드는 어떻게 dword_1008E5C4를 설정하는가?

 

> 분석 결과

 

 

 

100101C8 부분으로 가서 해당하는 줄의 dword를 보고 제일 처음을 선택한 후 이동한다

 

 

이동하게 되면 화면과 같은 명령어들을 볼 수 있다

 

 

eax 값을 1008E5C4 옮겨서 10001678에 옮겨서 실행시키게 된다

3A98h는 헥사 값으로 15000이라는 값이 나온다

 

 

10. 0x1000FF56에서 서브 루틴으로 수백 라인의

문자열을 비교하기 위한 일련의 memcmp 비교다

robotwork와 문자열 비교가 성공적으로 이뤄지면 무슨 일이 일어나는가?(memcmp가 0을 반환)

 

> 분석 결과

 

 

위에서 내용을 읽어들이고 위의 closesocket을 통해 종료시키게 된다

 

 

 

11. PSLIST 익스포트는 무슨 역할을 하는가?

 

> 분석 결과

 

 

PLIST를 찾아서 이동했을 때 제일 먼저 호출하는 것이

100036C3이기 때문에 해당 부분으로 이동한다

 

 

버전을 읽어 오기도 하고 더 내려가서 확인해 보면

 

 

현재의 프로세스도 열고, 토큰도 실행시키는 걸 확인할 수 있었다

 

 

위에서도 권한에 관한 함수가 실행되었기 때문에

여기에서도 권한 재실행하는 함수가 나타나는 걸 확인할 수 있다

 

 

CloseHandle을 확인함으로 권한을 획득했다고 보면 된다

 

 

12. 1) 그래프 모드를 이용해서 sub_10004E79 상호 참조 그래프를 그려 보자

2) 이 함수에 진입하기 위해 호출하는 API는 무엇인가?

3) 해당 API 함수에만 기반을 두고 이 함수는 어떤 이름으로 변경하는가?(Send_LanguageID)

 

> 분석 결과

 

10004E79로 이동 -> View -> User xrefs chart 선택

-1로 하게 되면 그래프가 엉킬 수도 있어 +로 하는 게 좋지만,

마이너스로 한다고 해도 그래프만 정상적으로 나오면 상관없다

 

 

그래프를 확인하게 되면 이런 형태로 나타난다

 

 

그 중에서도 내가 찾는 것은 10004E79가 호출하는 함수였기 때문에

10004E79가 호출하는 함수를 확인할 수도 있다

1단계에서는 4개의 함수를, 2단계에서도 4개의 함수를 호출하게 된다

 

 

그래프를 그리는 방법까지 알았기 때문에

이번에는 해당 줄에서 오른쪽 마우스를 클릭 후 Rename을 선택한다

선택 후 Send_LanguageID로 변경시키게 되면

 

 

10004E79였던 줄에서 변경한 이름으로 나타나는 것을 확인할 수 있다

 

 

다시 그래프를 그리게 되면 변경된 이름으로 출력된다

 

 

13. 1) DLLMain이 직접 호출하는 윈도우 API 함수는 몇 개인가?

2) 두 번째 Depth에서는 몇 개인가?

 

> 분석 결과

 

 

이번에는 DLLMain이 직접 호출하는 윈도우 API를 찾기 위해

DLLMain의 address를 확인한다

현재 DLLMain의 address가 1000D02E이기 때문에 그 부분으로 이동한다

 

이동 후 그래프로 확인 시 바로 메인 함수가 호출하는 윈도우 API를 찾을 수 있었다

현재 핑크색으로 되어 있는 것들이 윈도우 API다

 

 

 

두 번째 Depth도 확인했으나 그래프를 정리할 수가 없어 사진으로 첨부했다

화면을 보면 메인 함수가 아닌 두 번째로 호출하는 함수를 확인하면 된다

 

 

14. 0x10001358 Sleep 호출이 존재한다

코드 후반부를 보면 이 코드가 실행되면 프로그램이 얼마 동안 Sleep 하는가?

 

> 분석 결과: 30초

 

 

[This is NTI]의 13의 숫자를 기억하고, 뒤에 오는 30을 더한다

atoi 문자열을 숫자로 변환시키는 함수로

3E8h의 헥사 값인 1000의 숫자에 곱하면 30000이 된다

30000미리 세컨드는 30초로 30초 동안 Sleep 한다고 보면 된다

 

 

15. 0x10001710에서 socket을 호출한다

3가지의 파라미터는 무엇인가?

 

> 분석 결과: Protocol(6: TCP), Type(1: TCP Stream), af(2: IPv4)

 

ex)

Protocol(17: UCP), Type(2: Dgram), af(2: IPv4)

Protocol(6: TCP), Type(1: TCP Stream), af(23: IPv6)

 

 

화면을 확인하게 되면 각각 protocol, type, af가 나온다

 

 

socket의 msdn을 검색하게 되면 번호에 따른 값을 알 수 있다

 

 

16. Socket과 IDA Pro에서 명명하는 심볼 상수 기능을 이용하여

이 파라미터를 조금 더 유용하게 할 수 있는가?

변경 후 파라미터는 무엇인가?

 

> 분석 결과: protocol(6: IPPROTO_TCP), Type(1: SOCK_STREAM), af(2: AF_INET)

 

ex)

protocol(17: UDP), Type(2: DGRAM), af(2: IPv4)

 

 

마우스 우클릭 후 Use standard symbolic constant 선택하여 최대한 비슷한 것으로 변경한다

 

 

변경하게 되면 숫자에서 내가 설정한 파라미터로 변경되는 것을 한눈에 알아볼 수 있다

 

 

 

강의 소감

오늘도 정적 분석에 더불어 동적 분석에 더 집중하는 시간이었다

IDA Pro 프로그램을 이용하여 여러 가지의 질문을 통해

해답을 찾아내는 실습을 진행하면서 해답을 찾아내는 식으로 진행되었다

이러한 동적 분석을 통해 알아낼 수 있는 방법을 공부할 수 있었다

예를 들면, 그래프 그리기와 함수 찾아내기 같은 것을 자세히 알 수 있게 되었다

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

악성코드 분석 18  (0) 2024.10.10
악성코드 분석 17  (1) 2024.10.08
악성코드 분석 15  (0) 2024.10.04
악성코드 분석 14  (0) 2024.10.02
악성코드 분석 13  (0) 2024.10.01