<Fig1. 보도자료>



2014년 11월 24일에 소니 픽쳐스 엔터테인먼트 공격에 쓰였던 샘플 2종을 분석한 경험이 있는데 기사 본문에서 나오는 코드는 전혀 보지 못했던 코드다....


파일 정보 : https://virustotal.com/ko/file/E2ECEC43DA974DB02F624ECADC94BAF1D21FD1A5C4990C15863BB9929F781A0A/analysis/


파일 정보 : https://virustotal.com/ko/file/4D4B17DDBCF4CE397F76CF0A2E230C9D513B23065F746A5EE2DE74F447BE39B9/analysis/


sony malware 분석 내용 : http://kkoha.tistory.com/entry/sony-malware-analysis


2014년 11월 소니픽처스 공격과 2015년 12월 발생한 베트남 은행 공격, 그리고 올해 2월 발생한 방글라데시 중앙은행 공격에서 사용된 악성코드의 비교 결과 파일삭제 기능의 함수 코드 진행 부분이 매우 유사하다는 것이다. 그러나 이번 해킹사건이 북한의 소행이라고 단정 짓기는 어렵다는 게 이슈메이커스랩 측의 설명이다. 


기사 내용 : http://www.boannews.com/media/view.asp?idx=50617



이런 내용을 공유할 때는 hash 라도 좀 달아주면 좋겠다. 이슈메이커즈랩에서 분석 했다는 소니 악성코드가 변종일 수 있겠지만 FBI 수사 결과 발표에 공유된 놈과는 다르다.



<Fig2. sony>


sony 건의 특이점은 3번의 MBR wipe 기능과 파일 삭제 시 windows, program files 폴더는 예외 처리한뒤 exe파일과 dll파일이 아닌 파일만 WriteFile 함수를 통해 파일 크기만큼 가비 데이터로 덮어쓴 뒤 DeleteFileW 을 사용하여 삭제 하였다.




<Fig3. BBSWIFT>


기사에 나온 파일 정보 : https://virustotal.com/ko/file/AE086350239380F56470C19D6A200F7D251C7422C7BC5CE74730EE8BAB8E6283/analysis/


Bangladesh Bank’s (BB) SWIFT payment system 건 같은 경우 파일 경로명을 인자값으로 받아 해당 경로에 있는 파일을 WriteFile 함수를 통해 파일 크기만큼 0x00 데이터로 덮어쓴다.  

이후 rand 함수로 파일이름을 생성한뒤 (ex c:\1.txt -> c:\qhrsh) 

파일명을 삭제하기 위해 MoveFileA 함수로 파일명 변경 뒤 DeleteFileA 함수로 삭제한다.



구성도 및 분석 내용은 이미 baesystem에서 잘 분석되어 있어서 참고 바람.

전문 http://baesystemsai.blogspot.kr/2016/04/two-bytes-to-951m.html

저작자 표시
신고
Posted by kkoha 트랙백 0 : 댓글 0



The MIX transformation of RC2; four of these comprise a MIXING round


General

Designers      : Ron Rivest

First published : leaked in 1996, designed in 1987


Cipher detail

Key sizes      : 8–1024 bits, in steps of 8 bits; default 64 bits

Block sizes     : 64 bits

Structure        : Source-heavy unbalanced Feistel network

Rounds          : 16 of type MIXING, 2 of type MASHING



