데이터 인코딩

Kail-KM
|2015. 8. 26. 01:54

악성코드 분석 과정에서 데이터 인코딩이란 의도를 숨길 목적으로 내용을 수정하는 모든 형태를 말한다. 즉, 악성코드는 악의적인 행위를 숨기기 위해 인코딩 기법을 사용하므로, 악성코드 분석가로서 악성코드를 완전히 이해하기 위해 이런 기법들을 이해해야 한다.


인코딩 알고리즘 분석의 목적


악성코드는 인코딩을 다양한 목적으로 사용하는데 일반적으로 네트워크 기반 통신의 암호화를 위해 사용한다. 악성코드는 내부 작업을 숨기기 위해서도 인코딩을 사용한다. 예를 들어 다음과 같은 목적으로 인코딩을 할 수 있다.

- C&C 도메인 같은 설정을 숨기기 위하여

- 정보를 훔치기 전에 임시 파일에 저장하기 위하여

- 악성코드에서 사용하는 문자열을 저장하고 사용하기 전에 디코딩하기 위해

- 악의적인 활동에 쓰이는 문자열을 숨김으로써 악성코드를 정상적인 도구로 가장하기 위해


단순 암호화


단순 인코딩 기법은 사람이 읽지 못하게 변경하거나 데이터를 다른 문자셋으로 전환하기 위한 데이터 변경에 자주 사용된다. 단순 암호화는 정교하지 않아 자주 가치가 없다고 간주되지만, 다음과 같이 악성코드에 이점을 제공한다.

- Exploit Shell Code 같은 공간 제약이 있는 환경에 사용할 수 있을 만큼 충분히 작다.

- 더 복잡한 암호화보다 덜 명확하다.

- 부하가 적게 발생하기 때문에 성능에 미치는 영향이 작다.


시저 암호

초기 암호 중 하나가 바로 Caesar Cipher이다. 시저 암호는 알파벳을 오른쪽으로 3문자를 옮기는 단순 암호다. 

ATTACK AT NOON 

 DWWDFN DW QRRQ



XOR

XOR 암호는 시저 암호와 유사한 단순 암호다. XOR 암호는 고정된 바이트 값을 사용해 논리적 XOR 연산을 함으로써 평문의 각 바이트를 변경한다. 여기선 하나의 기준 값이 주어져야 하는데 바로 어떠한 값과 XOR 연산을 할 것인가이다. 아래는 0x3C와 XOR 암호화를 진행한 것을 보여준다.

0x41 0x54 0x54 0x41 0x43 0x4B 0x20 0x41 0x54 0x20 0x4E 0x4F 0x4F 0x4E (ATTACK AT NOON )

0x7D 0x68 0x68 0x7D 0x7F 0x77 0x1C 0x7D 0x68 0x1C 0x72 0x71 0x71 0x72                        

여기선 문자로 출력이 불가능한 문자들을 포함하기도 한다. 이렇게 XOR 암호는 단 하나의 머신 코드만을 필요로 하기 떄문에 간단하고 양방향성을 갖고 있기 떄문에 편리하다고 할 수 있다. 또한 양방향 암호는 인코딩과 디코딩에 동일한 함수를 사용하므로 디코딩을 할 때에도 동일한 키를 가지고 XOR 연산을 시행하면 된다.




무차별 대입 XOR 인코딩

악성코드 분석을 진행 중이라 가정할 때 리소스 섹션에 아래와 같은 Hex 값이 존재한다고 가정하자. 리소스 섹션은 주로 프로그램의 실행에 필요한 이미지나 아이콘 같은 정보들을 포함하기도 하지만 별도의 EXE나 DLL을 리소스 섹션에 포함하고 있을 수가 있다. 여기서 우리는 Resource Data Entry에 따른 위치에 아래의 값이 있을 경우 많은 부분이 0x50('P')로 되어 있는 것을 확인할 수가 있다. 이를 통하여 0x00이어야 할 부분이 0x50이라고 의심할 수가 있다. 

