본문 바로가기

[Riversing]/[코드엔진] BASIC

[코드엔진] basic20

코드엔진 사이트에 들어가 basic20 문제를 다운로드 받고 압축을 푼다(비밀번호 : codeengn)

 

 

cramkme3.key 라는 파일안의 데이터가 무엇인지를 맞춰야 하는 문제이다.

프로그램이 내 컴퓨터 안의 cramkme3.key라는 파일을 찾아 읽고, 그 안의 내용과 프로그램의 key 값을 비교하는 문제인 듯 하다.

 

우선 실행을 시켜보면,

 

 

이게 끝이다.

 

Exeinfo PE로 분석해보자.

 

 

패킹은 되어있지 않은것같으니 Ollydbg로 정확한 분석 ㄱㄱ

 

-CreateFileA 함수 부분의 빨간 밑줄 부분을 보자.

 

0040101D              PUSH  3                                                ||   Mode = OPEN_EXISTING

 

빨간 글씨를 보면 mode 는 open_existing 이고 push 3을 해준다.

이건 createfile 함수 원형의 dwCreationDisposition 부분을 나타내는건데 파일이 존재할 때만 파일을 연다는 뜻이다.

 

-ReadFile 함수부분의 빨간 밑줄 부분을 보자.

 

00401059              PUSH  EAX                                             ||   BytesToRead =12 (18)

 

빨간 글씨를 보면 bytestoread 가 12(십육진수) => 18(십진수)라고 되어있다.

이건 readfile 함수 원형의 nNumberOfBytesToRead 부분을 나타내는데 읽어들일 파일의 데이터 크기를 말한다.

 

따라서 이 프로그램을 실행하기 위해서는 파일 내용물의 크기가 18byte 인 CRACKME3.KEY 라는 파일이 필요하다.

하지만 내 컴퓨터에는 crackme3.key 라는 파일이 없으니 하나 만들어주도록 하자.

 

맨 앞에 공백 하나 포함한 18byte의 파일을 만들어줬다.

디버깅을 진행해보자.

 

코드를 진행하다보면 내가 파일에 넣어놓은 값이 들어가있고, 00401074에서 00401311함수를 호출한다.

 

0040131B ~ 00401333 의 연산식을 통해 내가 입력한 (공백)CodeEngn!aaaaaaaa 의 앞부터

공백 ~ 4번째 a ( _CodeEngn!aaaaaaaa )   와 0x41 ~ 0x4F (ABCDEFGHIJKLMNO) 를

1바이트씩 xor 연산하여(  공백 xor 0x41(A), C xor 0x42(B), o xor 0x43(C) ... a xor 0x 4F(O) ) 저장하고

EAX 값은 [4020F9] 에 저장하고

나머지 4자리는 사용하지 않고 ESI(00402016)에 저장한뒤 RETN 한다.

 

=> 앞의 14자리는 키값을 생성하는 알고리즘에 사용, 나머지 4자리가 키값이라고 볼 수 있다.

 

 

되돌아간 곳에서 코드를 보자.

 

00401079 ~ 0040109F 부분의 코드를 간단하게 설명하면

 

00401079 에서 위에서 xor 연산한 결과의 합(26D)를 12345678 과 xor 연산하고

 

0040108B 에서 CALL 0040133C 함수를 통해서 이전에 xor 연산에 쓰이지 않았던 4자(aaaa) 를 EAX에 넣는다.

 

00401093 에서 EAX 값을 [4020F9] 주소에 들어있는 값과 비교한다.

 

00401099 에서 SETE AL 명령어를 통해 위의 조건문(CMP) 의  결과가 참이면 1, 거짓이면  그 보수를 AL 사이즈에 맞춰서 반환한다.

 

이 반환값을 통해서 반환값이 1 이면(참) 성공, 1이 아닌 값이면(거짓) 실패의 경로로 분기된다.

따라서 맨 뒤 4자리의 값이  (xor 값들의 합) xor 12345678 의 결과값 과 같게 바꿔줘야 한다.

 

CodeEngn! 뒤의 aaaaa 를 NULL로 바꾸려면 A xor A = 0 인걸 이용해서 해당하는 알파벳과 맞춰준다.(JKLMN)

 

그리고 A xor B = C 일때 C xor B = A 인걸 이용해서 CodeEngn! 이 나오게끔 앞의 9자리를 바꿔준다.

 

위 값들을 설명하자면

 

02  2D  27  21  00  28  20  26  49   |  4A       4B      4C      4D       4E   |     7B      55       34      12

xor 연산 후 CodeEngn! 이 되는 부분xor 연산 후 NULL(00) 이 되는 부분 | (xor 연산의 합값) xor 12345678 의 결과값

 

 

헥스에디터를 사용해 CRAMKE3.KEY 파일을 수정해주고 프로그램을 실행하면,

 

 

성공!

'[Riversing] > [코드엔진] BASIC' 카테고리의 다른 글

[코드엔진] basic19  (0) 2020.04.06
[코드엔진] basic18  (0) 2020.04.06
[코드엔진] basic17  (0) 2020.04.04
[코드엔진] basic16  (0) 2020.04.04
[코드엔진] basic15  (0) 2020.04.04