'Memory Loader'에 해당되는 글 1건

올만?에 다시 돌아왔다.


갠드크랩(GandCrab)부터 소디노키비(Sodinokibi) 안랩에서는 현재 블루크랩(BlueCrab) 이라고 부르며 유포하고 있는 것으로 추정되는 공격 주체가 최근 그 목적이 랜섬웨어 정보 탈취로 변경되어 유포중에 있는 것을 확인하였다. 갠드크랩 시절부터 불특정 다수를 대상으로 공격을 시도한 것으로 추정되며 주로 메일 내용 또는 첨부파일에 한글로 된 내용을 포함시켜 사용자의 열람을 유도하도록 한다. 

현재 유포되고 있는 파일들이 악성행위를 수행하기 위해 코드를 메모리에 로드하여 동작시키는 과정에 대해서만 분석을 해보았다. 사실 갠드크랩, 소디노키비 등 코드를 메모리에 로드하기까지의 과정이 현재 유포되고 있는 형태뿐만 아니라 파워쉘, 자바스크립트 등 다양하게 존재하였기에 참고만 바란다. 

 

 

분석 :
유포된 악성코드는 특정 주소에 위치해 있는 데이터를 읽어와 저장한다. 저장한 데이터는 쉘코드의 위치와 크기를 가져오기 위함이며 메모리 공간을 할당받아 파일 내부에 포함된 데이터를 이동하여 복호화 과정이 이루어진다. 이후 권한을 주고 할당된 메모리 공간에 있는 데이터를 실행시켜주며 로더로서 기능을 마무리한다. 

1. 쉘코드 주소와 사이즈 그리고 가비지 코드 & 정크 코드 
쉘코드의 위치와 크기를 계산하기 위해 특정 주소에서 데이터를 가져와 사용한다. 데이터를 가져오는 과정에서 사용하지 않는 코드가 다수 포함되어 있으며 분석 속도를 늦추기 위함 또는 메모리 공간에 있는 데이터를 숨기기 위한 목적으로 보인다. 

 

동작에 있어 필요한 코드

저장된 각각의 4byte 크기의 데이터에 0xAC585를 합산하여 사용하며 합산된 데이터는 쉘코드의 크기와 위치를 구하는 데 사용된다. 이후 LocalAlloc()을 통해 메모리 공간을 할당하여 1byte씩 데이터를 삽입한다. (여러 샘플을 확인해본 결과 이와 같은 방식으로 쉘코드의 위치와 크기를 가져오며 합산하는 데이터는 가변적으로 사용하는 듯하다.)

쉘코드 크기 및 위치를 구하기 위해 합산

2. 복호화 및 실행
해당 악성코드에서는 두 번에 걸쳐 복호화가 이루어진다. 첫 번째 복호화를 위해 LocalAlloc()으로 메모리 공간을 다시 할당하며 처음 할당받은 메모리 공간에서 4byte 크기의 데이터를 읽어온다. 그중 마지막 1byte를 복호화 연산에 사용할 데이터로 이용하여 남은 3byte 크기의 데이터에 대해 연산 과정이 이루어지고 첫번째 복호화가 끝이 난다. (3byte만 사용하기에 최초 복호화에 사용된 데이터 크기와 복호화 후의 데이터 크기가 다른 것을 확인할 수 있다.)

1차 복호화 전 데이터

두 번째 복호화 루틴에서는 처음 1차 복호화된 데이터에서 4byte씩 두 번에 걸쳐 읽어와 저장한다. 이후 고정된 20byte 크기의 데이터를 4byte씩 각각 저장하여 복호화 연산에 사용할 데이터로 사용한다. 두번에 걸친 복호화 과정에서도 위에서 언급했다시피 사용하지 않는 코드가 다수 포함되어 있어 분석이 조금 까다로울 수 있다. (사실 내가 잘 몰라서 어려운 듯 하다.)

IDA에서 해석되는 2차 복호화 루틴

이후 VirtualProtect()로 권한을 할당하고 할당된 메모리의 시작 위치에서 0x1B2E 위치의 데이터를 실행하며 로더로서 역활을 마무리하게 된다.

 

 

(피드백은 언제나 환영입니다)

블로그 이미지

bbbbox

해당 블로그는 개인 저장공간으로 악의적으로 응용할 시 피해가 발생할 수 있으며, 그에 대해 책임은 사용자에게 있습니다. 주의해주시길 바랍니다.

,