하지만 조금 더 확실한 단서들을 알아보자면 윈도우에서 EXE나 DLL이 내장되어있으므로 00000000~00000001 부분에 "MZ"가 나타나야 한다. 위에선 첫 바이트가 0x1D 이므로 "M"의 값인 0x4D와 XOR을 하면 해당 키를 알아낼 수가 있다. 이렇게 XOR 연산의 경우 인코딩이 되었다는 것을 인지만 하면 디코딩 또한 간단하다.


NULL Byte 보존 XOR 인코딩

위의 예에서는 너무나 많은 0x50 값으로 인하여 쉽게 XOR 인코딩을 알아낼 수가 있었다. 여기서 악성코드 제작자는 NULL-Preserving 단일 바이트 XOR 인코딩 구조를 이용해 이 문제를 해결할 수가 있다. 일반적인 XOR 인코딩 구조와 달리 널 보존 단일 바이트 XOR 구조는 2가지 예외를 가진다.

- 평문 문자가 NULL이거나 키일 경우에는 해당 바이트는 지나친다.

- 평문 문자가 NULL 또는 키가 아닌 경우에는 키와 더불어 XOR 연산을 통해 인코딩 한다.

아래의 사진 2장을 보면 .docx 확장자이다. 맨앞에 PK가 존재하는데 여기선 NULL 과 키 값을 보존하기 위하여 널 보존 단일 바이트 XOR 인코딩을 진행하였다. 그 결과 두 번쨰 사진과 같이 0x50('P')와 0x00(NULL)이 보존되어있으므로 인코딩을 알아차리기가 위의 예에 비하여 어렵다. 또한 여기서 우리는 확장자가 .docx라는 것을 알고 있기에 키 값을 찾는 것이 쉬웠지만 만약 어떠한 파일이 리소스 섹션에 포함되었는지를 알지 못할 경우 각 파일의 구조와 직접 비교하여 키 값을 찾아내어야 어떠한 파일인지 확인할 수가 있다.

XOR 반복문 파악

인코딩 되어 있는 프로그램의 경우 상세 분석을 통하여 쉽게 프로그램의 디코딩 과정을 찾을 수가 있다. 인코딩된 프로그램의 경우 그 자체 그대로 실행을 할 경우 명령어가 망가져있기 떄문에 보통 프로그램이 메모리에 로드되고 명령어의 초반 부분에 디코딩 루프가 존재하고 있다. 아래는 ap0x patch me1 문제로써 아래와 같은 디코딩 루프가 여러 곳에 존재한다.

굳이 XOR 연산을 한번만 하는 것이 아니라 여러번에 걸쳐서 좀 더 복잡하게 만들 수가 있다. 이러한 디코딩 루프는 OllyDBG나 IDA를 통하여 살펴보면 반복되는 구간으로 인하여 그나마 쉽게 찾을 수가 있다. 아래는 인코딩된 문자열이 디코딩 루프를 걸쳐서 디코딩된 문자열이 되고 그 다음에 그 명령어들이 실행이 되는 일반적인 과정을 간략하게 그린 것이다.

* 추가로 인코딩되어 있어 직접적인 패치가 어려울 경우 수행하는 방법으로 Code Cave가 있다. 코드 케이브는 디코딩이 끝난 후 OEP로 점프하기 이전에 코드 케이브라는 영역을 만들어 그 부분으로 점프하게하며 그 코드케이브는 인코딩의 영향을 받지 않는 섹션이나 위치에 형성해야한다. 코드 케이브영역에는 인코딩 영역의 문자열을 패치하는 명령어들을 만들어 간접적인 패치를 쉽게 할 수 있게 도와준다.




다른 간단한 인코딩 구조


단일 바이트 인코딩의 약점을 감안해서 대부분의 멀웨어 코더들은 좀 더 진화된 인코딩 구조를 구현한다. 

인코딩 구조 

설명 

ADD, SUB 

 인코딩 알고리즘은 개별 바이트에 대해 XOR 과 유사한 방법으로 ADD와 SUB를 사용할 수 있다. ADD와 SUB는 양방향성이 아니므로 하나는 인코딩을 위하여 다른 하나는 디코딩을 위하여 함께 사용해야 한다.

