[Reversing] 리버싱 핵심원리 [7 - 1]. abex' 2nd crackme 풀이

2020. 2. 27. 19:32보안/리버싱

728x90

내용 : abex crackme2를 풀이하는 과정을 소개, 어려운줄 알았으나 처음 알게 된 VisualBasic 리버싱 과정.

 

분석

 

첫 실행 화면

main을 찾아가는 방식부터 애를 먹었다.

책에 따르면 VB파일은 컴파일 옵션에 따라서 Native Code와, Psudo Code로 컴파일이 가능하다고 한다.

VB는 주로 GUI프로그래밍을 할 때 사용되며, IDE 인터페이스 자체도 GUI에 최적화 되어있다.

 

이는 C/ C++ 코드와 다르게, main() 함수에서 동작하는 것이 아닌 각 eventhandler에 사용자 코드가 존재한다.

즉, check 버튼을 눌렀을때 해당 지점으로 넘어가서 (함수처럼..) 이벤트를 처리한다는 말이다.

 

그래서 생각을 바꿔 Event가 발생하는 지점을 찾아 Name과 Serial을 비교하는 CMP 같은 어셈블리 명령어를 찾기로 했다.

 

EP지점은 그대로 둔 채로 어셈블리 코드 영역에서 SearchFor --> All referenced text strings를 이용하여 이벤트가 발생하는 메모리 주소로 따라들어갔다.

 

 

VisualBasic이 IDA에서 그래프(순서) 분석이 왜 인지는 잘 모르겠지만 안되어서 간단하게 흐름도를 그려보면 아래와 같다

 

 

 

(Serial은 별도의 암호화 과정이 있음.)

글이 갑자기 싸구려처럼 보이는 효과..

우선 눈으로 확인할 수 있는 시리얼 오류 메시지인 00403476 메모리 주소로 따라들어가보면 근처에 시리얼이 맞는지 확인하는 부분이 있을것 이라 예상하고 근처를 뒤져봤다.

 

BP 설정

 

총 6군데에 BP를 걸어두었다.

 

1. 정답 MessageBox를 출력하는 부분

2. 실패 MessageBox를 출력하는 부분

3. (1)의 조건을 위해 AX를 검사하는 부분

4-5. vbahresultCheckObj 함수로 타고 들어가는 부분 (아직 잘 모름..)

6. (2)의 조건을 위해 AX를 검사하는 부분

 

Abex' CrackMe 2는 2가지의 방법으로 풀이하였다.

 

1. 스택영역에 나온 시리얼 코드 확인하기

운이 좋게 stack영역을 보다가 unicode로 표현된 시리얼과 비슷한걸 넣었더니 되었다.......

 

스택영역에 그대로 나타난 시리얼 코드..

2. 분기문의 코드 수정.

원래 정답으로 가는 코드에서  "TEST AX, AX" 의 조건이 만족하여 정답이 아닌 분기문으로 넘어가는데 아래의 조건에 NOT 조건을 붙여주어 부정조건으로 정답코드가 출력되게 하였다.

 

점프 조건 수정

 

아래와 같이 정답! 이 출력되었다.

 

처음 비주얼베이직 파일을 다뤄봐서, 이벤트 형식으로 코드 부분이 짜여져 있는지 몰라 처음부터 하느라 삽질,,

이상한 곳으로 CALL하는 것이 시리얼 코드로 들어가는 부분이라 하루종일 삽질.. 하는 바람에 정답을 찾기까지 꽤 오래 걸렸다. 실수로 끝까지 디버깅 실행을 하는 바람에 우연치 않게  시리얼 코드를 찾을수 있었는데 아쉬워서 다른 방법을 찾다가 업로드 기간이 늘어졌다,,

 

다음은 시리얼 코드를 생성하는 방법에 대한 포스팅을 작성하겠다..

728x90