본문 바로가기

TIL/개인공부

[2018 데이터챌린지] 악성코드 탐지 후기 1편

반응형

# 수정 2018-11-13 코드 추가


이번에 정보보호학회에서 열리는 "정보보호 R&D 데이터 챌린지"에 참여하게 되었다.


종목은 총 4가지가 있었다

1. 악성코드 탐지

2. 악성 안드로이드 앱 탐지

3. 차량 도난 탐지

4. 자동 취약점 탐지


이중에 1번을 참여하게되었고. 11월10일 토요일에 판교에 가서 예선전을 참여했다.

작년에 악성 안드로이드 앱을 참여하고 우승했던 나여서 이번에 욕심이나서 악성코드도 우승해보고 싶었다.


판교에 도착했을때 많은 팀들이 보였고 충남지역 호남지역에도 많은 팀들이 참여를했다.


10시에 정확하게 시합이 시작됐고. 관계자분들이 USB를 이용하여 테스트셋을 나눠줬다.


테스트셋을 받고 압축해제를 하는데 7zip이 안깔려있어서 Ubuntu에 p7zip을 설치했다 하지만 virtualbox문제인지 인터넷 연결이 잘되지않았고

현장에서도 와이파이 문제로 관계자분들이 골머리를 앓았던거 같다.


할수없이 로컬에 실시간 안티바이러스를 끄고 압축해제를 하였다 [솔직히 로컬컴 날라갈까봐 무서웠음..]


virtualbox에 설치된 ubuntu안에 공용폴더를 설정하고..

[명령어: sudo mount -t [로컬컴 공유폴더] [ubuntu 공유폴더] 사용


테스트 셋을 옮기고 feature를 뽑기 시작...


이번 챌린지에서 사용한 feature는 opcode와 API 였다.


feature 뽑는 방식은 다음과 같이 진행하였다.


먼저 opcode같은 경우 리눅스의 objdump를 활용하여 2bytes씩 끊어서 읽었다

사실 opcode는 전혀 생각치 못한 feature였는데 논문을 읽고 알게되었다 하지만 지금 생각해보니 별로 의미없는 데이터같은..

뽑는 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
for count, i in enumerate(file_list):
    if count % 100 == 0:
        print(count)
    command = "objdump -d "+data_dir+"/" + i + "|grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|paste -d '' -s |sed 's/^/\"/'|sed 's/$/\"/g'"
    return_v = subprocess.check_output(command, shell=True).decode("utf-8")
    result = return_v.split()
    
    #for count opcodes
    opcodes = dict(Counter(result))
    for v in dict(Counter(result)).keys():
        if(len(v)<2 or len(v)>2):
            del opcodes[v]
            continue
        if not v in opcodes_list:
            del opcodes[v]
            continue
        #for IDF
        idf_data[v] += 1
    all_data[i] = opcodes


API같은경우 작년 대회 우승자 ppt를 참고하여서 진행을 하였는데

당시 우승자는 python의 PEFrame이라는 라이브러리를 사용해서 추출했다고 한다.

하지만 이번 대회에서 PEFrame이 안되는 악성코드들이 있어서 할 수 없이 직접 디버거를 작성하여 추출을 진행했다

코드는 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
for index, i in enumerate(filelist):
    print(index, i)
    api_dict = defaultdict(lambda: 0)
    try:
        pe = pefile.PE(data_dir+"/"+i)
        pe.parse_data_directories()
 
        #record every file's API list
        try:
            for entry in pe.DIRECTORY_ENTRY_IMPORT:
                for imp in entry.imports:
                    try:
                        api_name = imp.name.decode("utf-8")
                        if api_name in api_list:
                            api_dict[api_name] = 1
                    except:
                        pass
        except:
            api_dict = defaultdict(lambda: -1)
    except:
        api_dict = defaultdict(lambda: -1)
    get_api[i] = api_dict


여기서 첫번째 문제였는데

알고리즘 문제일수도있겠지만

1. Feature뽑는 시간이 너무 오래걸린다...

본 대회에서 feature뽑는데만 약 4시간정도를 사용한거 같다.


대회에 가져간 노트북은 LG 그램... 심지어 2016년도 모델이다.

컴퓨팅 속도도 문제였지만 다음에 이런대회가 있을때는 feature뽑는 알고리즘도 개선 시켜야할꺼같다.


또한 파트너한테도 feature뽑는걸 공유를 해줬어야했는데 이점이 아쉽게 느껴졌다.


그래도 뒤늦게라도 opcode뽑는 파일을 파트너한테 전해줘서 그나마 시간이 단축된듯...


본 챌린지에서 사용한 feature는 opcode는 약 250개, API는 약 4000개 가량 사용을 하였다.

4시간을 이용하여 뽑은 feature csv파일을 가지고 이제 학습 단계로 들어갔다. 여기서 또 문제점을 발견하게 되는데..ㅠㅠ


학습 단계 포스팅은 2편으로!!

반응형

'TIL > 개인공부' 카테고리의 다른 글

[Pytorch] numpy에서 torch, torch에서 numpy  (0) 2020.01.04
[2018 데이터챌린지] 악성코드 탐지 후기 2편  (0) 2018.11.11
[IOCP] 클라이언트 코딩  (0) 2018.09.17
[IOCP] 서버 코딩 연습  (0) 2018.09.17
공부2  (0) 2018.09.14