ROL, ROR 

 명령어는 바이트를 오른쪽이나 왼쪽으로 순환시킨다. ADD 와 SUB와 동일하게 양방향성을 갖지 못했기 때문에 이들 명령어는 함께 사용되어야 한다.

ROT 

 ROT는 원래의 시저 암호다. 일반적으로 알파벳 문자 또는 ASCII 에 있는 94개의 출력 가능 문자를 사용한다.

Multibyte 

 단일 바이트 대신 알고리즘은 긴 키(4 or 8 Byte )를 사용할 수 있다. 일반적으로 편의를 위해 각 블록에 대해 XOR을 사용한다.

Chained or loopback 

 이 알고리즘은 다양한 구현과 더불어 데이터 자체를 키의 일부로 사용한다. 거의 대부분 원본 키는 일반 텍스트의 한 측면에 적용되고, 인코딩된 결과 문자는 다음 문자의 키로 사용된다. 


Base64

Base64 인코딩은 바이너리 데이터를 ASCII 문자열 포멧으로 나타낼 때 사용하며 악성코드에서 흔히 발견할 수 있기 때무에 Base64를 인지하는 방법을 알고 있어야 한다. Base64라는 단어는 다목적 인터넷 메일 확장(MIME) 표준에서 나왔으며 원래는 이메일 첨부 파일의 전송을 위한 인코딩으로 개발됐지만, 현재는 HTTP와 XML을 위해 널리 사용된다.

Base64 인코딩은 바이너리 데이터를 제한된 64개의 문자 집합으로 변환한다. 다른 종류의 Base64 인코딩을 위한 다수의 구조와 알파벳이 있다. 이들 모두는 64개의 주요 문자를 사용하고 패딩을 나타내기 위한 추가 문자로 =를 자주 사용한다.

인코딩되는 방식은 나름 표준적이라 할 수가 있다. 3Byte의 문자 블럭을 사용한다. 위에서는 'M', 'a', 'n'을 예로 들고 있다. 이렇게 제시된 문자들의 아스키 값을 2진수로 나타내면 총 24조각으로 나누어 진다. 이렇게 나누어진 블럭을 6비트씩 읽어들인다음 아래의 Index Table에 따라 해당 값을 찾는다. 이렇게 총 24블럭을 6개씩 나누므로 4개의 문자가 나온다.

디코딩 또한 동일 프로세스를 역으로 실행하면 된다. 다시 말하자면 Base64 문자를 6비트로 변환하고 모든 비트를 순서대로 나열한 다음에 8비트씩 그룹 지으므로 총 3개의 그룹으로 나누어 지며 그에 해당하는 ASCII를 찾으면 해당 문자를 복원할 수가 있다.

* 악성코드가 문자열로 A~Z + a~z + '+' , '/'을 포함할 경우 이는 Base64 테이블이므로 인코딩을 의심해보아야 한다. 분명 어느 위치를 계속 참조할 것이다. 그 부분을 찾아야 한다.


일반 암호화 알고리즘


치환 암호와 동일한 단순 암호 구조는 현대 암호학의 암호와 매우 다르다. 현대 암호학은 기하급수적으로 증가하는 계산 능력을 요구하며, 알고리즘은 너무 많은 계산 능력을 필요로 하기 때문에 해당 암호를 깨는 것은 비실용적이 되도록 설계 됐다. 이전의 단순 암호 구조는 무차별 대입에 대한 보호조차 존재하지 않고 단순히 이해를 어렵게 하는 것이 목적이다. 암호학은 많은 부분에서 진화했지만 악성코드에 있어서 자신의 정보를 숨기기 위해 이러한 고도의 암호학을 활용하지 않는 이유 또한 존재한다. 이유는 다음과 같다.

- 암호 라이브러리는 크기가 클 수 있으므로, 악성코드는 정적으로 코드에 통합시키거나 기존 코드에 링크할 필요가 있다.

- 호스트의 기존 코드에 크드를 링크하는 것은 휴대성을 떨어뜨릴 수 있다.

