티스토리 뷰
가끔 취미로 악성코드를 분석하는데 이상한(?) 놈을 발견해서 남겨본다. (2017년 11월에 제작됨)
메인 악성코드는 DLL 파일로 서비스에 등록되어 동작한다. (이놈을 만드는 상위 놈은 찾지 못함)
DLL은 스레드를 생성해서 행위를 수행하며, 코드를 살펴보면 XOR 루틴으로 코드 내부를 디코딩하는걸 캐치할 수 있다.
디코딩된 부분은 악성코드의 핵심 부분이다. 역시 이상한(?) 놈답게 API 함수를 그냥 갖다 쓰지 않는군.. 고얀 녀석 같으니
먼저 dnsapi.dll 로드하고, DnsQuery_A, lstrlenW 호출 시 매번 아래 그림과 같은 수상한 짓을 수행한다. 메모리에 로드된 DLL을 다 접근하여 API 함수명에 ROR 0xD를 적용시켜 특정 값을 만들어 낸다. 만약, 제작자가 지정한 값일 경우 API 주소를 가져와서 호출한다.
- 0xC99CC96A : DnsQuery_A
- 0xCC8E00F4 : lstrlenW
자.. 그렇다면 DNS 쿼리를 어디에 이용할까? 그렇다. 이상한 놈은 C&C 서버에서 추가 PE를 받아오기 위해 사용한다.
그냥 남들과 똑같이 만들 순 없는 거 였니....? 작년에 DNS 쿼리를 이용한 넷사랑도 있었지 허허
C&C 서버에 쿼리를 계속 날리며 응답 데이터를 차곡차곡 쌓아간다. 언제까지? 0xFF (255 byte) 이하의 응답이 올 때까지!
- C&C 주소 : (***).stage.5*****7.update.microsoft*****.com
와이어샤크를 이용해서 패킷을 떠봤다. 역시나 마구마구 DNS 쿼리를 날리는 상태이다. 도메인 맨 앞의 3글자는 위에 루틴에 의해 계속 바뀌는 특징이 있다. 음? 근데 작년 11월 악성코드인데 데이터를 받아온다고?? 제작자가 그냥 내버려 둔 건가.. 땡큐ㅎ
어느 정도 시간이 지났을까, 다음 단계로 넘어갈 수 있었다. 데이터들은 의미 없는 값으로 보이지만 역시나 첫 부분에 쉘코드가 숨어 있었다.
하.. 이놈은 정말 특이하다. 아래 그림을 보면 2byte가 수정되고 코드를 진행하는 것을 알 수 있다. 왜 저렇게 했는지 이해 불가다
밑에 0x5C 만큼의 크기를 디코딩한다. 거 참 형님 한 번에 합시다 쫌!!
두 번째 디코딩 루틴이다. 특이한 점은 0x676F676F (gogo) 헥스 값을 찾아 이후를 디코딩한다. 디코딩 키 값은 뒤에 있는 값들로 매번 바뀌며 마지막에 0x6161 (aa)인 경우 디코딩을 그만둔다.
다음 악성코드로 가자는 의미인가? gogo? 아래 그림을 보면 익숙한 "MZ" 시그니처를 확인할 수 있다.
훗 이제 끝인가?라고 생각하겠지만.... 아니다. JMP EAX를 따가면 "MZ" 시작 위치이다. 세상에나
위에 그림을 보면 "MZ" 시그니처 바로 뒤에 이상한 것이 삽입된걸 캐치할 수 있다. CALL EBX는 어디로 보내는 걸까?
바로! 디코딩된 PE의 Export 함수 ReflectiveLoader() 이다. 저 함수는 파일 형태로 존재하는 바이너리를 메모리에서 바로 실행하게 해준다. 요즘에 공개된 자료와 코드도 많아서 많이들 쓴다. 짜식
추가 바이너리를 메모리에 매핑시킨 후 DllEntryPoint()로 진입하는 광경을 볼 수 있다. 끄읏~
※ 메모리에서 동작하는 추가 DLL 파일은 백도어 기능을 가졌고, DNS 쿼리 방식을 이용해 C&C와 통신함.
분석당시 명령을 내리진 않았음.