본문 바로가기

RVS

Reversing.kr 13번 문제 (AutoHotkey1)

AutoHotkey1 문제는 (그림 1)처럼 두 개의 파일이 존재한다.

항상 그렇듯이 readme.txt 먼저 살펴보자.

그림 1

(그림 2)는 readme.txt 파일 내용이다.

Decrypt와 EXE 키는 md5 값이며, 해당 md5을 복호화하면 인증키를 획득할 수 있다는 내용이다.

그림 2

우선, 이 문제를 풀면서 AutoHotKey라는 프로그램을 처음 알게 되었다.

따라서 AutoHotKey이 어떤 프로그램인지를 알아보았다.

 

AutoHotKey는 윈도우 응용 프로그램이나 매크로를 만들 수 있는 오픈 소스 소프트웨어이다.

보통, 반복적인 작업을 자동으로 수행하도록하거나 단축키를 설정하기 위하여 사용된다.

 

AutoHotKey를 설치한 후에 사용자가 원하는 대로 스크립트 코드를 작성할 수 있다.

스크립트 파일은 ahk 확장자로 저장되고, ahk 파일을 컴파일하면 exe 파일이 생성된다.

AutoHotKey1는 현재 exe 파일이니까, 스크립트도 작성된 파일이 컴파일된 실행 파일인 셈이다.

 

AutoHotKey1를 실행해보니 (그림 3)과 같이 입력창이 하나가 존재하고 아무 문자가 입력한 후 OK 버튼을 누르게 되면 프로그램이 종료된다.

AutoHotKey 프로그램 동작에 대한 지식이 하나도 없다보니.. 처음부터 난관이었다.

우선, AutoHotKey에 대해서 더 찾아보고 알아보니 AutoHotKey 프로그램에 패스워드를 설정하고, 옳은 패스워드 입력시에 프로그램을 실행할 수 있도록 하는 기능이 있다!

바로 (그림 3)이 패스워드를 입력해야하는 창이다.

즉, 여기서 입력해야하는 패스워드가 decript's key가 된다.

 

그림 3

 

 

 

우선 AutoHotKey1.exe 파일을 Detect It Easy로 스캔해보니, (그림 4) 처럼 UPX로 패킹되었다.

UPX 언패킹 방식은 아래의 게시글에서 자세히 설명한다.

=> forensic-wetware.tistory.com/7

 

그림 4

 

(그림 5)는 UPX 언패킹 한 실행 파일을 디버거로 확인한 것이다.

언패킹을 수행하였지만, OEP를 찾지 못했다. 그리고 [F9] 단축키를 통해 프로그램을 실행하면 (그림 6)와 같은 오류창이 발생한다.

 

그림 5

 

 

그림 6

 

해당 오류 창이 발생하는 곳을 찾기 위해서 'Exe corrupted' 문자열을 검색해보았다.

(그림 7)과 같이 00448273 주소에 "EXE corrupted" 문자열이 존재한다. 해당 주소로 가보자.

 

그림 7

(그림 8)과 같이 00448273에 EXE corrupted 문자가 push된다.

조금 더 위를 살펴보면 00448265에서 해당 부분을 실행시키지 않고 점프하는 구간이 존재한다.

그리고 0044825E에서 ahk_dump_scp.4508C7 을 호출한 후 바로 다음 줄에서 test 문을 통해 리턴값인 eax를 검사한 후 je 점프문을 수행하거나 수행하지않는다. 

ahk_dump_scp.4508C7 함수를 좀 더 살펴볼 필요가 있다.

그림 8

 

언패킹된 프로그램을 통해선 정상적인 디버깅을 수행할 수 없으므로 패킹된 프로그램을 가지고 다시 디버깅을 수행하자.

우선, 패킹된 프로그램에서 언패킹과정까지를 수행하자.

그리고 단축키 [F2]로 0044825E에 breakpoint를 걸어두고 [F9]로 실행해보자.

그러면 (그림 9)처럼 0044825E 주소까지 실행된다. ahk_dump_scp.4508C7 함수 내부를 확인하여야하므로 [F7] 단축키를 통해 함수 내부로 들어가보자.

 

그림 9

 

함수 내부로 들어가서 [F8]을 통해 한 줄씩 계속해서 디버깅하다보면, (그림 10)과 같이 00480A75에서 ahk.450ABA 함수가 수행되고 ebx에 "220226394582d7117410e3c021748c2a>]1w"가 저장된다.

그림 10

 

좀 더 아래의 주소까지 실행하다 보면 (그림 11)에서처럼 exe's key는 결국 "220226394582d7117410e3c021748c2a>]1w"에서 "220226394582d7117410e3c021748c2a"가된다.

그림 11

 

ahk_dump_scp.4508C7 함수 내부를 다 돌고 다시 돌아오면 (그림 12)처럼 EIP가 00448263으로 돌아온다.

이 때, 00448285 주소에서 ">AUTOHOTKEY SCRIPT<"라는 문자가 보인다. 

ahk.48E320 메모리 주소를 살펴보자.

그림 12

 

(그림 13)은 ahk.48E320 메모리 주소 구간이다. 다음과 같이 아스키코드로 암호화되니 않은 평문 스크립트를 볼 수 있다. 

EXE 프로그램 암호화는 스크립트에서 설정이 가능하다.

그렇다면 스크립트 내부에 패스워드를 비교하는 구간이 존재할 것이다.

">AUTOHOTKEY SCRIPT<" 구간을 지나쳐 계속 디버깅을 수행해보았다.

 

그림 13

 

 

디버깅을 수행하다보니 (그림 14)의 00448422에서 ahk.450610 함수를 수행하면 edi:"if (pwd== \"54593f6b9413fc4ff2b4dec2da337806\"){{"를 볼 수 있다.

즉, EXE의 암호는 54593f6b9413fc4ff2b4dec2da337806인 것을 알 수 있다.

그림 14

 

결론적으로 Decrpt의 Key와 EXE의 Key는 다음과 같다.

두 개의 키는 md5로 암호화된 값이다. 아래의 사이트에서 각 md5를 복호화한 문자를 획득할 수 있다.

https://www.md5online.org/md5-decrypt.html

 

https://www.md5online.org/md5-decrypt.html

 

www.md5online.org

  • Decript Key: 220226394582d7117410e3c021748c2a (isolated)
  • EXE'x key: 54593f6b9413fc4ff2b4dec2da337806 (pawn)