- 표준 암호 라이브러리는 쉽게 탐지된다.

- 대칭 암호 알고리즘은 암호키를 숨기는 방법에 대해 걱정할 필요가 있다.

다수의 표준 암호 알고리즘은 강력한 암호 키에 의존해 비밀을 저장한다. 암호 알고리즘 자체는 널리 알려지더라도 암호문을 복호화하는 것은 다량의 계산을 요구하기 떄문에 거의 불가능하다는 개념이다. 복호화에 걸리는 충분한 계산량을 보장하기 위해 암호 키는 가능한 모든 키를 쉽게 테스트할 수 없게 충분히 길어야 한다. 또한 악성코드가 사용할 수 있는 표준 알고리즘에 대해서는 알고리즘 뿐만 아니라 키까지 식별할 수 있다는 점이 핵심이다.

표준 암호의 사용을 식별할 수 있는 몇가지 쉬운 방법으로는 암호 함수가 참조하는 문자열과 임포트에 대한 검색과 특정 내용을 검색하기 위한 몇 가지 도구의 사용을 포함 한다.


문자열과 임포트 식별

표준 암호 알고리즘을 식별하는 한 가지 방법은 암호 사용에 참조하는 문자열과 임포트를 찾아 내는 것이다. 해시, 키 생성, 암호와 관련된 서비스를 제공하는 일부 암호 임포트 목록들이 있는데 이러한 암호화 관련된 API 함수 대부분은 Crypt, CP, Cert로 시작한다.


암호 상수 검색

암호 탐지의 세 번째 기본 방법은 일반적으로 사용되는 암호 상수를 검색할 수 있는 도구를 사용하는 것이다. 이러한 도구로는 IDA Pro의 FindCrypt2와 Krypto ANALyzer가 있다.


하이 엔트로피 콘텐츠 검색

암호 사용을 식별할 수 있는 다른 방법은 하이 엔트로피 콘텐츠를 검색하는 것이다. 암호 사용의 가능성으로 암호 상수나 암호 키를 가종하는 것 외에도 이 기법은 암호화된 내용 자체도 식별할 수 있다. 이 기법의 광범위한 범위로 인해 RC4 같이 암호 상수가 발견되지 않는 경우에 적용할 수 있다. 하지만 하이 엔트로피 콘텐츠 기법은 정확성이 떨어지므로 최후의 수단으로 사용하는 것이 좋다. 사진, 영화, 음성 파일, 압축 데이터 같은 다양한 유형의 콘텐츠는 엔트로피가 높게 표현된다. 따라서 헤더를 제외하고는 암호화된 내용과 구별하기 어렵다.



사용자 정의 인코딩


악성코드는 종종 자신만의 인코딩 구조를 사용한다. 그런 구조 중 하나는 여러 단순 인코딩 메소드 계층을 두는 것이다. 예를 들어 악성코드는 XOR 암호화를 한 라운드 수행한 후 결과를 Base4 인코딩할 수 있다. 다른 유형의 구조는 단순히 표준 게시 암호 알고리즘과 유사성을 가진 사용자 정의 알고리즘을 개발한다.


사용자 정의 인코딩 파악

쉽게 식별 가능한 문자열이나 상수를 사용할 때 악성코드에 있는 일반 암호 기법과 인코딩 함수를 식별하는 여러 방법을 설명했다. 대다수의 경우 이미 언급된 기술을 통해 사용자 정의 암호화 기법을 찾는 데 도움을 받을 수 있다. 하지만 명확한 증거가 없는 경우 식별하는 것이 어려워질 수 있다.

하지만 대부분의 경우 복호화 함수는 입력 함수에서 그리 멀리 떨어져 있지 않다. 결과 함수 역시 실행 흐름의 반대 방향으로 추적한다는 점을 제외하고는 유사하다. 이를 유념하고 상세 분석을 진행하다보면 복호화된 문자열을 쉽게 찾을 수가 있다.


사용자 정의 인코딩이 공격자에게 주는 이점

