이 프로그램은 Key파일을 필요로 하는 프로그램이다.
'Cracked by: CodeEngn!' 문구가 출력 되도록 하려면 crackme3.key 파일안의 데이터는 무엇이 되어야 하는가
프로그램 실행모습
crackme3.key를 별도로 만들어주고 실행했다. 아무것도없다.
IDA에 올리자마자 훤히 보였다.
eax 값이 1이면 메세지박스를 볼 수 있겠다. al 이 왜 eax 냐면
EAX는 32비트 [ 0 ~ 31 ] - Extended AX
AX는 16비트 [ 0 ~ 15 ]
AH는 AX의 상위8비트 [ 8 ~ 15 ]
AL은 AX의 하위8비트이다. [ 0 ~ 7 ]
물론 64비트의 RAX도 있다.
CreateFileA 함수를 통해 "CRACKME3.KEY" 파일을 여는듯하다.
시각적자료
글 작성을 다하고 만든 표인데 제일 밑에 넣을까 하다 이 위치가 적당해 보여서 삽입해둔다.
글을 두서없이 적어놓아 이걸 보고 밑을 보면 이해하기 낫지 않을까 싶다
"CRACKME3.KEY" 을 열어서 18 ( 0x12 ) 바이트만큼 읽어와 402008에 저장 해둔다.
sub_401311(저장해둔데이터) 호출
65 ( 0x41 ) ~ 79 ( 0x4F )
데이터를 한 바이트씩 가져와 0x41부터 xor 연산을 하고 v2에 0이 들어가면, 즉 끝날때까지 반복한다.
그리고 ~ 0x41 ~ 0x4f까지 진행해서 0x4f 가되면 종료한다,
값은 4020F9에 들어간다.
그리고 dword_4020F9 ^= 0x1234568u 를 보면
4020F9와 0x1234568 을 xor 연산하는걸 알 수 있다.
연산된 값 + 14 의 주소에 들어있는 값을 리턴 ( 14는 offset 이라 보면 된다.)
리턴된 4020F9에 들어있는값이 같은지 비교한다.
CRACKME3.KEY에 임의로 "12345689012345678" 을 넣어준다.
00402008에 읽어온 데이터를 저장한다.
그리고 401311을 호출하면
데이터가 바뀐다.
0x41~ 0x4E 까지 xor 연산을 진행했으니 18글자중 14글자를 연산한셈이고 뒤 5678은 연산을 하지않아 그대로인 모습
설명하자면
data[ 17 ] = "123456789012345678" 이라 본다면
data[ 0 ] ~ data [ 13] 까지는 각각인 인덱스마다 0x41 에서 +1씩 해주며 xor 연산을해주고 이 값을
4020F9에 저장하고 다시 4020F9 ^ 0x12345678 xor 연산한 값을 덧씌우고
402008에 저장된 data [ 14 ~ 17 ] 을 비교 하는것.
이랬던 값이 ^0x12345678 을 하며
바뀌었다.
그런데 402008 에서 읽어들인 값의 뒤 4바이트와 같아야 한다.
5678을 넣어주어 같게 만들어 주었다.
메세지가 뜬다. 하지만 우리는 CodeEngn이 나타나도록 해야한다.
얻어냈다.
HxD로 열어 고쳐주자 그리고 끝났다는걸 알려주기위해 00을 넣어줘야한다.
08번 인덱스에는 0x49 와 xor 연산을 진행하게 되니 49를 넣어주면 0으로 설정된다.
49를 넣어주어 xor 연산이되면 0으로 설정되어 끝난걸 알게된다.
다시 실행해보면 1234557B가 입력되어 있는게 보인다.
1234557B를 "CRACKME3.KEY" 에 입력하는 18자리 값의 마지막 4바이트에 넣어주자.
1234557B를 입력해서 넣어주면
끝 ! 복잡했다... 너무 두서없이 적은거 같군.
어쨌든 이로써 CodeEngn - Basic RCE 는 모두 주파했다.
'Reverse Engineering > [CodeEngn] Basic RCE' 카테고리의 다른 글
[Reversing] CodeEngn - Basic RCE L19 (0) | 2024.07.03 |
---|---|
[Reversing] CodeEngn - Basic RCE L18 (0) | 2024.07.03 |
[Reversing] CodeEngn - Basic RCE L17 (0) | 2024.07.03 |
[Reversing] CodeEngn - Basic RCE L16 (0) | 2024.07.02 |
[Reversing] CodeEngn - Basic RCE L15 (0) | 2024.07.02 |