리버싱/리버싱 입문

abex crackme 3 풀이 + 함수 호출 규약

상세 2021. 3. 16. 00:51

1. 프로그램 개발 언어 알아내기

Detect It Easy 프로그램을 설치하고 실행하여 개발 언어, 패킹 여부를 알아내려는 프로그램을 연다.

그렇다면 이런 창이 뜰 건데 여기 빨간 줄이 쳐져 있는것이 그 프로그램의 언어이다.

(패킹 여부는 필자가 이 시점에서 배우지 않아 일단 생략한다.)

 

패킹 여부와 프로그램의 언어를 알아내는 것은 프로그램을 분석하기에 앞서 중요하다고 하니 꼭 습관을 들여야겠다.

2. 함수 호출 규약

함수를 호출할 때 인자를 전달하는 방식으로 "cdecl", "stdcall", "fastcall"

 

cdecl : 매개변수가 오른쪽에서 왼쪽으로 스택으로 전달된다.

예를 들어 매개변수가 a,b인 sum 함수를 호출하면... 

sum(a,b); b와 a순서로 스택에 전달된다는 의미이다.

 

또한 종료될 때 호출자가 피호출자의 스택 프레임을 정리한다.

 

stdcall : 스택으로의 전달방법은 전자와 같고 피호출자 스스로 스택 프레임을 정리한다.

 

fastcall : 레지스터를 사용하여 전달하고 별도로 스택을 정리할 필요가 없다.

 

3. abex crackme 3 풀이

일단 위 사진은 프로그램을 실행했을때 뜨는 창이다. 여기서 확인을 누르면 

아래 창이 뜨고 프로그램이 종료된다. 이제 ollydbg로 프로그램을 분석해보자

 

1단계 :  문제의 제시 파일 생성하기

0040_1034와 0040_1039부분을 잘 보자. 여기서 EAX의 값이 -1이라면 위의 실패화면이 뜨게 된다. 

그렇다면 이 1차 문제를 해결하려면 abex.l2c라는 파일이 abexcrackme3예제가 있는 곳에 있어야 한다는 의미이다.

그러므로 위 이름의 파일을 생성한다. 그렇다면 저 점프 명령어는 실행되지 않고 0040_1049로 가서 멈추게 된다.

 

2단계 : 파일의 조건에 맞게 용량 변경하기

브레이크 포인트가 걸려 있는 명령어 위의 0040_1046을 잘 보자 EAX값이 12와 같으면 성공화면이 뜨고 같지 않으면

0040_1060으로 이동하여 2단계 실패 화면이 뜨게 된다.

이 문제를 해결하려면 EAX에 저장되어 있는 값과 (abex.l2c의 용량) 12가 같아야 하는데.

 

여기서 12는 16진수이므로 10진수로 나타내면 18 즉 18의 크기를 가져야 한다. 

대충 크기가 10진수 기준으로 18이여야 한다는 의미이다.

크기를 18로 가지게 하려면 일단 메모장을 열어서 숫자 0을 18번 입력하고 저장하자.

 

그러면 성공화면이 다음과 같이 뜨게 된다.