맨위로

이 글은 코드엔진(http://codeengn.com/) 에서 제공하는 리버스 엔지니어링 관련 다양한 문제들을 풀어보면서 리버스 엔지니어링을 공부하는 목적으로 작성되었습니다. 이글을 작성하는 필자도 리버스 엔지니어링에 흥미를 가지고 공부하는 입장이므로 잘못된 내용이 있을수도 있습니다. 잘못된 내용이 있다면 댓글이나 방명록에 알려주세요 :)

Challenges : Basic 13 


Author : Basse 2002

Korean : 

정답은 무엇인가 

English : 

Find the answer 

프로그램을 실행시켜보니 아래와 같이 패스워드를 입력받는 콘솔 프로그램이 나타난다. 임의의 값을 입력해봤으나 "Bad Luck! Try again!" 이라는 문자열만 반복해서 출력할 뿐이다. 

아마 패스워드 관련 알고리즘을 찾아서 패스워드를 구하라는것같다.

프로그램을 실행시켜봤으니 분석을 해보도록 하겠습니다. 분석을 위해 올리디버거를 통해서 열어보도록 하겠습니다. 열어보니 아래와 같이 분석이 되지않는것을 확인할수 있습니다. (코드를 나오긴하나 사실상 너무 복잡하므로 분석이 어렵다.)

왜 분석이 안될까 라는 궁금증을 가지고 PEiD를 통해서 관련 정보를 얻어보도록 하겠습니다. 확인결과 이프로그램은 C# 으로 작성되있는것을 확인할수 있었습니다. 이러한 경우에는 올리디버거를 통한 분석이 되지않는다고 볼수있습니다.

C# 으로 작성된 프로그램은 올리디버거를 통한 분석은 어렵지만 대신 .Net reflector 를 이용해서 쉽게 소스코드를 복원할수 있습니다. 관련 프로그램은 다음 주소에서 다운로드 받을수 있습니다. (http://www.red-gate.com/dynamic/products/dotnet-development/reflector/download) 사용법은 간단하게 파일을 .Net reflector을 통해서 열어주면 됩니다.

reflector 를 통해서 열어보니 위와 같이 소스코드를 확인할수 있습니다. 살펴보니 Rijndale 가 만든 암호화 알고리즘인것 같다. 알고리즘 코드를 확인가능하니 다른언어로 코딩하던지 이코드를 그대로 가져와서 코딩한후 확인하면 된다. 코드를 추출해서 사용하는것이 훨씬 간편하므로 추출기능을 이용하도록 하겠습니다.

이제 추출된 코드를 비쥬얼 스튜디어로 열어보도록 하겠습니다. 열어서 main 함수를 살펴보니 Decrypt 함수의 리턴값이 plainText 에 저장되서 사용자 입력값과 비교하고 있는것을 확인할수 있습니다. 

이를 이용해서 우리는 코드를 수정하여 plainText 를 출력하도록 하면 손쉽게 패스워드값을 얻을수 있을것입니다. 아래와 같이 수정해줄수 있습니다.

수정한후 실행시켜보니 아래와 같이 패스워드값이 출력되는것을 확인할수 있습니다. 이 패스워드값을 프로그램에 입력해보면 아래와 같이 인증에 성공하는것을 확인할수 있습니다.

                     



Posted by STIH

댓글을 달아 주세요