This module implements the RC2 (Rivest's Cipher version 2) encryption algorithm in pure python, specified in RFC 2268.


ECB and CBC modes are supported.


Original source code : https://github.com/0xEBFE/RC2-python/blob/master/rc2.py


Backporting Python 3 Code to Python 2.7.x by koha <kkoha@msn.com>


Quick start


Install from PyPIhttps://pip.pypa.io/en/latest/installing.html


pip install rc2


Example RC2 usage


from rc2 import *

#RC2 ECB encryption.
plaintext = "hello_word_ECB"
key = "test key"

rc2 = RC2(key)
encrypted = rc2.encrypt(plaintext,MODE_ECB)
print encrypted.encode('hex')

#RC2 ECB decryption.
rc2 = RC2(key)
decrypted = rc2.decrypt(encrypted,MODE_ECB)
print decrypted

#RC2 CBC encryption.
plaintext = "hello_word_CBC"
key = "test key"
iv = "\x01\x02\x03\x04\x05\x06\x07\x08"

rc2 = RC2(key)
encrypted = rc2.encrypt(plaintext,MODE_CBC,iv,PADDING_PKCS5)
print encrypted.encode('hex')

#RC2 CBC decryption.
rc2 = RC2(key)
decrypted = rc2.decrypt(encrypted,MODE_CBC,iv,PADDING_PKCS5)
print decrypted


https://pypi.python.org/pypi/rc2

저작자 표시
신고
Posted by kkoha 트랙백 0 : 댓글 0


온라인 AOS 게임 부정행위 탐지 연구 : 리그 오브 레전드를 중심으로


Research on detect abusing play in AOS game - Focused on League of Legends


AOS 게임은 장르 특성 상 게임 머니가 플레이에 미치는 영향이 적으며, 유저 계정의 랭크 등급이 보다 높은 가치를 가진다. 즉, AOS 게임에서 나타나는 부정행위는 랭크 등급과 연관성을 가지며 자동 레벨 업 BOT이나 대리 랭크 플레이의 형태로 발생한다. 본 논문에서는 BOT과 대리 랭크 플레이의 현황과 특징에 대하여 살펴본 후, 유저의 게임 로그 분석을 통해 부정행위를 탐지하는 방법에 대하여 논할 것이다.



ABSTRACT

In AOS game, rank of user’s game account is much more significant than game money is. As ar result, cheating in AOS game is typically auto level-up BOT or rank abusing.  In this study, we will analyze current states and possible traits of auto level-up BOT or rank abusing and suggest methods to detect those cheating using analysis of user’s game log. 



1. 서론


AOS 게임은 다수의 플레이어가 팀을 이루어 각 플레이어가 하나의 챔피언을 선택하여 상대방의 기지를 파괴하는 것을 최종적인 목적으로 하는 게임이다.

League of Legends(이하 ‘LOL’)은 세계적으로 최다 접속자수를 보유한 AOS 게임이다. LOL에서 유저에게 경쟁을 유발하는 요소는 랭크 등급으로 유저의 실력을 가늠할 수 있도록 하는 요소이다. 아이템의 현금화가 불가능한 LOL의 특성상 게임상 부정행위의 대다수는 랭크 등급과 관련되어 발생한다.

본 논문에서는 랭크 등급과 관련한 부정행위를 예비 단계인 ‘BOT’과 착수 단계인 ‘대리 랭크’로 구분하고 Riot API를 통해 얻은 LOL의 게임 로그 정보를 분석하여 각각의 행위를 탐지하는 방법에 대하여 기술할 것이다.



2. LOL에서 발생하는 부정행위


2.1 LOL의 Rating System의 이해


LOL에서 발생하는 부정행위를 이해하기 위해서 우선적으로 LOL의 랭크 등급을 산정하는 Rating System을 살펴볼 필요가 있다.

LOL의 유저는 게임 플레이를 통해 경험치를 얻고, 유저 계정의 레벨 올리게 된다. 유저는 레벨이 30에 도달한 순간부터 랭크 게임에 참여할 수 있는 자격을 얻게 된다. 최초로 랭크에 참여하게 되는 유저는 등급이 없는 상태로 10번의 랭크 게임을 진행하여 그 게임 결과를 토대로 자신의 랭크를 부여받게 된다.

LOL의 랭크는 Bronze, Silver, Gold, Platinum, Diamond, Master, Challenger 총 7가지 단계로 구분되며 각 랭크가 차지하는 백분위는 [표-1]과 같다.


RANK

Percentile

Bronze

68% 이하

Silver

30% 이하

Gold

11% 이하

Platinum

2.3% 이하

Diamond

0.04% 이하

Master

0.0088% 이하

Challenger

0.0% 이하


[표 1 -  LOL Rating Percentile] 


랭크 등급은 다시 5단계의 하위 등급으로 구분되어 각 Rank별로 1~5등급으로 나뉘게 된다. 랭크 게임의 승패에 따라 유저는 LP(Rank Point)를 얻으며, LP가 100에 도달하면 승급전(3판 2승)자격을 얻게 된다. Bronze-2에 배치된 유저가 Silver-5로 승급하기 위해서는 LP 100을 채운 후 승급전에 성공하여 Bronze-1로 승급한 후 다시 LP 100을 채워 승급전에 성공하여야 한다.


랭크 등급이 유저에게 강한 유인을 발생시키는 원인은 사회학적으로 랭크가 가지는 사회적 지위와 연관되어 있다. Riot은 매 시즌이 끝날 때마다 유저에게 보상을 제공하는데, 이는 다른 유저에게 자신이 지난 시즌에 어떤 랭크에 속했다는 것을 자랑하는 수단이 된다. 즉, 랭크는 게임과 실제 사회 모두에서 유저의 지위를 표창하는 수단으로 작용하는 특성을 가지고 있다.


LOL은 5인 팀플레이라는 게임 특성에 따라 다른 팀원의 실력이나 트롤링 유무가 승패를 좌우하는 경향이 높아 특정 랭크에서 자신의 실력에 해당하는 랭크로 승급하지 못하고 정체되는 구간이 존재한다. 특히 트롤링 유저 비율이 높은 Bronze 구간에서 정체 경향이 강하며, 승리 확률이 50%에 근접한 경우 랭크 상승은 자명하게 불가능하므로 유저의 입장에서는 다음과 같은 선택에 이르게 된다.


첫째로, 새로운 계정을 다시 키워 랭크 게임을 시작하는 방법이다. 60% 이하의 승률을 가진 Bronze 유저의 경우 새로운 계정을 만드는 것이 더 이익일 수 있다.


둘째로, 실력이 뛰어난 타인에게 랭크 게임을 대리 수행하게 하며 계정의 랭크를 상승시키는 방법이다. 금전 거래 형식으로 발생하며, 주로 준 프로게이머들이 대리 랭크 작업에 참여한다.


2.2 LOL의 BOT


앞 절에서 기술한 새로운 계정을 만드는 방법에는 ‘시간’이라는 요소가 비용으로 작용한다. 매 게임을 승리할 경우 유저는 평균적으로 140정도의 경험치를 얻으며 30레벨에 도달하기 위해서는 40000의 경험치가 필요하다. 패배 시의 경험치는 승리시의 절반수준이며, 평균 플레이 시간이 30분 정도인 것을 감안할 때 약 190시간이 소요되어. 하루 3시간을 투자할 경우 2달가량이 필요하다.

BOT은 이러한 과정을 자동화하기 위하여 등장하였다. 




[그림 1 - BOT 클라이언트의 게임 화면] 


[그림 1]과 같이 BOT은 특정한 경로만을 움직이며 사전에 정의된 이벤트에 의해서만 반응하도록 설계되었다. 




[그림 2 - BOT 의심 계정의 게임 로그]


즉, 일반 유저 게임에서 발생하는 예측 불가능한 상황에 대응하지 못하여 [그림 2]의 게임 로그에 나타나는 바와 같이 AI대전만을 플레이하며, 선택 챔피언의 동일성, 장시간의 플레이 같은 사람의 플레이와 구별되는 특징을 가진다.



2.3 LOL의 대리 랭크


LOL의 대리 랭크는 상위 0.1%의 실력에 해당하는 준 프로게이머 급 유저가 요금을 받고 요청받은 랭크에 도달할 때까지 플레이를 대신하는 형태로 진행된다.

플레이어의 랭크 실력을 나타내는 또 다른 요소는 MMR(Match Making Rating)이다. MMR은 상대편을 고르는 기준으로, 게임에서 연승할 경우 급격히 증가한다. MMR에 따라 승리 보상이 지속적으로 증가해, 높은 실력의 유저는 빨리 상위 랭크로 진급하게 되며 요행으로 유저가 연승을 하는 경우를 방지하게 된다.

Master와 Challenger 등급에 속하는 대리 유저는 2000 이상의 MMR을 보유하고 있어 MMR 상승이 승패에 영향을 거의 미치지 않는 플레이 성향을 보인다.





[그림 3  대리 유저의 랭크 게임 로그] 


[그림 3]은 실제 대리 랭크 사이트에서 작업을 의뢰한 계정의 게임 로그이다. 좌측하단에서 상단으로 정렬한 로그를 살펴보면 MMR이 지속적으로 상승함에도 연승 추세가 강하게 보이는 것을 알 수 있다.


대리 랭크에서 나타나는 또 하나의 특징은 듀오 플레이다. 랭크 게임은 유저의 친구와 함께 2인의 파티를 구성하여 플레이 할 수 있으며 이 경우에는 MMR이 더 높은 상대를 만나게 되는 패널티를 받게 된다. 그러나 전술한 것과 같이 MMR이 2000이상인 대리 유저에게는 패널티에 비하여 자신과 비슷한 실력의 유저와 함께 2개의 계정의 대리 랭크를 플레이하는 것이 더욱 효율적이다.


또한 계정의 실제 유저와 대리 랭크 플레이어는 플레이 챔피언에 있어서도 다른 양상을 보인다. 랭크 게임의 목적 자체가 승리에 있으므로 플레이어는 자신에게 익숙한 챔피언을 선택하여 게임을 진행하는 것이 자명하다. 자신의 선호와 관계없는 새로운 챔피언을 통해 연승을 만들어내었다면 그러한 선호를 지속적으로 유지하는 것이 일반 유저에게는 정상적이다.


이를 종합하여 볼 때 대리 게임에서 나타나는 특징은 과도한 랭크 게임의 연승 구간, 파티 플레이의 존재, 연승 구간을 제외한 다른 구간과는 다른 챔피언 선호도로 선정할 수 있다.



3. 로그 수집


본 논문의 연구에서 사용한 로그는 다른 수단을 거치지 않고 오로지 Riot에서 제공하는 API만을 사용하여 수집하였다.


3.1 Riot API


LOL의 제작사인 Riot에서는 LOL의 게임 데이터를 개발자들이 사용할 수 있도록 API 형태로 제공하고 있다. API는 12개의 카테고리로 구성되어 있으며 세부 항목으로 제공되는 API에서 유저와 플레이된 게임에 대한 상세 정보를 얻을 수 있다. 


3.2 로그 수집의 한계


Riot에서 제공하는 로그를 통한 분석은 다음과 같은 한계를 가진다.


1. 유저의 계정과 플레이 게임은 각각 고유한 Ids값을 가진다. Ids값은 연속하지 않은 오름차순 형태로 완전 검색이 시간상 불가능하다.


2. 랭크 게임을 제외한 AI 게임에서는 플레이 유저에 대한 정보를 보존하지 않아 매칭이 불가능하다.


3. 유저가 플레이한 게임 리스트는 특정 개수를 넘기면 새로운 데이터로 갱신된다.


4. 하루에 발생하는 게임의 수가 100만 게임에 달하여 장기간의 데이터 축적이 불가능하다.


다음의 각 장에서는 ‘BOT’과 ‘대리 행위’에 대한 구체적인 데이터 수집 모델과 분석 방법 및 결과에 대하여 제시할 것이다.


4. BOT 탐지


4.1 Feature 선정


BOT 탐지를 위한 Feature는 다음과 같다.

1. 유저가 플레이한 최근 게임의 다수가 AI대전에 속한다.

2. 유저의 플레이 챔피언이 동일하게 반복되는 경향을 보인다.

3. 플레이 시간이 연속적인 경향이 강하다.


4.2 수집 및 분석 모델


본 논문에서는 6월 12일자에 생성된 ID를 기준으로 기준 ID보다 이전에 생성된 ID 176,457개에 대하여 분석을 수행하였다. 일반 게임과 달리 AI대전은 Riot에서 유저 식별 정보를 보존하지 않는 경우가 발생하여 사용자의 최근 게임 로그로 게임 로그를 대체하였다. 최근 게임은 10개 이하로 갱신되어, 정확한 로그 수집을 위해서는 실시간으로 대상 ID의 최근 게임 정보를 수집하여야 하였지만 현실적으로 불가능하여 본 논문에서는 분석 ID의 범위를 넓히는 방향을 선택하였다. 전체적인 흐름도는 [그림 4]와 같으며 상세 과정은 다음과 같다.



[그림 4  BOT 탐지 과정 흐름도]


수집 Clinet는 Riot API를 사용하여 UserIds 통해 계정의 존재 유무와 최근 게임 로그를 다운로드한다. 이후 로그에서 필요한 Feature만을 선별한 후 Profiler에게 전송한다.

Profiler는 전달받은 유저의 게임 로그의 Feature를 시간 순으로 분석 후 추정치를 계산하여 결과를 Result DB에 저장한다.


4.3 분석 알고리즘


전달된 데이터는 두 가지의 조건이 맞을 경우 추정치 계산 대상으로 선정된다.


첫 번째 조건은 계정의 레벨이 16이상 이라는 것이다. 낮은 레벨의 유저인 경우 게임에 대한 이해를 위해 AI대전을 반복하여 플레이하는 경우가 빈번하며 C1을 적용하지 않은 경우 10레벨 미만의 계정이 다수 탐지되어 BOT으로 확정할 수 없다.


두 번째 조건은 AI대전이 아닌 로그가 2개 이상인 계정은 제외시킬 것이다. 유저 당 확보 가능한 로그의 한계치가 10개이므로 이 중에서 2개 이상을 다른 모드로 플레이 한 경우 BOT으로 확정하는 것이 정확도가 떨어진다.

추정치 S를 얻기 위해서 다음과 같은 변수를 설정하였다.


챔피언 반복도(r) : 동일한 챔피언을 선택하는 경우 반복 정도 횟수에 따라 10%의 가중치를 거듭하여 곱한다.

시간 연속성(t) : 연속한 게임의 플레이 사이의 대기 시간이 허용된 오차범위(15분)일 경우 10%의 가중치를 거듭하여 더한다.





4.4 분석 결과 및 검증


수집된 176,457개의 ID에 대하여 위 알고리즘을 적용하여 상위 500등의 추정도를 가지는 계정 목록 확보하여, 해당 의심 계정들의 이후 플레이 형태를 실제 BOT의 플레이를 비교한 결과 [그림 5]와 같이 100개의 계정이 실제 BOT의 추정치와 유사한 값을 나타내었다.



[그림 5 - 상위 500위의 추정치 그래프]




[그림 6 - BOT 의심 유저의 게임 로그]


[그림 6]은 탐지된 유저 중 하나의 플레이 형태로 [그림 3]의 봇 계정과 유사한 로그를 가지고 있음을 확인하였다.



5. 대리 랭크 탐지


5.1 Feature 선정


대리 랭크 탐지를 위한 Feature는 다음과 같다. 

F1. 사용자가 플레이한 랭크 게임 로그 중 승리 수가 평균 이상으로 많은 구간

F2. 해당 구간의 게임에서 KDA 점수

F3. 해당 구간에서 파티 플레이 여부

F4. 해당 구간에서 챔피언 선택의 이질성


5.2 수집 및 분석 모델


본 논문에서는 대리 랭크 탐지를 분석을 위하여 6월 5일부터 6월 12일까지 진행된 1,600,000건의 랭크 게임 로그를 수집하였다. 전체적인 흐름도는 [그림 7]과 같으며 상세 과정은 아래와 같다.




[그림 7 - 대리 랭크 탐지 알고리즘 흐름도]



수집 Client는 Riot API를 사용하여 Match Ids를 통해 DB로부터 게임 로그를 다운로드한다. 이후 로그를 통해 랭크 게임 여부를 판별한 후 분석을 위한 Feature만을 선별하여 Match DB에 저장한다.

Match DB에 저장된 각각의 게임 로그를 파싱하여 게임 참가 유저의 ID를 얻어 ID별로 참여한 게임의 데이터를 SummonerDB에 누적한다.

Profiler는 각각의 ID에 대해 각 ID의 랭크 게임 이력을 분석하여 대리 랭크 추정 결과를 Result DB에 저장한다.


5.3 분석 알고리즘


대리 랭크 분석 알고리즘은 유저의 개의 플레이 기록 중 연속한 개()의 게임 구간을 전수 조사하여 가장 높은 결과를 얻은 추정치를 사용한다.

연승 점수(w) : 승리(1점), 패배(-1점)으로 구간에서 발생하는 연승 및 연패에 대하여 연승 카운트 에 대해 을 추가

KDA 점수(k) : [0-2], [2-3], [3-4], [4-5], [6~]으로 구분하여 가중치 적용. 패배시 1로 세팅

파티 플레이(p) : 파티 플레이어 게임 중 승리 게임에 대하여 0.2의 가중치 적용

챔피언 이질성(r) : 해당 구간을 제외한 나머지 구간에서 해당 챔피언의 빈도에 따라 패널티 부여





5.4 분석 결과 및 검증


수집된 랭크 게임 로그를 통해 총 15,186,307개의 계정에 대한 게임 이력이 확보되었으며 최소 구간의 길이는 10으로 설정하였다.

분석된 추정치 중에서 상위 400개의 계정에 대한 통계는 최댓값 189, 최솟값 47을 나타내었다.  추정치가 높은 상위 400개의 계정에 대한 사후 추적을 위하여 해당 계정의 게임 로그 데이터를 통해 랭크 상승치를 계산한 결과 [그림 8]과 같이 전체 조사된 계정과 다음과 갈은 랭크 상승 폭의 차이를 확인하였다.



[그림 8 - 대리 의심 계정과 정상 계정의 랭크 상승 평균치]


5. 결론 및 추후 연구


본 논문에서는 AOS 장르 게임인 LOL에서 제공하는 대용량 로그를 통해 BOT과 대리 랭크 행위에 대한 탐지를 수행하였으며 각각 한계점을 가지고 있다.

BOT 탐지에서는 유저의 최근 게임을 제외하고는 개별적으로 게임과 유저를 매칭할 수 있는 수단이 없어 유저 집단의 크기와 유저별 로그의 개수 중에서 한쪽을 선택할 수밖에 없었다. 이를 해결하기 위해서는 특정한 레벨 구간(ex. 20~30)에 해당하는 유저로 대상을 특정하고, 초기 수집 과정에서 게임 이력을 통해 BOT으로 의심될 요건을 갖춘 유저를 실시간 수집 대상에 놓는다면 기존의 연구의 유저 집단보다 크면서도 많은 개수의 로그를 확보할 수 있어 참고 사이트를 통해서 추가 확인을 하지 않고도 정확도의 상승을 기대할 수 있다.

랭크 게임의 탐지에서는 하루에 발생하는 랭크 게임과 참여 유저가 너무 많아 장기간에 걸친 로그 분석이 불가능했다. 충분한 기간의 로그를 수집할 수 있는 경우에는 랭크 대리 이전과 이후의 그래프를 직접 구성할 수 있으므로 정확도를 기대할 수 있을 것이다.


REFERENCES


[1] https://developer.riotgames.com/

[2] http://www.op.gg/

[3] http://www.fow.kr



PS


패치 한방으로 쓰던 논문 하나가 날라가 버렸다...


http://event.leagueoflegends.co.kr/preseason2016/ranked-improvements.php

이번 시즌에 랭크 게임 개인/2인전을 ‘자유 팀 대전’으로 변경할 계획입니다. ‘자유 팀 대전’은 기존처럼 혼자서 참여할 수도 있지만, 둘, 셋은 물론이고 다섯 명이서 팀 조합을 완전히 갖춰서 플레이할 수도 있습니다. 인원수 제한 없이 친구들과 함께 랭크 게임 래더에 도전할 수 있는 것이죠. 이제 파티로 랭크 게임을 플레이하는 경우에 불이익이 주어지지 않기 때문에, 친구를 모아서 도전할수록 언제나 더 유리할 것입니다. 


......ㅠ


저작자 표시
신고
Posted by kkoha 트랙백 0 : 댓글 2

티스토리 툴바