공격자에게 사용자 정의 인코딩 기법은 이점을 가진다. 단순 인코딩 구조의 장점인 작은 크기와 암호 사용의 불확실성을 유지하면서도 역공학 작업은 더 어렵게 한다. 다양한 종류의 표준 암호 기법의 경우 암호 알고리즘이 파악되고 키를 찾았다면 표준 라이브러리를 이용한 디코더 제작은 매우 쉬운 일이다. 

사용자 정의 인코딩을 이용하면 공격자는 자신이 원하는 임의의 인코딩 구조를 생성할 수 있다. 키를 코드 자체에 효과적으로 이식해 숨기 수도 있으며 공격자가 키를 사용했고 그 키가 발견됐다고 하더라도 복호화를 도와줄 수 있는 라이브러리를 쉽게 구하기 어렵다.



디코딩


인코딩 함수를 분리하기 위한 탐색도 분석 과정에서 중요하지만, 숨겨진 내용을 디코딩하는 것도 중요하다. 악성코드에서 인코딩이나 디코딩을 재현할 수 있는 두 가지 기본적인 방법이 있다.

- 해당 함수를 다시 프로그램하는 방법

- 악성코드 자체에 있는 것처럼 해당 함수를 사용하는 방법


셀프 디코딩

알고리즘의 인지 여부에 상관없이 데이터를 복호화하는 가장 경제적인 방법은 프로그램 자체적으로 일반적인 처리과정의 일환으로 복호화를 수행하는 것이다. 이런 프로세스를 셀프 디코딩이라고 한다. 디버거를 이용해 악성 프로그램을 중지한 후 메모리에서 실행하기 전에 보지 못했던 문자열을 파악했다면 이미 셀프 디코딩 기법을 사용한 것이다. 이는 디코더를 만드는 것보다 효율적이다.

하지만 셀프 디코딩이 콘텐츠를 디코딩하는데 저렴하고 효과적인 방법일 수 있지만 단점이 있다. 우선 복호화를 수행하는 모든 인스턴스를 파악하기 위해서는 복호화 함수를 구분할 수 있어야 하고, 복호화 루틴 이후 직접적으로 BP를 설정해야 한다. 더 중요한 점은 악성코드가 알고자 하는 정보를 복호화하지 않거나 악성코드가 어떤 방법으로 정보를 다루는지 파악하지 못한 경우 정보를 얻을 수 없다는 사실이다. 이런 이유들로 인해 통제가 가능한 기법을 사용하는 것이 중요하다.


디코딩 함수의 별도 프로그래밍

단순 암호와 인코딩 방법에 대해 프로그래밍 언어에서 제공하는 표준 함수를 이용할 수 있다. 아래는 표준 Base64 인코딩 문자열을 디코딩하는 작은 파이썬 프로그램을 보여준다. 관심 문자열을 디코딩하기 위해 example_string으로 변수를 변경한다.

변형된 알파벳을 사용하는 XOR 인코딩이나 Base64 인코딩 같이 표준 함수가 없는 단순 인코딩 방법의 경우 가장 쉬운 선택은 자신과 친숙한 프로그래밍 언어로 인코딩 함수를 프로그래밍하거나 스크립트를 작성하는 것이다. 아래는 위에서 설명했던 NULL 보존 XOR 인코딩을 구현하는 파이썬 함수의 예를 보여준다.

위의 함수는 다른 곳에서 읽은 self.data의 값을 가지고 xor 연산을 진행하는 것을 확인할 수가 있다. 이렇게 XOR 연산을 진행할 때 키 값인 0x50과 NULL인 0x00은 쉽게 인지되는 것을 방지하기 위하여 널 보존 XOR 인코딩을 수행하고 있는 것이다. 


일반 복호화를 위해 명령어 사용

셀프 디코딩에서 악성코드를 통해 복호화를 하려면 악성코드가 정상적으로 실행된 후 적절한 시점에 정지시켜야 한다. 하지만 악성코드의 복호화를 통제할 수 있다면 악성코드의 일반 실행 과정에 제한될 필요가 없다. 인코딩 루틴이나 디코딩 루틴이 분리되고 파라미터가 이해되면 악성코드에서 사용한 악의적인 콘텐츠를 디코딩하는데 완전하게 활용 가능할 수 있다. 따라서 효과적으로 악성코드를 이용해 악성 코드를 분석할 수 있다.

