ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ws1004(김규빈)'s LNK File Structure Analysis
    Team $!9N 구성원의 글/Forensic 2019. 11. 27. 00:48

    LNK File 이란?

    LNK File은 Shell Link나 Shortcut이라고 불리는 Link File 구조체 라고도 이야기를 하는데 다른 데이터들의 접근하는데에 필요한 정보를 가지고있는 데이터 입니다. Shell Link Binary File Format은 확장자가 .LNK 인 윈도우 파일 포맷 입니다.

    Shell Link는 보통 응용프로그램을 실행하거나 OLE 같은 시나리오를 Linking을 제공하기 위해서 사용하는것 뿐만아니라 파일에 대해 참조를 저장하는 기능을 필요로 하는 애플리케이션에 사용할 수도 있습니다.

     

    LNK File Format

    Shell Link Binary File Format의 구조를 보면 아래와 같습니다.

    기본적으로 5개의 구조체로 이루어져 있는데, 각각의 Link File 마다 다다르게 존재합니다.

     

    LNK 파일을 하나 010 editor 에 넣어서 LNK.bt 를 적용 시켜보면 아래와 같이 출력이 됩니다.

     

    위처럼 4개인 파일도 있고 아래 사진처럼 3개인 파일이 있습니다.

     

    이제 위의 구조체 5개에 대한 세부 내용을 확인해 보겠습니다.

     

    1. ShellLinkHeader

    ShellLinkHeader 구조는 앞서 이야기한 ShellTargerlDList, LinkInfo, StringData 를 포함하고 있는 식별 정보 및 타임스태프 등 여러 데이터가 명시된 데이터를 포함하고 있습니다.

     

    010 editor 에서도 확인할 수 있지만 ShellLinkHeader의 세부 데이터 설명은 아래와 같습니다.

     

    위의 구조를 직접 010 editor 에서 확인해 보겠습니다.

     

    위와 같이 나오는데 위에 적었던 것 처럼 고정값은 고정값대로 출력이 되는것을 확인할 수 있습니다.

     

    HeaderSize는 0x0000004C 즉, 76이라는 값이 고정적으로 들어갑니다.

    GUID LinkCLSID 값도 마찬가지로 {00021401-0000-0000-C000-000000000046} 라는 고정된 값이 출력됩니다.

     

    LinkFlags에 대해서 한번 알아 보겠습니다.

    한번 펼쳐 보면 아래와 같이 출력이됩니다.

     

    해당 데이터 에서는 총 28개의 LinkFlags 종류가 있습니다.

     

    LinkFlags 의 값이 0x00A00083 의 값이 눈에 띄는데 해당 값은 아래와 같이 만들어진 값이였습니다.

     

    Unused 를 최상위 비트로 가지고 비트를 나열해 보면 000010100000000010000011 이 됩니다. 이를 16진수로 환산하면 0xA0083 이 되는 것 이였습니다.

    Microsoft 에서 LinkFlags에 관련된 설명 :  https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/ae350202-3ba9-4790-9e9e-98935f4ee5af?redirectedfrom=MSDN

     

    그다음은 FileAttributes 에 대한 값입니다. 위의 LinkFlags 처럼 비트화 시킨뒤 16진수로 변환한 값을 hex로 표시 하는 방식입니다.

     

    해당 값은 0x00000020 입니다. 100000(2) 가 0x20 이기 때문입니다.

    해당 데이터에 대한 내용은 아래의 Microsoft에서 작성한 문서가 있습니다.

    문서 URL :  https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/378f485c-0be9-47a4-a261-7df467c3c9c6?redirectedfrom=MSDN

     

    그다음으로는 생성,접근,수정시각을 표시합니다.

     

    그리고 볼것은 ShowCommand 입니다.

    총 3가지의 값이 존재합니다.

    아래의 표에서 확인해 보겠습니다.

     

    3가지의 Value 값이 있습니다.

    제가 분석 대상 파일에서는 아래와 같은 값을 가지고 있습니다.

     

    SW_SHOWNORMAL 값을 띄고 있습니다.

     

    2. LnkTargetIDList

    LnkTargetIDList 구조체는 대상의 링크를 명시하고 있습니다. 이 구조체는 ShellLinkHeader안에 HasLinkTargetIDList bit에 의해서 지정이 된다.

     

    또한 지정된 IDList 구조체는 itemID로 구성되어 있으며 아래와 같은 구조로 구성되어있습니다.

     

    실제로 확인해 보면 아래와 같이 1개의 IDListSize와 여러개의 IDList 가 존재하고, IDList와 TerminalID 가 있는것을 확인 할 수 있습니다.

     

    그리고 IDList는 ItemIDSize와 Data로 이루어져 있습니다.

     

    데이터를 한번 확인해 보면 아래와 같습니다.

     

    GUID CLSID 값이란?

    COM 클래스 개체를 식별하기 위해서 사용하는 식별자를 이야기 합니다.

    CLSID 레지스트리에 저장이 되어 있습니다.

     

    CLSID(Class ID)[GUID]의 단축키 목록은 아래의 사이트에 정리 되어있습니다.

    사이트 주소 : https://www.tabmode.com/windows10/clsid-key-list.html

     

    위에 적혀 있는 GUID CLSID를 확인해 보면 {20D04FE0-3AEA-1069-A2D8-08002B30309D} 라고 적혀 있는데 사이트에서 보면 아래와 같습니다.

     

    내 컴퓨터관련 GUID 라고 이야기 합니다.

     

    제가 보기에 IDList 값을 쭉 연결 해보면 C:\User\WS1004\Desktop\MISC100\MISC100\MISC100 - Sifting through clues.docx 인것으로 보아 해당 LNK File의 원본 파일의 경로를 표시한것 같습니다.

     

    마지막 구조체가 하나더 있습니다.

     

    3. LinkInfo

    LinkInfo 구조체는 링크의 원본 위치를 찾지 못했을때 해결하기 위해서 필수 적인 정보를 명시합니다.

    링크가 생성되었을때 존재하는 원본 파일의 저장된 볼륨과 매핑된 드라이브 문자 및 UNK(Universal Naming Convention) 형식의 경로가 저장된 볼륨에 대한 정보를 포함하고 있습니다.

     

    한번 표로 구조를 표시해 보겠습니다.

     

    많은 데이터가 있지만 파일마다 있는 구조 데이터도 있고 없는 것도 있습니다.

    데이터를 확인해 보면 아래와 같습니다.

     

    그다음 알아볼 구조체는 LinkInfo 구조체에 있는 LinkInfoFlags 데이터 입니다.

    값이 2개 뿐이고, 해당 내용은 MS DOCX 에서 공부했습니다.

    주소 :  https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/6813269d-0cc8-4be2-933f-e96e8e3412dc

     

    위의 설명은 영문이고 아래의 설명은 번역한 내용입니다.

     

    실제 구조 데이터는 아래와 같습니다.

     

    VolumeIDAndLocalBasePath은 1이고 CommonNetworkRelativeLinkAndPathSuffix 값은 0 을 띄고 있습니다.

     

    맨아래의 데이터인 VolumeID 를 보면 데이터가 들어있습니다.

     

    VolumeID 구조를 한번 확인해 보겠습니다.

     

    마지막으로 DriveType에 대해서 알아 보겠습니다.

     

    현재 데이터는 DRIVE_FIXED 를 의미하고 있습니다.

    댓글

Designed by Tistory.