리버싱을 하다보면 가끔 닷넷 프로그램을 리버싱 해야 할 경우가 있다. 사실 나도 닷넷 프로그래밍을 공부해본 적은 


없기 때문에 자세한 내부구조 까지는 알 수 없으나, 리버싱이 언제나 그렇듯이 중요한 건 프로그램에서 내가 고칠 


부분을 찾고, 코드 패칭 등 원하는 작업을 할 수 있으면 되기 때문에 큰 어려움은 없었다. 


가장 중요한 사실은 닷넷 프로그램은 관리코드 기반 언어이기 때문에 디컴파일이 매우 잘 된다는 것이다. :)


이번 코드 게이트 대회에서도 닷넷 프로그램이 문제에 나와서 나온 김에 정리를 해둔다.



# 닷넷 프로그램


 - 관리 기반 코드 ( = java JVM처럼 중간언어로 컴파일됨, MSIL 이란 언어로 컴파일 됨 )

 - 그러므로 디컴파일이 매우 쉽게 됨

 - 난독화 솔루션 존재하나, 어느정도 원복해주는 툴 또한 존재함



# 관련 리버싱 툴


 1) .net reflector ( 디컴파일러, http://www.red-gate.com/products/dotnet-development/reflector/ )

    - 가장 많이 사용되는 닷넷용 디컴파일러 / .net 다양한 언어 지원 / 다양한 플러그인 지원 / 유료(ㅠㅠ)

  

                                          [ 그림1 ] .net reflector 


 2) dotpeek ( 디컴파일러, http://www.jetbrains.com/decompiler/ )

    - 최근에 알게된 닷넷용 무료(!) 디컴파일러 / 깔끔한 인터페이스 / 아직은 플러그인이 별로 없는 것이 단점

                                                  [ 그림 2 ] dotpeek

 


# 닷넷 reflector 유용한 필수 플러그인


 1) Reflexil

    - MSIL 언어 수정을 가능하게 해주는 플러그인 

    - MSIL 언어를 알아야함 =_=/ 아니면 소스 받아서 컴파이를 아예 다시 하거나~! 


 2) deblector 

    - 닷넷 디버깅 도우미(?)

    - 리플렉터 상에서 디버깅을 하며 값 변경, 셋팅 등 일반적인 디버거의 기능을 추가해줌





# 코드게이트 문제 풀이


                                                   [ 그림 3 ] 코드게이트 binary 100 문제


문제를 열어보면 닷넷파일이고, 숫자키를 입력하게 되어 있다. 전형적인 crackme or keygen 문제이다. 


닷넷이니 일단 디컴파일을 한 뒤 소스를 확인 해보면, 아래와 같은 비교 루틴을 찾을 수 있다.


TransFormable() 함수 내부를 살펴보면, 입력받은 키값이 16글자인지 비교한 뒤 , 입력받은 키값을 AES 함호화 하여


저장되어 있는 키값과 비교한다. 이 2 조건을 통과하면 정답을 출력하도록 되어 있다. 즉, 소스만으로 평문 키값을 알


아내긴 어렵다. 방법은 여러가지가 있겠지만, 여기선 플러그인을 활용하여 코드패칭을 하고 실행하여 바로 키값이 출


력되도록 할 것이다. 


[ 그림 4 ] 키값 비교 및 정답 출력 함수


[ 그림 5 ] 무조건 정답출력 루틴으로 가도록 코드 패칭 (  ceq -> cgt 로 조작 )


[ 그림6 ] 파일명을 우클릭하여 Save as 로 패칭된 파일 저장



[ 그림 7] 정답화면

 














+ Recent posts