13 Security Lab

How to .NET Reverse Enginering - Part 1 본문

Computer Security/Analysis

How to .NET Reverse Enginering - Part 1

Maj0r Tom 2017. 4. 25. 23:08

최근에 VB.NET 으로 되어진 코드에 대해 크립터로 난독화 해왔습니다. 주로 우리가 했던 것은 그 로직과 암호화 방법을 찾는 것이었는데

제가 생각하기에는 리버싱의 가장 어려운 부분은 로직을 찾는 것이지 패치나 숨겨진 부분을 찾는 것이 아닌 것 같습니다.

 

그래서 여기서는 다음 두가지를 다루어 보고자 합니다.

- anti-reversing protection 제거

- 디컴파일, 실행 가능하게 프로그램 수정

 

여기 난독화 해제에 대한 많은 내용들이 있지만, 이 것들은 일단 뒤로 넘기고 수동으로 따라가면서 한번 스스로 해봅니다. (그게 진짜로 도움 됨 )

 

DnSpy를 통해 코드를 로드 해봅니다. 그리고 우리의 모듈과 클래스 그리고 디컴파일되지 않은 코드들 안에 정의 된 메소드들이 뭔지 살펴 봅니다.

 

[messed methods]

 

 

이 것은 메소드들이 숨겨진 섹션 안에 암호화(또는 난독화) 되었다는 것을 의미 합니다.

우리가 프로그램을 실행 시킬 때, 이 숨겨진 섹션으로 부터 메소드들이 복호화 되고 원래 있어야 할 곳에 위치하게 됩니다.

이것을 확인 하게 위해 CFF Explorer를 통해 PE 섹션을 확인 해 봅니다.

 

 

[cff explorer]

 

위 CFF Explorer의 섹션 항목을 보면, 우리가 맞았다는 것을 확인 할 수 있습니다. 따라서 우리는 어디서 함수 복호화가 이루어지는지 찾아야 합니다.

우리가 몇가지를 거치고 나면 이것이 <Module>.ctor안에서 이루어진다는 것이 명확해지는 것을 알 수 있습니다.

이 Constructor는 메인 Entry Point가 실행 되기전에 호출됩니다.

따라서 이 부분이 이런 종류의 일을 하기에 최적화 되어있음을 의미합니다.

 

DnSpy를 다시열고 열고, Assembly 위에서 오른쪽 클릭 후 <Assembly -> Go to .cctor.> 를 클릭하여 이동합니다.

 

 

[module ctor]

 

<Module> 클래스안의 함수들이 잘 디컴파일 되지 않다는 것을 알고 있기 때문에, 우리는 이 메소드들을이  첫번 째 함수에서 고쳐져야 한다는 것을 예상할 수 있습니다.

 

그래서!, 첫번 째 함수로 가봅니다.

 

여기에 Kernel32.dll 을 통해 Import된 VirtualProtect를 호출하는 부분을 볼 수 있습니다.  이 함수는 특정 메모리 영역의 속성을 세팅하는 데 사용합니다.

 

자, 그럼 이 것이 의미하는것은? 이 프로그램은 실행 속성이 부여 된 곳의 섹션 주소를 얻는다는 것이고 (어디에 진짜 메소드가 위치하는 지) .. 그리고...

우리는 더 이상 알필요가 없습니다.  이미 이 것들이 올바르게 수정 되어 풀어질  메모리 영역을 찾았기 때문이겠죠

 

 

[virtual protect]

 

 

BP를 걸어 그리고 호출합니다. 그리고 어셈블리 덤프를 떠보도록 합니다.

 

 

[dump assembly]

 

모듈을 저장하고 그리고 저장 한 모듈을 새로 열도록 합니다.. 그리고 메소드들이 디컴파일 된 것을 보도록 합니다. 기분이 좋아집니다 :]

 

 

하지만 여전히 문제가 있는데, 우리의 exe파일이 깨진 것이고 왜냐면 "메소드를 수정하는 함수"가 여전히 남아있기 때문입니다.

 

프로그램에는 여전히 난독화 된 메소드들을 고치기 위한 코드와 함수들이 남아있어, 결국 고친 걸 또 고친셈이 되어 프로그램을 망쳐버리게 됩니다.

 

따라서, 이 "메소드를 수정하는 함수"를 제거 해보도록 합니다.

 

 


[saving assembly1]

 

[saving assembly2]

 

File-> Save Module 을 클릭해봅니다. (MD Writer 옵션을 까먹지 말고 아래와 같이 설정)

 

 

 

[md_writer]

 

 

그리고 다시 열어보면. 우리가 처음 하고자 했던 실행 가능하고 디컴파일 된 메소드들을 확인 할 수 있습니다. (끝)

 

 

원문:

http://codepool.me/NET-Reverse-Enginering-Part-1/ 

 

 

 


 

Comments