Iriton's log

2. 리버싱 시작하기 - abex crackme #1 본문

Reversing/Study

2. 리버싱 시작하기 - abex crackme #1

Iriton 2024. 5. 22. 10:52

※*본 포스트는 '리버싱 입문' 책을 참고하여 작성되었습니다.

 

abex' crackme.zip
0.01MB

 

abex crackme를 다운 받을 수 있었던 Crackme.de 사이트가 접속 불가능 해져서 구글링을 통해 주워 온 exe 모음집이다.

악성 프로그램일 수도 있으니 가상머신에서 분석하는 것을 추천한다.

 

1. 프로그램 동작 방식


메세지 박스로 Make me think your HD is CD-Rom 이라고 뜬다.

그러고 확인 버튼을 누르면 아니라는 메세지 박스가 뜬다.

목적은 프로그램 실행 시 HD가 CD-Rom으로 인식되도록 변경하는 것

 

2. 엔트리 포인트


PEView 프로그램으로 exe 파일을 열면 PE 구조와 정보를 볼 수 있다.

Entry Point는 1000이고 Image Base는 400000이다.

Image Base의 값부터가 실제 저장되는 메모리의 주소이다.

즉, 401000이 실제 엔트리 포인트의 주소인 것이다.

디버거로 열면 확인 가능하다.

 

3. 디버깅


디버거로 열면 엔트리 포인트에서 실행이 멈춘다.

00401000이 엔트리 포인트임을 알 수 있다.

지금 보는 화면은 프로그램의 코드 영역이다.

PE 구조를 살펴 보면 SECTION CODE 영역에 저장된다.

 

스텝 오버와 스텝 인투

MessageBox 함수가 call 되고 있다. 

스텝 오버 F8키로 해당 명령어 줄까지 실행하고

스텝 인투  F7키로 서브루틴 안으로 들어갈 수 있다.

IAT(Import Address Table)에 있는 API를 호출할 경우에는

JMP DWORD PRT DS:[함수 주소]

와 같은 방식이 사용된다.

 

※ IAT

    : PE 파일에서 사용하는 외부 DLL에서 제공하는 함수 주소를 모아놓은 자료 구조, PE파일을 분석하면 IAT        에 대한 정보를 확인할 수 있다.

 

MessageBox() 구조

int WINAPI MessageBox(
	_In_opt_ HWND hwnd.
    _In_opt_ LPCTSTR IpText,
    _In_opt_ LPCTSTR IpCaption,
    _In_ UNIT uType
);

 

PUSH로 스택에 인자들을 넣고  함수를 호출한 것이다.

 

데이터가 저장된 주소를 보면 헥사값과 그에 맞는 아스키 코드가 보인다.

 

4. 프로그램 구조 분석


 

메세지 박스 호출한 뒤의 코드이다.

드라이브 타입을 가져오는 함수를 호출한 뒤 ESI는 3번 증가 EAX는 2번 감소 시켜서 두 값을 비교한다.

 

JE(Jump Equal) 명령어로 두 값을 비교해서 같으면 해당 메모리주소(0040103D)로 점프하고

아니면 그 다음줄을 실행한다.

이걸 판단하는 과정은 그 직전 CMP 명령어를 실행해서 같으면 ZF(Zero Flag)가 1이 되고 아니면 0이 된다.

ZF가 0인지 1인지에 따라 점프를 안 하냐, 하냐가 결정되는 것이다.

ZF가 0이면 Error 메세지를 보여주는 메세지박스를 실행시킨다.

즉, ESI+3과 EAX-2 값이 같아야 한다.

 

ZF가 1일 때 점프하여 도착하는 곳인 0040103D에는 성공 메세지를 띄우는 메세지박스 함수가 실행된다.

 

 

Exploit


1. 프로그램 코드 변경을 통한 문제 해결

 

비교하는 두 연산자의 값을 파악하기 위해 GetDriveTypeA() 실행 후 레지스터를 확인해 보자.

EAX가 3, ESI는 0이다.

JMP문의 주소를 변경하는 방법으로 한다면

00401023으로 이동하면

최종적으로 ESI +1 EAX -2가 돼서 두 레지스터 값이 모두 1이 된다.

 

해당 방법은 파일 저장을 해두면 프로그램 실행 때마다 성공 메세지를 볼 수 있다.

 

2. 제로플래그 변경을 통한 문제 해결

ZF를 저장할 수 없어서 좋은 방법은 아니지만 디버거를 열고 있는 상태에서 손쉽게 JE 구문을 우회할 수 있는 방법이다.

스텝오버로 CMP 실행까지 한 후 옆에 레지스터에서

Z를 클릭하면 1로 변경된다.

그리고 JE 명령어를 실행하면 성공 메세지박스 쪽으로 이동하게 된다.

 

'Reversing > Study' 카테고리의 다른 글

1. 리버싱을 위한 기초 지식  (1) 2024.03.17
Comments