암호화된 파일(악성코드 자체)과 암호화 함수가 어떻게 동작하는지에 대한 지식을 갖고있다. 높은 수준의 목표는 암호화된 파일을 이용해 암호화에 사용된 동일한 루틴을 통해 실행할 수 있게 악성코드를 다루는 것이다. 높은 수준의 목표는 다음과 같은 일련의 작업으로 나눌 수 있다.

1. 디버거에서 악성코드를 설정한다. 

2. 읽기 위한 암호화된 파일을 준비하고 쓰기 위한 결과 파일을 준비한다. 

3. 악성코드가 메모리를 참조할 수 있게 디버거 내부에서 메모리를 할당한다. 

4. 할당된 메모리 영역으로 암호화된 파일을 로딩한다. 

5. 암호화 함수를 위한 적절한 변수와 인자와 더불어 악성코드를 설정한다. 

6. 암호화를 수행하기 위해 암호화 함수를 실행한다. 

7. 새롭게 복호화된 메모리 영역을 결과 파일에 쓴다. 



정리


악성코드 제작자와 악성코드 분석가 모두 지속적으로 자신의 능력과 기술을 개선하고 있다. 탐지를 회피하고 분석가를 좌절시키기 위해 악성코드 제작자는 자신의 의도, 기술과 통신 내용을 숨길 수 있게 다양한 방법을 지속적으로 사용한다. 이런 의도의 기초 도구는 인코딩과 옴호화다. 인코딩은 통신 그 이상의 영향을 끼친다. 다행히도 적절한 도구와 기법을 이용해 비교적 쉽게 파악하고 대응할 수 있다.





참고

https://en.wikipedia.org/wiki/Base64

https://www.base64encode.org/



실습


Lab13-1

1. 동적 분석을 통해 얻을 수 있는 정보와 악성코드에 있는문자열을 비교하자 비교를 바탕으로 어떤 요소가 인코딩됐는가?

www.practicalmalwareanalysis.com 라는 디코딩된 문자열을 찾을 수가 있다.


2. IDA를 사용해 문자열 xor을 탐색해 잠재적인 인코딩을 찾아보자. 어떤 유형의 인코딩을 발견했는가?

00401300 > 00401190


3. 인코딩에 사용하는 키는 무엇이며, 인코딩된 내용은 무엇인가?

4C 4C 4C 15 4B 49 5A 58 4F 52 58 5A 57 56 5A 57 4C 5A 49 5E 5A 55 5A 57 42 48 52 48 15 58 54 56

www.practicalmalwareanalysis.com


4. 정적도구를 사용해 그 외의 다른 인코딩 메커니즘을 파악해보자. 무엇을 찾았는가?

401000에도 디코딩루프가 존재하고있다.


5. 악성코드를 통해 전달되는 네트워크 트래픽을 위해 어떤 유형의 인코딩이 사용됐는가?


6. 디스어셈블리에서 Base64 함수는 어디있는가?


7. 전달되는 Base64 인코딩된 데이터의 최대길이는 무엇인가? 무엇이 인코드되는가?


8. 악성코드에서 Base64 인코딩된 데이터에서 패딩 문자(= or ==)를 본 적이 있는가?


9. 이 악성코드는 무엇을 하는가?


리소스 섹션에 무엇인가를 숨겨놓음

00000000603C   00000040603C      0   http://%s/%s/0000000056C8   

0000004056C8      0   InternetReadFile

0000000056DC   0000004056DC      0   InternetCloseHandle

0000000056F2   0000004056F2      0   InternetOpenUrlA

000000005706   000000405706      0   InternetOpenA

000000005714   000000405714      0   WININET.dll

000000004EDD   000000404EDD      0   ;=@n@

