본문 바로가기

Reversing/Code_Engn(Basic)

Code Engn - Basic 20 RCE



코드엔진 basic 마지막 문제. 위와같은 방식으로 출력되도록 하면 된다.

먼저 PEiD로 확인해보니 어셈블리어로 코딩되어있는 듯하다.



실행해보면 그냥 아래와 같음


먼저 코드부터 확인해보니 CreateFileA()에서 반환값이 -1이다.

Mode = OPEN_EXISTING 인데 "CRACKME3.KEY" 파일이 존재하지 않기 때문이다. 파일을 만들고 진행해보면..



아래와 같은 코드들이 나오는데 이부분이 핵심이다.


먼저 file로부터 0x12(18)바이트 를 읽어오는데, 읽어온 데이터는 0x402008 에, 읽어온 데이터의 길이값은 0x4021A0에 저장한다.

그리고 조건 분기문을 두번 통과하면 Cracked가 출력되는 함수로 이어지게 된다.


먼저 첫번째 조건문은 0x401066 을 보면 읽어온 길이값이 0x12인지 체크한다.


두번째 조건문이 되는 부분은 0x401093 인데, 먼저 해당라인 윗쪽의 코드를 봐야한다.

0x401311 함수에 0x402008(버퍼 포인터)를 인자로 전달하는데 해당 함수는 밑밑그림(0x401311~0x40133b)과 같다.

해당 함수를 보면..

간단하게 0x41부터 1씩증가하면서 버퍼에 읽어온 문자열들을 1바이트씩 xor하고,

버퍼의 문자열의 헥사값을 1바이트씩 반복해서 0x4020f9 에 더해준다.

그리고 xor 연산 결과가 0 이거나 14번 루프를 반복한 후에는 종료


버퍼를 xor하는 부분이 Cracked by : [####] 부분이 세팅되는 부분이고, 0x4020f9는 이후 조건 분기문에서 사용되는 부분이다.

해당 함수를 마치고 나면, 0x401079에서 0x4020f9의 값을 0x12345678과 xor 하게 된다.

그리고 이 값을 0x40133c(밑밑밑 그림)의 반환값으로 받는 0x402016(0x402008+0xE)에 있는 값과 비교하고 일치하면 Crack 성공!






위 함수의 내용을 파이썬 코드로 그대로 옮겼다.

앞부분 14바이트는 문자열이 나와야하고 // 뒤 4바이트는 연산과정에서 세팅되는 0x4020f9 부분이 된다.



'Reversing > Code_Engn(Basic)' 카테고리의 다른 글

Code Engn - Basic 19 RCE  (0) 2015.06.09
Code Engn - Basic 18 RCE  (0) 2015.06.09
Code Engn - Basic 17 RCE  (0) 2015.06.09
Code Engn - Basic 16 RCE  (0) 2015.06.08
Code Engn - Basic 15 RCE  (0) 2015.06.04