AutoHotkey1
An AutoHotkey-compiled binary: recovering the DecryptKey and the EXE key, then combining them into the AuthKey.
이번 문제 AuthHotkey 는 DecryptKey 및 EXE Key를 추출하여 최종 AuthKey를 도출하는 과정을 정리한다. 이 문제의 최종 인증 키(AuthKey)는 다음 수식으로 구성된다: AuthKey = un_md5(DecryptKey) + ” ” + un_md5(EXE’s Key)
먼저 EXEInfo 를 통해 파일의 타입을 봐주었다.

분석 대상 EXE는 UPX로 패킹되어 있었다. 언패킹 이후 실행하면 다음 문자열이 확인된다: “exe corrupted”
해당 메시지는 EXE 파일이 실제로 손상되었다는 의미가 아니다. 이는 AutoHotkey 런타임이 내부 스크립트를 (키) 정상 적으로 로드 또는 복호화하지 못했을 때 출력하는 오류 메시지다. 그러니 디버거에서 “exe corrupted” 문자열을 따라가 면 근처에서 다음 문자열을 확인할 수 있다. AUTOHOTKEY SCRIPT. (참고로 exe corrupted 라는 문자열이 나타났기에, 나는 다시 패킹 된 상태에 파일에서 분석을 해주었다)

코드를 자세히 살펴보자. 나는 코드를 분석하며 450C9F 함수에 들어가 분석을 했으며,EXE Key를 계산·조립한 뒤 이를 문자열 객체 형태로 넘겨주는 함수라는걸 알아냈다.
즉 함수 반환 직후가 EXE Key를 확인하기 가장 적절한 지점이라는 알수있다. 나는 AuthoHotKey Script 다음에 450C9F 호출 부분에 하드웨어 BP 를 걸어준후 도착후에 Step Into 대신 Step Over(F8) 를 사용하여 함수 호출이 끝난 직후의 레 지스터 상태를 확인 했다. 그후 ECX 값이 바뀌는걸 알수있었으며, 이 시점에서 ECX는 AHK 문자열 객체를 가르킨다는걸 알았다. ECX가 가리키는 내부 포인터를 따라가면 ASCII/Unicode 영역에서 MD5 형태의 문자열(EXE Key) 이 확인된다: 54593f6b9413fc4ff2b4dec2da337806

그 후 DECRYPT KEY 를 알아내기 위해 주변 어셈블리어를 보다, 해당 함수는 AUTOHOTKEY SCRIPT 분기로 진입하기 직전에 호출되는 마지막 함수, 4508C7 를 보았다. 이 함수를 살펴보면, 이 함수가 AUTOHOTKEY SCRIPT 분기로 갈 수 있는지 여부를 확인하는 함수라는걸 알수있었다. 이는 sub_4508C7의 리턴값(EAX)에 의해 결정됬고, 이곳이 DECRYPT KEY 를 알수있는 부분이라는걸 알수있었다 (왜냐하면 AUTOHOTKEY SCRIPT로 진입 = 복호화 또는 검증 과정이 성공).
내부를 살펴본 결과, 4508C7 함수는 다음과 같은 역할을 수행한다.
- 실행 중인 자기 자신의 EXE 파일 경로를 획득
- 내부에 포함된 고정 상수 테이블 2개를 조합
- 실행 파일 기반으로 검증용 값(Decrypt 판단용 값)을 계산
- 계산 결과를 기준으로 성공 또는 실패를 리턴
즉, 이 함수는 DecryptKey를 문자열 형태로 보관하는 함수가 아니라, DecryptKey를 만들어내는 재료와 검증 로직을 포함한 함수이다.
DecryptKey를 직접 획득하기 위해서는 “버퍼 조립이 끝나는 순간”을 찾아야 한다. 이 문제에서 버퍼 조립 완료 여부는 다음 비교 루프를 통해 확인할 수 있다.

- 비교 범위: 0 ~ 15 바이트
- 모든 바이트가 일치해야 루프가 정상 종료됨
이 루프가 깨지지 않고 끝났다는 것은 다음을 의미한다.
- 계산된 버퍼 B
- 기대값 버퍼 A
두 버퍼가 완전히 동일함을 의미하며, 즉 “버퍼 조립 + 키 계산 + 검증” 과정이 모두 완료된 상태이다.
비교 루프 이후 코드를 계속 따라가면 다음 주소에서 EBX 레지스터 창에 키가 뜬다: 0x00450A7F 이 시점의 아스키코드를 확인하면, 검증이 완료된 상태의 DecryptKey를 확인할 수 있다.
DecryptKey: 220226394582d7117410e3c021748c2a 그후 나는 닶을 얻기 위해 나는 https://md5.gromweb.com/ 라는 MD5 역산 사이트를 사용했다
최종 결과: isolated pawn