상세 컨텐츠

본문 제목

abex crackme #1

학생일기/리버싱

by jaws99 2023. 7. 12. 14:04

본문

반응형

1. 파일 실행

파일을 실행하고, 확인을 눌러보니 Error 메시지가 나왔습니다.

 

2. 어셈블리어 특징

abex` crackme1은 어셈블리어로 제작됐습니다.

어셈블리어는 CPU의 명령어들을 이진수가 아닌 영어의 약자인 기호로 표시하고 기계어보다는 더 높은 수준에서 프로그램을 작성하는 것을 가능하게 합니다.

기호와 CPU의 명령어가 일대일 대응됩니다.

 

3. Start Debugging

맨 처음 실행하면 위와 같은 화면이 나옵니다.

Windows 8(64bit) 환경에서는 보안문제로 시작할 때 Shift+F9를 먼저 하고 실행해야 합니다.

실행하면 코드가 나오는데 이게 코드의 전부입니다.

이렇게 짧다는 건 다른 컴파일러를 사용해서 만든 프로그램이 아니라 직접 어셈블리어로 만들었다는 것을 알 수 있습니다.

프로그램이 시작되었을 때 블록이 되어있는 부분은 EP 코드라 하고 시작점을 나타냅니다.

 

4. crackme 분석

PUSH 네 번을 하고 난 후 스택 창입니다.

스택 창에서 PUSH옆에 주소인 0, 00402000 00402012 00000000이 거꾸로 쌓이는 걸 볼 수 있고, Style Title Text h0wner이라는 피라미터를 전달한 것을 확인할 수 있습니다.

 

빨간색으로 쓰여있는 MessageBoxA를 실행하면 메시지 박스가 뜨는 걸 보니 저 함수는 메시지 박스를 띄우는 함수인 것 같습니다.

 

그다음, GetDriveTypeA를 실행하면 리턴 값을 저장하는 EAX 3으로 바뀐 것을 확인할 수 있습니다.

INC는 Increase로 값을 1씩 증가시킵니다.

 

CMP EAX, ESI EAX ESI값을 비교합니다.

JE(Jump Equal)는 위에서 비교한 값이 같으면 인자의 주소로 점프하겠다는 의미입니다.

 

EAX와 ESI의 값은 같지 않으므로 점프하지 않습니다.

 

맨 처음과 봤던 이 메시지 박스를 다시 확인할 수 있습니다.

 

F9로 다시 시작을 한 다음,

 

기존의 JE(Jump Equal) 비교 구문을 수정해 보겠습니다.

 

더블 클릭해서 JMP로 수정했습니다.

 

CMP로 비교는 하지만, 결과와 상관없이 무조건 0040103D 주소로 점프를 합니다.

 

이렇게 결괏값을 바꾼 메시지 박스를 띄울 수 있습니다.

 

 

15년도에 작성했던 내용이라 어색하지만 아래 내용들을 알 수 있었습니다.

 

1. 함수의 파라미터는 역순으로 쌓아서 보낸다.

2. 함수의 리턴 값은 EAX에 저장된다.

3. CMP가 참이면 ZF가 1이 된다.

4. 윈도우 API를 찾아 GetDriveTypeA 디스크 드라이브가 이동식,  고정, CD-ROM, RAM 디스크 또는 네트워크 드라이브인지 여부를 확인하고 값을 리턴한다.

https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea

 

GetDriveTypeA function (fileapi.h)

Determines whether a disk drive is a removable, fixed, CD-ROM, RAM disk, or network drive.

docs.microsoft.com

반응형

'학생일기 > 리버싱' 카테고리의 다른 글

SECCON 2015 CTF-RPS  (0) 2020.11.03

관련글 더보기