리버스엔지니어링 문제 Advance 18

2015. 9. 5. 14:02Security ★ Development/Reversing

반응형

http://codeengn.com/challenges/advance/18


Problem : Generate the key file when the name is CodeEngn. 


실행파일입니다.  실행하면 Name과 Key File의 위치를 입력하는 공간이 있습니다.  Key File을 지정해주지 않으면 다음과 같은 메시지박스를 띄웁니다.


OllyDbg로 실행을 하고 Name만 넣어서 OK를 눌러보면 넘어가지 않는 구간이 있습니다.  32비트에서도 해봤지만 마찬가지입니다.


PEiD를 보면 EntryPoint가 33DD라고 나옵니다.  그럼 시작 위치는 4033DD가 되어야합니다.


하지만 OllyDbg로 보면 403376을 메인 모듈의 Entry point로 지정하고 있으며 4033DD에 bp를 걸어도 걸리지 않습니다.


IDA로 봤을 때입니다.


IDA로 디버깅을 해보면 문제의 402704에서 Integer divide by zero 메시지를 띄웁니다.  OllyDbg로 봤을 때 바로 전 명령어는 XOR EAX, EAX로 EAX에는 0이 들어갈 수 밖에 없습니다.  이 부분은 잠시 보류하고 시작부분인 4033DD아래의 루프문을 봅니다.

이는 프로그램 파일의 시작지점인 401000부터 4033DD까지의 명령을 교체하는 작업을 합니다.  이 부분이 끝나고 403376으로 이동하는 것이 정상입니다.  (OllyDbg의 옵션에서 Debugging Start지점을 Entry point of main module로 체크하였을 경우 이 작업을 수행한 다음을 첫 pause 지점으로 잡습니다.)

이렇게 명령을 교체해주는 작업은 40337C에서 콜하는 함수에서도 일어납니다.  4033BA에서 401055를 호출하면서 윈도우를 띄웁니다.

그리고 Browse 버튼을 눌렀을 때 00402653 주소로 가게됩니다.


00402656에서 호출하는 401718로 가봅니다.  먼저 ESI에 401915의 값을 넣고 ebx에 0x270을 넣습니다.  그리고 아래에서 루프문을 돌고 00401746에 mov [esi], eax가 있습니다.  esi 주소는 401915에서 점차 감소하는데 00401746의 명령을 실행할 때마다 이 위치의 값들이 바뀝니다.

이 작업은 401915에서 185만큼 401790까지 아래주소로 실행됩니다.  그리고 00401733부터 0040173E의 루프는 401994부터 아래로 27D만큼 도는데 여기서 나온 값(edx)이 값을 바꿔주는데 사용됩니다.  최종적으로 바꿔주는 값은 루프를 나온 다음 계산된 것 까지 포함하여 eax의 값이 되겠지요.  일종의 복호화라고 볼 수 있습니다.

여기서 중요한 점은 만약 이 복호화 함수에 bp를 걸었다면 값들이 잘못 복호화 될 수 있다는 것입니다.  위 위치중 아무데나 bp를 걸고 테스트해보면 bp 위치, 수가 바뀔 때마다 복호화 결과값도 매번 바뀐다는 것을 확인할 수 있습니다.


어느 위치에 bp를 걸게 되면 해당 위치의 인스트럭션을 바꾸는 작업이 일어납니다.  그런데 복호화에는 일정 범위의 코드(주소, 값)을 사용하게 되는데 bp로 인해 특정 위치의 값이 변경되면 복호화에 사용되는 값도 변경되어 버리죠.  (401718 CALL 내부에 bp가 하나라도 있으면 Browse 버튼 클릭에 대한 처리가 제대로 일어나지 않고 프로그램이 종료될 겁니다.)


원활한 분석을 위해 덤프를 합니다.  프로그램은 사용자가 Browse 버튼을 누르면 나타난 창을 처리할 때까지 block됩니다.  이 때 문제의 코드 부분은 복호화가 되므로 이 상태에서 덤프를 합니다.  아래 코드가 복호화 후의 코드입니다.


이후 분석한 정보로 dat확장자의 키 파일을 만드는 keygen을 작성하여 줍니다.