안녕하세요. Message입니다.

<실전 악성코드와 멀웨어 분석> 책의 실습 문제 6-1을 분석합니다.

분석환경은 Windows 7 Ultimate 64x / Vmwre 12.1.0 build 입니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

0. 기초 동적 분석

------------------------------------------------------------------------------------------------------------------------------------------

문제풀이에 앞서 간단한 동적 분석을 진행합니다.

먼저 Imprt 함수 목록을 살펴보면 아래와 같이 Kernel32와 WININET 2개가 존재합니다.

WININET은 HTTP 프로토콜과 상호작용할 수 있도록 해주며

임포트 하고 있는 InternetGetConnectedState는 로컬 시스템의 인터넷 연결 상태를 확인하는 API입니다.

 

StringWindow(Shitft+F12)에서도 해당 API가 사용하는 "Success : Internet Connection" 문자열을 발견할 수 있습니다.

 

이제 해당 악성코드(?)를 실행시켜보면 위에서 파악한 문구가 출력됨을 확인할 수 있습니다.

 

Tip. PE 파일 영역

-------------------------------------------------------------------------------------

위 String Window를 살펴보면 WININET.dll 에서 사용하는 String의 .data 섹션이고

나머지는 .rdata 섹션에 있는것을 발견할 수 있습니다.

궁금증에 생겨 각 섹션에 내용을 정리합니다.

 

 

.text : CPU가 실행하는 명령어를 담고 있다. 일반적으로 실행 가능한 코드를 포함하는 유일한 섹션.

.data : 프로그램의 초기화된 전역 데이터를 저장하는데, 프로그램의 어디에서든지 접근 가능함. 읽기/쓰기 가능

.rdata : 프로그램 내의 전역에서 접근 가능한 읽기 전용 데이터를 담고 있음.

.bss : 프로그램의 초기화 되지 않은 전역 변수들을 위한 섹션. 가상주소공간에 매핑될 경우 보통 .data 섹션에 병합됨.

.idata : 존재 시 임포트 함수 정보를 저장하고 있으며, 존재하지 않는다면 .rdata 섹션 내의 임포트 함수 정보에 저장

.edata : 존재 시 익스포트 함수 정보를 저장하고 있으며, 존재하지 않는다면 .rdata 섹션 내의 익스포트 함수 정보에 저장

.pdata : 64비트 실행 파일에만 존재하며, 예외 처리 정보를 저장

.rsrc : 실행 파일에 필요한 리소스를 저장

.reloc : 라이브러리 파일 재배치 정보

-------------------------------------------------------------------------------------

 

------------------------------------------------------------------------------------------------------------------------------------------

1. Main이 호출하는 서브루틴만으로 발견한 주요 코드 구조는 무엇인가?

------------------------------------------------------------------------------------------------------------------------------------------

Main의 코드는 아래와 같습니다.

가장 눈에 띄는 것은 [ call sub_401000 ] 명령어입니다.

아마 Sub 함수이니 eax에 리턴값이 저장되어 있을겁니다.

전 문제에서 Tip으로 기재한 부분이었는데, 이번 문제에서 또 보니 복습이 되네요.

따라서 eax값을 mov문으로 변수 var_4에 담은 이후에 cmp문을 이용하여

loc_401056 또는 loc_40105B 루틴으로 분기를 하는 내용입니다.

 

 

사실 코드로 보니 한눈에 안들어오는 경향이 있습니다.

아래와 같이 Graph 모드로 보면 좀더 이해하기 쉽습니다.

근데 이번 챕터가 아니었으면, 이러한 Graph 구조가 if문 구조라는 사실을 잘 몰랐을 것 같네요.

 

이를 Hex-ray 기능을 이용하여 보면 아래와 같이 간단한 구조임을 알 수 있습니다.

약간 의아했던 점은, sub_401000()의 결과 값을 담았던 var_4 변수가 없다는 점입니다.

 

궁금해서 상세 보기를 했더니, 스택상에서는 [ebp-4] 주소에 할당되어 있었습니다. (이미 변수 이름이 var_4 지만요)

아마 명시적인 선언은 하지 않았지만, if문 안에 sub루틴이 있다보니

true false를 판단하기 위해 스택에 공간이 할당된것 같습니다.

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 0x40105F에 위치한 서브루틴은 무엇인가?

------------------------------------------------------------------------------------------------------------------------------------------

0x40105F에 위치한 서브루틴은 아래와 같습니다.

어떤 기능을 해야 하는지 알아보려면 call 위에 push 되는 인자값들을 알아야 합니다.

IDA가 표현해주는 arg 값을 통해 유추가 가능하지만 직관적으로 잘 파악이 안됩니다.

 

해당 부분을 올리디버거로 보면 이해하기가 수월합니다.

Call 하기 전에 넣어주는 인자값이 "Success..." 문자열입니다.

또한 하이라이트 처리된 Call 명령어를 수행하고 나면 CMD창에 해당 문자열이 출력됩니다.

 

이를 보았을때 0x40105F에 위치한 서브루틴의 기능은 Printf로 볼 수 있습니다.

하지만 IDA Pro 상용버전과 무료버전 모두 항상 printf를 인식해 명명하지 않는다고 하니

push되는 문자열의 끝부분에 라인피드 문자  "\n"  를 캐치하여 printf 함수임을 예측할 수 있어야 합니다.

해당 함수에 printf 라고 레이블을 달아주면 그 다음부터는 이해하기 쉬워지겠죠?

분명 5-1 문제에서 rename을 배웠는데, 이런 부분은 분석을 수월히 해내기 위해 습관화 되어야 할 것 같습니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

3. 이 프로그램의 목적은 무엇인가?

------------------------------------------------------------------------------------------------------------------------------------------

인터넷 연결의 활성 여부를 확인한 후 확인 결과를 출력하는 프로그램입니다.

악성코드가 사용할법한 API이니 기억해둡니다!

 

posted by Red_Message