Autoit은 스크립트 언어이지만 aut2exe.exe라는 변환기를 이용해 쉽게 exe 실행 파일로 변환할 수 있다. 대신 디컴파일로 간단한데 exe2aut.exe라는 디컴파일러를 통해 쉽게 autoit 스크립트 소스 코드를 얻을 수 있다. 만약 이 실행 파일에 또 다른 파일이 (악성코드의 경우 대부분 바이너리) 포함되어 있다면 그것도 드랍해 준다.


  이렇게 디컴파일이 가능하고 문법 자체도 그렇게 어렵지 않기 때문에 처음 본 경우라도 쉽게 분석할 수 있다. 하지만 분석하다 보면 트릭을 사용하거나 해서 이해하기 힘든 부분이 존재하는데 여기에서는 그러한 내용들을 다루려고 한다.





1. FileInstall() 함수

  FileInstall() 함수는 실행 파일로 변환 시 특정 파일을 포함할 수 있고 실행 시에는 드랍할 수 있는 기능을 가진 함수이다. 문제는 이것이 설명만 보아서는 이해하기 힘든 내용이라는 점이다. 물론 원래 이러한 기능을 생각한 것은 아니었지만 일종의 트릭이 되어서일 수도 있다.


FileInstall("PEview.exe", @TempDir & "\PEview.exe",1)

Run(@ComSpec & " /c " & @TempDir & "\PEview.exe", "", @SW_HIDE)


  위와 같은 내용의 .au3 소스 코드를 만든다. 이후 Aut2Exe를 이용해 .au3 소스 코드를 .exe 실행 파일로 변환한다. 이 때 소스 코드와 같은 디렉터리에 PEview.exe를 같이 두어야 한다. (FileInstall() 함수 첫 번째 인자의 경로가 현재 디렉터리이므로) 그러면 실행 파일로 변환될 때 PEview.exe가 실행 파일에 같이 통합된다.


  이제 이 실행 파일을 실행시키면 FileInstall() 함수의 두 번째 인자인 Tmp 디렉터리에 PEview.exe가 추출되어 위치하며 이후의 Run() 함수를 통해 그곳에서 실행된다. 즉 FileInstall() 함수의 첫 번째 인자는 바이너리에 통합할 실행 파일이며 두 번째 인자는 나중에 실행 시에 통합된 실행 파일이 추출될 위치이다.





2. 셸코드

  Autoit 스크립트 내에서 트릭을 이용해 직접 셸코드를 실행시킬 수도 있다. 다음은 그 예제인데 DllStructCreate()를 이용해 구조체를 생성하고 DllStructSetData()로 셸코드를 설정한 후 DllStructGetPtr() 해당 셸코드의 주소를 얻어온 후 DllCallAddress()로 실행시키는 방식이다. 이후 DllStructGetData()로 반환 값을 얻어와서 스크립트에서 그 결과를 사용할 수도 있다.


[ https://www.autoitscript.com/forum/topic/192706-extended-cpuid-x86-x64/ ]





3. 관리자 권한을 가진 바이너리

  프로그램이 관리자 권한을 가지고 실행되는 속성을 가진 경우가 있다. Windows Vista 이후부터는 아이콘에 추가적인 그림이 표시되기 때문에 쉽게 확인할 수 있을 것이다. 정확히는 리소스 섹션의 Manifest 부분을 통해 다음을 확인할 수 있다.


<security>

  <requestedPrivileges>

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>

  </requestedPrivileges>

</security>


  이러한 경우는 해당 바이너리를 디컴파일하기 위해 exe2aut에 드래그 앤 드랍으로 끌어놓으면 exe2aut가 "Couldn't invoke the file!"이라는 메시지를 내보내는 것을 볼 수 있다. exe2aut는 일반 사용자 권한으로 실행되었기 때문에 관리자 권한으로 실행되는 프로그램을 다룰 수 없기 때문이다. 만약 exe2aut를 관리자 권한으로 실행시킨다면 드래그 앤 드랍 방식이 통하지 않는다. cmd를 관리자 권한으로 실행시킨 후 파일을 끌어다 놓는 드래그 앤 드랍 방식이 통하지 않았던 것을 보면 윈도우에서는 기본적으로 이러는 것 같다.


  문제는 exe2aut는 드래그 앤 드랍 방식 말고 커맨드 라인 방식으로 인자를 받거나 하지 않기 때문에 일반 사용자 권한으로는 관리자 권한인 바이너리를 다룰 수 없고 관리자 권한으로는 드래그 앤 드랍이 되지 않아서 삽질을 많이 했다.


  결론만 이야기하자면 이 경우에는 간단하게 관리자 권한 메커니즘 즉 Integrity Level이 존재하지 않는 Windows XP에서 작업하면 된다.


  또는 아래의 x64 바이너리를 디컴파일하는 방법에서 설명된 방식을 사용할 수 있다. 간략하게 설명하자면 컴파일된 소스 코드를 추출하여 빈 바이너리에 덧붙인 후 이것을 exe2aut에 올려서 디컴파일하는 방식이다.





4. x64 바이너리 디컴파일

  Exe2aut는 x64 바이너리를 지원하지 않지만 트릭을 사용하면 x86과 마찬가지로 쉽게 디컴파일이 가능하다. 바로 위에서 간략하게 설명하였듯이 준비물은 AutoIt이 스크립트 파일을 exe 파일로 변환하는데 사용하는 dumb 바이너리와, 컴파일된 소스 코드가 필요하다. 빈 바이너리는 설치 폴더에서 찾을 수 있으며 컴파일된 소스 코드 부분은 아래의 방식처럼 쉽게 바이너리 검색으로 찾을 수 있다.


  이것은 다음의 링크에서 참조한 내용이며 여기서는 간략하게 방식만 설명한다.

http://www.hexacorn.com/blog/2015/01/08/decompiling-compiled-autoit-scripts-64-bit-take-two/ ]


  먼저 x64 버전의 AutoIt 바이너리에서 컴파일된 소스 코드를 추출한다. 컴파일된 소스 코드는 다음 값으로 시작한다.


=> Hex : A3 48 4B BE 98 6C 4A A9 99 4C 53 0A 86 D6 48 7D41 55 33 21 45 41 30 36 4D ...

=> Text : £HK¾˜lJ©™LS†ÖH}AU3!EA06M ...


  그리고 여기부터 시작해서 다음 값으로 끝난다.


=> Hex : ... 41 55 33 21 45 41 30 36

=> Text : ... AU3!EA06


  저 시작 부분부터 끝 부분까지를 저장해 놓자.


  이후 AutoIt을 설치하고 해당 설치 폴더에서 Exe2Aut 폴더에 들어간다. 그러면 [ AutoItSC.bin ]이라는 파일을 찾을 수 있다. 이 파일을 열어서 파일의 마지막 부분에 앞에서 저장했던 컴파일된 소스 코드를 덧붙이고 저장한다. 이렇게 간단히 모든 과정이 끝나고 이제 저장된 바이너리를 Exe2aut에 올리면 정상적으로 디컴파일된 것을 확인할 수 있다.



Posted by SanseoLab

블로그 이미지
Malware Analyst
SanseoLab

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 달린 댓글

글 보관함