외로운 Nova의 작업실

리버싱 입문 - 5(crackme5.exe) 본문

Computer App Penetesting/Reversing

리버싱 입문 - 5(crackme5.exe)

Nova_ 2022. 12. 14. 14:31

안녕하세요. 이번시간에는 crackme5.exe 파일을 리버싱해보고 크랙판을 만들어보도록 하겠습니다. 자료는 아래 올려놓겠습니다.

crackme5.exe
0.01MB

 

 

 

- 문제 인식

먼저 파일을 실행시켜보도록 하겠습니다.

이것도 4번 문제와 같이 시리얼을 넣으라고 하는 군요, 하지만 이번 문제는 check 버튼이 활성화가 되어있습니다. 한번 1234를 넣어서 check 버튼을 눌러보겠습니다.

시리얼 번호가 다르다고 나오는 군요, 이번 문제는 시리얼 번호를 알아내는 문제인 것 같습니다.

 

- 리버싱

ollydbg를 이용해 리버싱을 해주겠습니다.

그리고 함수가 있는지 확인하기위해 PUSH EBP를 검색해보겠습니다.

검색했지만 없는 것으로 확인됩니다. 이 프로그램은 무슨 언어로 쓰여졌을까요? DIE로 분석해보겠습니다.

분석 결과 delphi로 쓰여진 프로그램인 것으로 확인됩니다. delphi로 쓰여진 프로그램은 버튼에 대한 함수가 없는 걸까요? 보통 check 박스를 누르면 실행되는 버튼이 있던데... 일단 함수가 없으니 call 명령어를 분석해봐야할 것 같습니다. 

inermodular calls로 명령어를 분석하게되면 여러가지 것들이 나옵니다. 그중 브레이크를 걸 함수들이 눈에 띱니다. lstrcatA함수와 lstrcmpiA 함수입니다. 이둘을 검색해보겠습니다.

https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-lstrcata

 

lstrcatA function (winbase.h) - Win32 apps

Appends one string to another.Warning  Do not use. (ANSI)

learn.microsoft.com

https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-lstrcmpia

 

lstrcmpiA function (winbase.h) - Win32 apps

Compares two character strings. The comparison is not case-sensitive. (ANSI)

learn.microsoft.com

lstrcatA함수는 문자열을 붙이는 함수이고 lstrcmpiA함수는 문자열을 비교하는 함수입니다. 이부분에 브레이크를 걸고 코드흐름을 분석해보겠습니다. 

다시한번 디버거를 통해 crackme5.exe를 실행해주고 1234를 넣어서 check 버튼을 눌러보겠습니다. 

그러면 위와 같이lstrcatA 함수에서 멈추게됩니다. 4562-ABEX 문자열을 0040225C 주소 붙이는 함수 부분입니다. F9를 눌러 다음으로 넘어가겠습니다.

이번엔 L2C-5781 문자열을 00402000 주소에 붙이는 함수를 실행하게됩니다. 그다음으로 넘어가겠습니다.

이제는 처음에 붙였던 0040225C 문자열을 두번째에 붙였던 00402000 주소에 붙이는 함수를 실행합니다. 결과적으로 2개의 문자열이 00402000주소에 L2C-57816784-ABEX 형태로 붙여자게됩니다. 다음으로 넘어가겠습니다.

이제 붙인 문자열 00402000과 우리가 입력한 문자열이 저장된 주소 00402324를 비교하는 lstrcmpiA 함수를 실행하게됩니다. 이에따라 같다면 eax에 0이 반환되며 JE 분기문이 실행되서 yep, you~ 문자열이 출력되게됩니다. 결국 serial은 L2C-57816784-ABEX 이였습니다. 다시 프로그램을 종료하고 이 문자열을 넣어보겠습니다.

잘 되는 것을 확인할 수 있습니다. 과연 이문자열은 어디에서 나온것일까요? 먼저 저장된 주소를 보면 00402000번대 입니다. 이를 메모리 맵에서 확인해보겠습니다.

data 부분에 있는 것으로 확인됩니다. 즉, 프로그램 짤때 미리 입력해둔 값이라는 것을 알 수 있습니다.

 

- crack

크랙하는 방법은 분기문 JE 이전의 CMP EAX, 0 부분을 CMP EAX, EAX로 변경하여 항상 결과가 제로플래그가 1이 되게 하는 방법을 사용하겠습니다.

실제로 실행시켜서 확인해보겠습니다.

1234를 입력해도 잘 되었다고 출력하는 프로그램을 볼 수있습니다. 크랙한 것은 저장해서 아래에 올려두겠습니다.

crackme5(cracked).exe
0.01MB

 

 

- 번외

아까 전에 함수가 없는 이유는 해당 메시지 박스가 dialogboxparama함수로 띄워지는데 이는 createwindowEx 함수를 이용해서 만들어지게됩니다. createwindowEx는 이전에도 봤지만 버튼을 누르면 실행되는 부분을 PROC가 아닌 주소값을 이용해서 코드흐름이 이어지는 것 같다는 생각이 들었습니다.

Comments