My Study/etc2013.01.18 11:17

나만의 가계부 프로그램, 폴더 보호 프로그램 등등 이러한 프로그램들을 보면 메인 화면이 뜨기 전에 암호를 치라는 화면이 나옵니다. 당연히 자기의 데이터를 보호해주는 프로그램이니 사용자가 정의했던 암호를 치라고 뜨겠지요.



위와 같은 창을 마주하면 마치 크랙미같은 느낌이 나서 많이 분석을 해보는데 저렇게 구동되는 프로그램들을 보면 상용 프로그램이던 무료 프로그램이던 대부분 기능상 문제보단 암호부분에 문제점이 많이 보입니다. 


암호부분에 문제점이란..

패스워드가 인식이 안되는것?

이것은 개발자 관점 혹은 일반 사용자 관점에서의 생각이고 

이 프로그램을 크랙하는 크래커 관점에서 봤을 때 쉽게 뚫려버린다는 문제가 있다는 것입니다.


왜 그럴까요?? 저러한 프로그램들이 사용되는 암호처리 루틴을 간략히 봐보겠습니다.



몇몇 프로그램들은 실제로 위와 같이 구현이 되어 있습니다.

딱봐도 취약한 부분이 보이실 것입니다. 어떠한 부분일까요? 패스워드 암호화를 안시킨 부분?

그 부분도 맞지만 더욱 위험한 부분은 따로 있습니다.




위와 같은 부분을 Attack 해주면 되는 것이지요. 어떻게요? 무조건 같음 부분으로 가게끔 루틴을 바꿔주면 됩니다.




위와 같이 아무리 강력한 암호화 루틴으로 패스워드에 적용을 하더라도 저 부분만 공격해주면 다 무용지물이라는 것을 알 수 있습니다. 하지만 많은 상용 프로그램, 무료 프로그램들이 위와 같은 방식을 사용합니다. 크래커들 입장에서 봤을 땐 개발자들이 이뻐죽겠지만 사용자 입장에서 보면 개발자들이 미워죽겠습니다.


그러면 위와 같은 취약한 방법을 사용하지말고 어떠한 방법을 이용해야 그나마 보안적으로 덜 취약할까요?

방법은 간단합니다. 패스워드를 비교해 성공루틴을 가느냐 실패루틴을 가느냐에 대한 부분은 어떻게할 방법이 없습니다. 그냥 저대로 놔두어도 됩니다(패스워드 암호화는 당연히 수행).


바로 루틴 자체를 암호화 시키는 것입니다.


순서는 다음과 같습니다.


1. 사용자가 오리지널 패스워드를 설정하면 프로그램은 내부적으로 오리지널 패스워드의 해쉬처리 된 값만 가지고 있는다.

    ( 여기선 암호화가 아닌 절대로 원본 패스워드를 알 수 없도록 해쉬처리를 해야한다.)

2. 오리지널 패스워드를 key로 성공 루틴을 암호화 시키고 오리지널 패스워드는 영원히 소멸시킨다. 

   ( 위 작업은 메모리 상이 아닌 파일 상에서 이루어져야한다. )

3. 프로그램이 실행되고 사용자로부터 패스워드를 입력받은 후, 

    해당 패스워드를 암호화 시킨 값(a)과 암호화 시키지 않은 원래의 값(b) 둘다 가지고 있는다.

4. a 값을 암호화된 오리지널 패스워드와 비교해 틀리면 실패루틴 맞으면 복호화 루틴으로 간다.

5. 복호화 루틴에선 b 값을 key 로 암호화 된 성공 루틴을 복호화 시킨다.

6. 복호화가 된 성공 루틴에선 제대로 복호화가 되었다면 계속 진행되고 아니라면 

   예외가 발생하면서 실패 루틴으로 가게된다.


 위 과정에서 만약 크래커가 아까와 같은 공격 방식으로 공격했다 하더라도 오리지널 패스워드를 알지 못하면 성공 루틴을 수행하지 못하며 예외가 발생됩니다. 결국 실패루틴으로 오게 되있는거죠. 보호 프로그램들을 만드는 개발자들이 이정도도 구현하지 못하는 것은 말도 안되며 조금만 시간을 투자하면 사용자들로부터 더욱 신뢰받는 프로그램이 탄생하게 될 것입니다.


많은 보호 프로그램들을 써보면서 약간 답답한 마음에 이 포스팅을 하게 되었으며 최소한 보호 프로그램이면 보호 프로그램 답게 암호처리 부분도 기능의 중요한 부분이니 신경써서 개발을 해주면 좋겠다는 마음으로 글을 마칩니다.

Posted by Ezbeat