악성코드의 기능을 파악하기 위해서 코드나 프로그램의 구조를 분석해보아야 합니다.
하지만 악성코드를 직접 실행하면 피해가 올 수 있으니,
실행하지 않고 분석하는 과정인 정적분석의 기본을 알아보고자 합니다.
주요 사용 기법은 다음과 같습니다.
1. 악성 여부를 판단하는 안티 바이러스 도구
2. 악성코드를 판별하는 해시 정보 검증
3. 파일의 문자열, 함수, 헤더에서 주요 정보 수집.
1. 안티바이러스 스캐닝
악성코드 실행 및 탐지에 사용할 수 있는 사이트가 있습니다.
https://www.virustotal.com/gui/home
해당 사이트는 구글이 인수하여 운영되고 있습니다. 때문에 UI도 보기 편하고 간단하게 업데이트 되고 있습니다.
악성코드 예제 파일을 분석해보겠습니다.
choose file을 통해 악성코드 예제 파일을 선택합니다. -> lab01-01.exe
상단에 빨간색으로 보이는 41 engines detected this file을 통해 악성코드임을 알려주고 있습니다.
왼쪽 상단의 아이콘으로 69개의 백신엔진에서 41개가 이것을 탐지했다는 것도 알 수 있겠습니다.
탐지된 이름을 보면 대부분이 trojan으로 분류가 되어있음을 확인할 수 있습니다.
때문에 네트워크 기반의 통신행위를 하거나, 별도 소프트웨어를 설치해서 동작하는 형태임을 유추할 수 있겠습니다.
details부분을 보겠습니다.
첫 부분에 대한 해시 값들로 인해 파일의 고유 id를 볼 수 있고,
history를 통해 파일 생성일자, submission된 일자, .. 등이 확인 가능합니다.
name부분은 다른 사람들이 이 파일을 올려서 확인받았을때의 이름들을 알 수 있습니다.
헤더에 대한 부분입니다.
peview로 볼 수 있었던 entry point 주소도 나옵니다.
.text, .rdata, .data 총 3개의 섹션으로 구성되어있습니다.
imports에 나오는 부분들은 이후 사용될 dependency walker에서 나오는 것과 동일합니다.
behavior로 가면 더 자세하게 볼 수 있습니다.
c:\windows/TEMP 폴더에가서 어떠한 것들을 한다~~
파일 writting은 어디서 하는지~ 등을 알 수 있습니다.
그리고 레지스트리 키 중에서 어떤 부분을 건드리는지, shell command는 어떻게 나오는지 등을 확인할 수 있습니다.
이번엔 lab01-01.dll을 분석해보겠습니다.
70개중 33개에서 악성코드라고 판단을 하였고,
file type부분에 win32 dll으로 되어있음을 확인 가능합니다.
헤더정보로 가면, dll파일은 섹션이 4가지로 되어있습니다.
exe파일보다 reloc이 추가되어있습니다.
import부분도 하나가 더 늘어가 있습니다.
앞과는 다르게 의미있는 정보들이 있음을 유추할 수 있습니다.
kernel32에 sleep함수가 있습니다. 백그라운드에서 실행시키는 것을 의미합니다.
아마 프로세스를 생성해서 백그라운드에서 생성하라는 악성코드임을 유추할 수 있겠습니다.
아래부분에 shutdown이 보입니다. 악성코드임을 더욱 확신할수있는 말이겠네요.
relation을 보면, 이 dll 파일은 어떤 excution하는 파일의 parents! 임을 알 수 있습니다.
이 parents는 아마 앞에서 분석한 lab01-01.exe겠죠?
대체적으로 파일이름을 비슷하게 만들기 때문에 이것을 통해 유추할 수 있습니다.
2. 해시 정보 검증
해시는 악성/정상 코드의 고유 값입니다. 사람으로 치면 주민등록번호라고 할 수 있습니다.
종류는 SHA-1, MD5 등이 있습니다. 제일 많이 쓰이는 것은 MD5입니다.
GUI버전으로 보겠습니다.
해당 사이트에서 다운로드 하고, 이 실행파일에 대한 해시값을 비교해 보겠습니다.
사이트에 올라와있는 파일의 해시값을 아래부분에 넣고, 검증을 누르면
해당 파일을 winMD5 프로그램에 넣은 해시값과 동일함을 알 수있습니다.
3. 파일의 문자열 검색
악의적인 일을 할 때, 대부분 값이나 변수, 파일명, 사이트 명같은 고유의 값들이 들어갑니다.
이런 문자열들은 그대로 저장되는 경우가 많기 때문에,
우리가 실행하려는 파일을 역으로 돌려서 문자열을 추출해내면 알아보기가 더 쉽겠습니다.
실질적인 정보들이 나오면서 접근하지 말아야할 부분이 나온다면 의심을 해볼 수 있고
더 쉽게 악성코드임을 알아낼 수 있겠습니다.
문자열은 ASCII, Unicode방식으로 이루어져 있습니다.
BAD를 각 문자열 형식으로 바꾸면 이렇게 표시가 됩니다.
역으로 돌려서 추출을 해야하니, 아스키 방식으로 한다면 1바이트씩 읽어와서 그게 영어로 나온다면 문자열임을 알 수 있습니다.
대표적인 소프트웨어는 Strings입니다.
https://docs.microsoft.com/ko-kr/sysinternals/downloads/strings
strings로 lab01-01.exe를 분석해보면 api함수들이 보입니다.
strings는 cmd창에서 동작하는 것이기 때문에, strings가 있는 폴더안에서 cmd를 열고 명령어를 입력합니다.
>> strings (분석하고자하는파일명.확장자)
간단하게 드래그해서 위치를 잡아주어도 실행이 됩니다.
앞부분은 this program cannot be run in DOS mode, text, rdata, data... 를 제외하고는 이해할수 없는 문자들로 이루어져있습니다.
스크롤해서 밑으로 내러가면,
이렇게 dependency walker 에서 보았던 dll 이름들과 각 api함수들의 이름을 볼 수 있습니다.
그런데 하단에 잘 보시면,
kernel32.dll 바로 위에 kerne132.dll이라고 되어있습니다.
자세히 보지않으면 l 이라고 되어있어야하는 부분이 1로 되어있다는 것을 알아차릴 수 없습니다.
더 아래부분에는 lab01-01.dll을 통해 이 lab01-01.exe파일은 lab01-01.dll과 짝이라는 것을 알 수 있습니다.
마지막에는 warning_this_will_destroy_your_machine을 통해 악성코드임을 표현하기도 합니다.
4. 패킹 및 난독화 확인
파일의 시그니쳐 등으로 사용자들이 악성코드임을 확인할 수 있으니까,
공격자들이 그럼 안보이게 하고싶다! 해서 하는 것이 패킹입니다.
패킹을 하게 되면, 사이즈는 작아집니다. 압축과 비슷하게.
실제 실행이 되려면 다시 원본으로 돌아가야하기 때문에, 돌려주는 래퍼 프로그램이 같이 있습니다.
패킹된 실행 프로그램으로 배포가 되기 때문에
앞에서 본 virustotal, strings등으로 분석을 하게 되면 이상한 형태의 정보들로 나오게 됩니다.
정상적인 패킹도 있지만, 비정상적인 패킹도 있기 때문에 확인을 해봐야 합니다.
패킹이 되어있는 것은 악성코드 은폐 목적이고, 또한 문자열 검색도 되지 않습니다.
보통 LoadLibrary, GetProcAddress함수들은 정상적인 기능을 하는 프로그램에서는 잘 쓰이지 않습니다.
주로 os에서 쓰이는 함수들이 응용프로그램에서 쓰인다고 한다면 의심을 해보는 것이 좋겠죠?
이런 패커를 탐지해주는 PEiD를 알아보겠습니다.
https://software.naver.com/software/summary.nhn?softwareId=MFS_115968#
lab01-01.exe파일로 실행해보았습니다.
EP section이 entry point를 알려주는 것인데, .text로 나오는 것이 정상입니다.
subsystem이 win32 console인것도 확인 가능합니다.
그리고 아래부분에 microsoft visual c++ 6.0 을 통해 컴파일되는 것이구나~ 라는 것으로 확인하면 되겠습니다.
EP section이 비어있거나, Linker Info가 0.0인것은 의심을 해봐야하는 것입니다.
컴파일프로그램을 알려주는 부분이 우리가 잘 알고있는 Visual 이 아닌 것도 의심을 해봐야겠습니다.
그럼 정상 프로그램을 패킹해서 PEiD로 분석 확인해보도록 하겠습니다.
입문자용 패커로는 https://upx.github.io/
다운로드 후 xp버전의 메모장을 패킹해보겠습니다.
원본 파일을 PEiD에서 보면,
upx가 있는 폴더안에 exe파일을 옮겨놓고 cmd를 연 후, >>upx (패킹할파일이름).exe
패킹한 후 다시 PEiD로 보면,
EP section이 upx1으로 변하고 컴파일 버전도 찾을 수 없다고 나옵니다.
5. 헤더에서 정보 수집
PE file header에서는 대부분의 정보를 수집할 수 있습니다.
- 코드에 관한 정보, 애플리케이션 유형, 필요한 라이브러리 함수, 메모리 공간요구 사항 ...
이 중에 주로 보는 내용은 링크라이브러리와 함수입니다.
보통 링크하는 시점을 3가지로 나누게 되는데, 정적/런타임/동적링크 입니다.
static link: 실행시 라이브러리 코드를 모두 복사, PE 파일 헤더에 파일 링크 코드 정보 없음
runtime link: 악성코드 패킹이나 난독화에 자주 사용, 함수가 필요할 때마다 동적 링크.
dynamic link: 프로그램이 링크된 라이브러리 함수를 호출하면 라이브러리내의 함수를 실행.
pe파일 헤더에 로드되는 모든 함수에 대한 정보가 저장되기 때문에, 헤더부분을 잘 본다면 악성코드 유추를 더 쉽게 할 수 있습니다.
동적 링크 함수를 탐색하기 좋은 프로그램은 dependency walker입니다.
https://www.dependencywalker.com/
dependency walker로 파일을 열어보면 주로 많이 나오는 dll들을 알아보겠습니다.
DLL | 설명 |
Kernel32 | 메모리, 파일, 하드웨어 접근 및 조작 |
Adwapi32 | 서비스 관리자, 레지스트리 같은 윈도우 핵심 컴포넌트 접근 |
User32 | 버튼, 스크롤바, 사용자 행위 에저와 반응 등 사용자 ui |
Gdi32 | 그래픽 보기와 조작 관련 |
Ntdll |
윈도우 커널 인터페이스, kernel32.dll로 import, 사용하는 경우는 기능 숨기거나 프로세스 조작 등 특정 작업 |
WSock32/Ws2_32 | 네트워크 연결 및 관련 작업 수행 |
Wininet | FTP, HTTP, NTP등 프로토콜을 구현한 상위 수준 네트워크 함수 |
이제 depends로 예제 파일을 열어보겠습니다.
빨간 네모부분이 import부분, 아래가 export부분입니다.
import하는 dll을 클릭하여 api함수들을 볼 수 있습니다.
왼쪽 dll이 프로그램에 따라 다르게 나타나므로 종류를 참고하여 확인하면 되겠습니다.
이러한 프로그램들과 사이트를 이용해서 악성파일의 정적분석을 할 수 있습니다.
다음 포스팅에서는 더 자세하게 한 파일을 가지고 여러 툴들로 분석해보겠습니다.
'study > 악성코드분석&리버싱' 카테고리의 다른 글
기초 정적 분석, lab01-02.exe (0) | 2020.04.25 |
---|---|
기초 정적 분석, lab01-01.exe, lab01-01.dll 분석하기 (4) | 2020.04.16 |
악성코드 분석- 기초 정적 분석, PE파일(2) (2) | 2020.04.10 |
악성코드 분석- 기초 정적 분석, PE 파일 (0) | 2020.04.09 |
Reversing Theory- abex' crackme #1 (2) | 2020.04.02 |