00000000604C   00000040604C      0   Could not load exe.
000000006060   000000406060      0   Could not locate dialog box.
000000006080   000000406080      0   Could not load dialog box.
00000000609C   00000040609C      0   Could not lock dialog box.


Address        Function   Instruction                      
-------        --------   -----------                      
.text:004011B8 sub_401190                 xor     eax, 3Bh 
.text:00402BE2                            xor     dh, [eax]
.text:00402BE6                            xor     [eax], dh


Lab13-2

1. 동적 분석을 이용해 악성코드가 무엇을 생성하는지 알아보자

이상한 temp 파일들을 생성한다.


2. xor 탐색 등 정적 분석 기법을 사용해 잠재적인 인코딩을 찾아보자. 무엇을 발견했는가?


3. 질문 1의 답을 바탕으로 어떤 임포트 함수가 인코딩 함수를 발견하는 데 좋은 힌트를 제공하는가?

BitBlt

FlushFileBuffers


4. 디스어셈블리에서 인코딩 함수는 어디에 있는가?


5. 인코딩 함수에서 인코딩된 컨텐츠의 근원을 추적해보자. 컨텐츠는 무엇인가?


6. 인코딩에 사용된 알고리즘을 찾을 수 있는가? 그렇지 못하다면 컨테츠를 어떻게 디코딩 할 수 있는가?


7. 지시문을 사용해 인코딩된 파일중 하나의 원본 소스를 복구할 수 있는가?


000000007030   000000407030      0   temp%08x

000000006724   000000406724      0   BitBlt
00000000662C   00000040662C      0   WriteFile
000000006638   000000406638      0   CreateFileA
Address        Function   Instruction              
-------        --------   -----------                  
.text:004012D6 sub_40128D xor     eax, [ebp+var_10]
.text:0040171F            xor     eax, [esi+edx*4] 
.text:0040176F sub_401739 xor     edx, [ecx]       
.text:0040177A sub_401739 xor     edx, ecx         
.text:00401785 sub_401739 xor     edx, ecx         
.text:00401795 sub_401739 xor     eax, [edx+8]     
.text:004017A1 sub_401739 xor     eax, edx         
.text:004017AC sub_401739 xor     eax, edx         
.text:004017BD sub_401739 xor     ecx, [eax+10h]   
.text:004017C9 sub_401739 xor     ecx, eax         
.text:004017D4 sub_401739 xor     ecx, eax         
.text:004017E5 sub_401739 xor     edx, [ecx+18h]   
.text:004017F1 sub_401739 xor     edx, ecx         
.text:004017FC sub_401739 xor     edx, ecx         
.text:0040311A            xor     dh, [eax]        
.text:0040311E            xor     [eax], dh        



Lab13-3

1. 정적분석을 통해 습득한 정보와 strings 결과를 비교하라 비교를 바탕으로 어떤 요소가 인코딩 됐는가?


2. 문자열 xor 탐색을 이용한 정적 분석을 통해 잠재적인 인코딩을 찾아보자 어떤 유형의 인코딩이 발견되는가?


3. FindCrypt2,KANAL,IDA 엔트로피 플로그인 같은 정적 도구를 사용해 다른 인코딩 메커니즘을 파악하자. 발견된 내용을 XOR 탐색과 어떻게 비교하는가?


4. 이 악성코드에 사용된 두 가지 인코딩 기법은 무엇인가?


5. 각 인코딩 기법에서 키는 무엇인가?


6. 암호화 알고리즘에 대해 키는 충분한가? 다른 어떤 것이 알려져야 하는가?


7. 이 악성코드는 무엇을 하는가?


8. 동적 분석 동안 생성된 컨텐츠의 일부를 복호화 하기 위해 코드를 작성하라. 이 컨텐츠는 무엇인가?

'Reversing > Theory' 카테고리의 다른 글

Anti disassembly  (0) 2015.09.01
DLL Injection  (0) 2015.08.29
위장 악성코드 실행  (1) 2015.08.24
Malware Behavior ( 악성코드의 행위 특성 )  (0) 2015.08.20
Code Virtualized - 코드 가상화 참고자료  (0) 2015.08.17