튜기's blogggg

CodeEngn basic #20

by St1tch

----------------------------------------------------------------------------------------------------------------

우선 프로그램을 시작하고 OEP 밑에 쪽에보면 파일을 만드는 함수와 파일을 읽는 함수가 있다

일단 CRACKME3.KEY파일이 없으면 종료가 되므로 CRACKME3.KEY파일을 같은 디렉토리에 만들어 놓아야한다.

그리고 그파일의 크기가 0x12, 즉 18파이트가 되지 않으면 종료가된다.

즉 18바이트의 KEY파일을 만들어놓고 진행을 해야한다.

 

KEY파일을 만들고 난 후 진행을 하면 

위와 같이 함수 2개를 거치고 특정한 값들을 비교하여 조건에 맞으면 success가 출력되는 함수를 호출할 수 있다.

00401311함수는 encrypt를 하는 함수이고 이 encrypt함수를 거치고 나면 입력한 스트링들이 암호화 되어 변한다.

그리고 암호화를 할때 xor한 결과가 [0x4020F9]에 계속 더해지는데, 암호화 함수가 종료되면 [0x4020F9]와 0x12345678를 다시 xor한다.

그 후 0040133C함수에서는 KEY파일의 15~18번째 4BYTE를 EAX에 반환하고

이후 EAX와 xor과정을 4BYTE를 비교하여 동일하면 success로 분기하고 아니면 아무것도 뜨지 않습니다.


이 함수는 암호화 하는 함수인데,

KEY파일의 한 글자씩 받아와서 0x41부터 0x4F 즉 14번 이 과정을 거친다. 

암호화 과정은 KEY파일의 첫번째BYTE부터 0x41을 xor연산 후 다시 그 자리에 넣어 저장하고, 포인터는 KEY파일의 다음 BYTE를 가르키고  0x41은 1 증가한다.

[0x4020f9]의 초기값은 0이고 위의 과정(xor)을 한번씩 할때 마다 eax의 값을 계속 더해준다.

ecx는 이 과정을 몇번했는지 순서를 알려준다.

만약 xor연산 결과가 0이면 함수가 종료된다.


이 함수는 그다음으로 거치는 함수인데 위에 설명했다시피 15~18번째 byte의 값을 EAX에 저장한다.


지금까지의 과정을 아주 간단하게 c코드로 설명하자면

대략 이런 형식이다.

돌아가는 코드는 아니고 그냥 내가 짜면서 이해하려고 짠코드이다.


위의 방식대로 해서 KEY파일을 수정하여 진행하면 이런 글자가 뜬다.

즉 KEY파일의 1번째 ~ 14번째의 BYTE의 암호화된 결과가 Cracked by: 뒤에 출력된다.

이 부분이 CodeEngn이 되야하므로 8자리는 CodeEngn이 되게하고 6자리는 아무것도 표시가 안나게 null값이 되게했다.


a^b=c일때

a^c=b이기 때문에 이를 이용해서


0x41 ^ 'C' = 1번째 BYTE

0x42 ^ 'o' = 2번째 BYTE

.

.

.

8번재까지는 CodeEngn

9번째는  0x49 ^ 00 으로 하여 null값이 되면서 암호화가 종료되게하였다.(암호화 할때 xor후 AL이 0인지 확인함)

그리고 10-14번재는 연산을 안하기 때문에 그냥 00으로 채웠다.


이런 식으로 14개를 찾고 뒤에 4BYTE는 아무꺼나 넣고 실행 시켰다.

그리고 이 부분에서 뒤에 4글자(1234557B)를 알아냈고 다시 KEY파일을 최종 수정했다.



최종적으로 이러한 KEY파일을 만들 수 있었다.



basic 끝 !!




블로그의 정보

튜기's blogg(st1tch)

St1tch

활동하기