일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- mock.patch
- svn update
- open office xml
- debugging
- ida pro
- why error
- data distribution
- malware
- NumPy Unicode Error
- Rat
- idapro
- idb2pat
- hex-rays
- Analysis
- Python
- ecma
- idapython
- Ransomware
- javascript
- Injection
- 포인터 매핑
- MySQL
- error
- commandline
- h5py.File
- TensorFlow
- pytest
- x64
- ida
- error fix
- Today
- Total
13 Security Lab
How to .NET Reverse Enginering - Part 1 본문
최근에 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/