코드엔진 사이트에 들어가 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 |