<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>44e &amp;mdash; Paweł Goleń, blog</title>
    <link>https://wampir.mroczna-zaloga.org/tag:44e</link>
    <description></description>
    <pubDate>Tue, 28 Apr 2026 02:08:48 +0000</pubDate>
    <item>
      <title>Rozwiązanie wyzwania: Forensic Challenge 2010 - Banking Troubles</title>
      <link>https://wampir.mroczna-zaloga.org/rozwiazanie-wyzwania-forensic-challenge-2010-banking-troubles</link>
      <description>&lt;![CDATA[Opublikowane zostało rozwiązanie wyzwania Forensic Challenge 2010 - Banking Troubles. Choć nie uczestniczę w tego typu wyzwaniach (nie wysyłam odpowiedzi), to zadaniom się przyglądam i część z nich, te ciekawsze, rozwiązuję. Czytam również zgłaszane odpowiedzi, po to by popatrzeć, jak z problemem poradzili sobie inni. W tym przypadku dla mnie najbardziej ciekawe były odpowiedzi udzielone na poniższe pytanie:&#xA;&#xA;  5\. Were there any files that were able to be extracted from the initial process? How were these files extracted? (6pts) &#xA;&#xA;Rozwiązania opierały się tutaj zwykle na zrzucie pamięci wirtualnej wybranych procesów i odzyskanie z nich plików PDF, na przykład przy użyciu narzędzia Foremost lub Scalpel. Ja do tego zadania podszedłem w nieco inny sposób, wspominałem o tym we wpisie Odczytywanie plików z filecache.&#xA;&#xA;Fakt, wybrana przeze mnie metoda nie do końca może jest zgodna z pytaniem, szczególnie następującym jego fragmentem: from the initial process , ale jest ciekawsza :) Przy okazji można było nauczyć się czegoś o działaniu systemu od środka.&#xA;&#xD;&#xA;!--more--&#xD;&#xA;Odzyskanie pliku z filecache&#xA;&#xA;Stosowane podejście opisałem już wcześniej we wspominanym wpisie, tutaj pokażę jego zastosowanie konkretnie w odniesieniu do zrzutu pamięci udostępnionego w ramach forensic challenge. Przypominam, że udostępniony zrzut jest w formacie raw i przed załadowaniem go do Windbg konieczna była konwersja do odpowiedniego formatu. Konwersja ta może być wykonana przy pomocy Volatility lub przy pomocy narzędzi z pakietu MoonSols Windows Memory Toolkit.&#xA;&#xA;W pierwszym kroku poszukamy obiektu FILEOBJECT, który będziemy odzyskiwać. Ponieważ atakowanym obiektem jest proces Acrobat Reader, właśnie od niego można zacząć:&#xA;    &#xA;    &#xD;&#xA;    16.kd  !process 0 0&#xD;&#xA;    (...)&#xD;&#xA;    PROCESS 820618c8  SessionId: 0  Cid: 06d8    Peb: 7ffd6000  ParentCid: 0378&#xD;&#xA;        DirBase: 04040300  ObjectTable: e1ec4558  HandleCount: 184.&#xD;&#xA;        Image: AcroRd32.exe&#xD;&#xA;    &#xD;&#xA;    &#xD;&#xA;    16.kd  .process /0 820618c8&#xD;&#xA;    Unknown option &#39;0&#39;&#xD;&#xA;    Implicit process is now 820618c8&#xD;&#xA;    &#xD;&#xA;    &#xD;&#xA;    16.kd  !handle &#xD;&#xA;    (...)&#xD;&#xA;    01d4: Object: 81dfadf0  GrantedAccess: 00120089 Entry: e110e3a8&#xD;&#xA;    Object: 81dfadf0  Type: (823eb040) File&#xD;&#xA;        ObjectHeader: 81dfadd8 (old version)&#xD;&#xA;            HandleCount: 1  PointerCount: 3&#xD;&#xA;            Directory Object: 00000000  Name: \DOCUME~1\ADMINI~1\LOCALS~1\Temp\plugtmp\PDF.php {HarddiskVolume1}&#xD;&#xA;    (...)&#xD;&#xA;    &#xD;&#xA;    16.kd  dt nt!FILEOBJECT 81dfadf0&#xD;&#xA;       +0x000 Type             : 5&#xD;&#xA;       +0x002 Size             : 112&#xD;&#xA;       +0x004 DeviceObject     : 0x81dbf2d0 DEVICEOBJECT&#xD;&#xA;       +0x008 Vpb              : 0x823e5c50 VPB&#xD;&#xA;       +0x00c FsContext        : 0xe10d2d90 &#xD;&#xA;       +0x010 FsContext2       : 0xe1eb67d0 &#xD;&#xA;       +0x014 SectionObjectPointer : 0x820cbeec SECTIONOBJECTPOINTERS&#xD;&#xA;       +0x018 PrivateCacheMap  : 0x820c1ca8 &#xD;&#xA;       +0x01c FinalStatus      : 0&#xD;&#xA;       +0x020 RelatedFileObject : (null) &#xD;&#xA;       +0x024 LockOperation    : 0 &#39;&#39;&#xD;&#xA;       +0x025 DeletePending    : 0 &#39;&#39;&#xD;&#xA;       +0x026 ReadAccess       : 0x1 &#39;&#39;&#xD;&#xA;       +0x027 WriteAccess      : 0 &#39;&#39;&#xD;&#xA;       +0x028 DeleteAccess     : 0 &#39;&#39;&#xD;&#xA;       +0x029 SharedRead       : 0x1 &#39;&#39;&#xD;&#xA;       +0x02a SharedWrite      : 0 &#39;&#39;&#xD;&#xA;       +0x02b SharedDelete     : 0 &#39;&#39;&#xD;&#xA;       +0x02c Flags            : 0x1c0042&#xD;&#xA;       +0x030 FileName         : UNICODESTRING &#34;\DOCUME~1\ADMINI~1\LOCALS~1\Temp\plugtmp\PDF.php&#34;&#xD;&#xA;       +0x038 CurrentByteOffset : LARGEINTEGER 0x4d13&#xD;&#xA;       +0x040 Waiters          : 0&#xD;&#xA;       +0x044 Busy             : 0&#xD;&#xA;       +0x048 LastLock         : (null) &#xD;&#xA;       +0x04c Lock             : KEVENT&#xD;&#xA;       +0x05c Event            : KEVENT&#xD;&#xA;       +0x06c CompletionContext : (null) &#xD;&#xA;    &#xA;&#xA;Ten sam rezultat można również uzyskać w nieco inny sposób:&#xA;    &#xA;    &#xD;&#xA;    16.kd  !filecache&#xD;&#xA;    ** Dump file cache***&#xD;&#xA;      Reading and sorting VACBs ...&#xD;&#xA;      Removed 1746 nonactive VACBs, processing 292 active VACBs ...&#xD;&#xA;    File Cache Information&#xD;&#xA;      Current size 44764 kb&#xD;&#xA;      Peak size    69144 kb&#xD;&#xA;      292 Control Areas&#xD;&#xA;    Skipping view @ c1240000 - no VACB, but PTE is valid!&#xD;&#xA;      Loading file cache database (100%25 of 130560 PTEs)&#xD;&#xA;      SkippedPageTableReads = 130&#xD;&#xA;      File cache has 5974 valid pages&#xD;&#xA;    &#xD;&#xA;    &#xD;&#xA;      Usage Summary (in Kb):&#xD;&#xA;    Control Valid Standby/Dirty Shared Locked FsContext Name&#xD;&#xA;    (...)&#xD;&#xA;    82091008    20      0     0     0 e10d2d90  PDF.php&#xD;&#xA;    (...)&#xD;&#xA;    &#xD;&#xA;    16.kd  !ca 82091008&#xD;&#xA;    &#xD;&#xA;    ControlArea  @ 82091008&#xD;&#xA;      Segment      e1713588  Flink      00000000  Blink        00000000&#xD;&#xA;      Section Ref         1  Pfn Ref           5  Mapped Views        1&#xD;&#xA;      User Ref            0  WaitForDel        0  Flush Count         0&#xD;&#xA;      File Object  81dfadf0  ModWriteCount     0  System Views        1&#xD;&#xA;    &#xD;&#xA;      Flags (8008080) File WasPurged Accessed &#xD;&#xA;    &#xD;&#xA;          File: \DOCUME~1\ADMINI~1\LOCALS~1\Temp\plugtmp\PDF.php&#xD;&#xA;    &#xD;&#xA;    Segment @ e1713588&#xD;&#xA;    Type nt!MAPPEDFILESEGMENT not found.&#xD;&#xA;    &#xA;&#xA;Jak widać w ten sposób też znaleziony został FILEOBJECT 81dfadf0.&#xA;&#xA;Posiadając adres FILEOBJECT można uzyskać dodatkowe informacje na jego temat:&#xA;    &#xA;    &#xD;&#xA;    16.kd  !fileobj 81dfadf0&#xD;&#xA;    &#xD;&#xA;    \DOCUME~1\ADMINI~1\LOCALS~1\Temp\plugtmp\PDF.php&#xD;&#xA;    &#xD;&#xA;    Device Object: 0x81dbf2d0   \Driver\Ftdisk&#xD;&#xA;    Vpb: 0x823e5c50&#xD;&#xA;    Event signalled&#xD;&#xA;    Access: Read SharedRead &#xD;&#xA;    &#xD;&#xA;    Flags:  0x1c0042&#xD;&#xA;    &#x9;Synchronous IO&#xD;&#xA;    &#x9;Cache Supported&#xD;&#xA;    &#x9;Handle Created&#xD;&#xA;    &#x9;Fast IO Read&#xD;&#xA;    &#x9;Random Access&#xD;&#xA;    &#xD;&#xA;    FsContext: 0xe10d2d90&#x9;FsContext2: 0xe1eb67d0&#xD;&#xA;    Private Cache Map: 0x820c1ca8&#xD;&#xA;    CurrentByteOffset: 4d13&#xD;&#xA;    Cache Data:&#xD;&#xA;      Section Object Pointers: 820cbeec&#xD;&#xA;      Shared Cache Map: 820c1bd0         File Offset: 4d13 in VACB number 0&#xD;&#xA;      Vacb: 823b78c8&#xD;&#xA;      Your data is at: d2dc4d13&#xD;&#xA;    &#xA;&#xA;Interesuje nas informacja o adresie SHAREDCACHEMAP, w tym wypadku jest to 820c1bd0:&#xA;    &#xA;    &#xD;&#xA;    16.kd  dt nt!SHAREDCACHEMAP 820c1bd0&#xD;&#xA;       +0x000 NodeTypeCode     : 767&#xD;&#xA;       +0x002 NodeByteSize     : 304&#xD;&#xA;       +0x004 OpenCount        : 1&#xD;&#xA;       +0x008 FileSize         : LARGEINTEGER 0x4d13&#xD;&#xA;       +0x010 BcbList          : LISTENTRY [ 0x820c1be0 - 0x820c1be0 ]&#xD;&#xA;       +0x018 SectionSize      : LARGEINTEGER 0x40000&#xD;&#xA;       +0x020 ValidDataLength  : LARGEINTEGER 0x4d13&#xD;&#xA;       +0x028 ValidDataGoal    : LARGEINTEGER 0x4d13&#xD;&#xA;       +0x030 InitialVacbs     : [4] 0x823b78c8 VACB&#xD;&#xA;       +0x040 Vacbs            : 0x820c1c00  -  0x823b78c8 VACB&#xD;&#xA;       +0x044 FileObject       : 0x81dfadf0 FILEOBJECT&#xD;&#xA;       +0x048 ActiveVacb       : (null) &#xD;&#xA;       +0x04c NeedToZero       : (null) &#xD;&#xA;       +0x050 ActivePage       : 0&#xD;&#xA;       +0x054 NeedToZeroPage   : 0&#xD;&#xA;       +0x058 ActiveVacbSpinLock : 0&#xD;&#xA;       +0x05c VacbActiveCount  : 0&#xD;&#xA;       +0x060 DirtyPages       : 0&#xD;&#xA;       +0x064 SharedCacheMapLinks : LISTENTRY [ 0x81c6706c - 0x81c6a404 ]&#xD;&#xA;       +0x06c Flags            : 0x1000&#xD;&#xA;       +0x070 Status           : 0&#xD;&#xA;       +0x074 Mbcb             : (null) &#xD;&#xA;       +0x078 Section          : 0xe1646158 &#xD;&#xA;       +0x07c CreateEvent      : (null) &#xD;&#xA;       +0x080 WaitOnActiveCount : (null) &#xD;&#xA;       +0x084 PagesToWrite     : 0&#xD;&#xA;       +0x088 BeyondLastFlush  : 0&#xD;&#xA;       +0x090 Callbacks        : 0xf84300ac CACHEMANAGERCALLBACKS&#xD;&#xA;       +0x094 LazyWriteContext : 0xe10d2d90 &#xD;&#xA;       +0x098 PrivateList      : LISTENTRY [ 0x820c1cf4 - 0x820c1cf4 ]&#xD;&#xA;       +0x0a0 LogHandle        : (null) &#xD;&#xA;       +0x0a4 FlushToLsnRoutine : (null) &#xD;&#xA;       +0x0a8 DirtyPageThreshold : 0&#xD;&#xA;       +0x0ac LazyWritePassCount : 0&#xD;&#xA;       +0x0b0 UninitializeEvent : (null) &#xD;&#xA;       +0x0b4 NeedToZeroVacb   : (null) &#xD;&#xA;       +0x0b8 BcbSpinLock      : 0&#xD;&#xA;       +0x0bc Reserved         : (null) &#xD;&#xA;       +0x0c0 Event            : KEVENT&#xD;&#xA;       +0x0d0 VacbPushLock     : EXPUSHLOCK&#xD;&#xA;       +0x0d8 PrivateCacheMap  : PRIVATECACHEMAP&#xD;&#xA;    &#xA;&#xA;W tym miejscu pojawia się nieco magii. Sposób organizacji file cache zawiera różne optymalizacje, może pojawić się struktura &#34;drzewiasta&#34;. Tu na szczęście tak się nie dzieje, bo plik jest stosunkowo mały (patrz FileSize oraz SectionSize). W tym wypadku można popatrzeć na wskaźniki do VACB umieszczone w InitialVacbs:&#xA;    &#xA;    &#xD;&#xA;    16.kd  dp %25820c1bd0+0x030&#xD;&#xA;    820c1c00  823b78c8 00000000 00000000 00000000&#xD;&#xA;    &#xA;&#xA;Pozostaje tylko odczytać zawartość:&#xA;    &#xA;    &#xD;&#xA;    16.kd  dt nt!VACB 823b78c8&#xD;&#xA;       +0x000 BaseAddress      : 0xd2dc0000 &#xD;&#xA;       +0x004 SharedCacheMap   : 0x820c1bd0 SHAREDCACHEMAP&#xD;&#xA;       +0x008 Overlay          : _unnamed&#xD;&#xA;       +0x010 LruList          : LISTENTRY [ 0x823b58f8 - 0x823b7140 ]&#xD;&#xA;    &#xD;&#xA;    16.kd  db %250xd2dc0000&#xD;&#xA;    d2dc0000  25 57 4e 49 46 49 4c 53-4e 46 49 45 4f 57 4e 53  %25WNIFILSNFIEOWNS&#xD;&#xA;    d2dc0010  44 46 0d 0a 25 44 4b 4b-4b 53 44 46 4e 49 45 0d  DF..%25DKKKSDFNIE.&#xD;&#xA;    d2dc0020  0a 25 50 44 46 2d 31 2e-33 0d 0a 25 4d 4d 57 49  .%25PDF-1.3..%25MMWI&#xD;&#xA;    d2dc0030  45 4e 4f 46 0d 0a 25 57-4e 49 46 49 4c 53 4e 46  ENOF..%25WNIFILSNF&#xD;&#xA;    d2dc0040  49 45 4f 57 4e 53 44 46-0d 0a 31 30 35 34 20 30  IEOWNSDF..1054 0&#xD;&#xA;    d2dc0050  20 6f 62 6a 0d 0a 3c 3c-2f 4c 65 6e 67 74 68 20   obj..&lt;&lt;/Length &#xD;&#xA;    d2dc0060  30 30 30 30 2f 46 69 6c-74 65 72 20 5b 2f 46 23  0000/Filter [/F#&#xD;&#xA;    d2dc0070  36 63 23 36 31 23 37 34-65 23 34 34 65 23 36 33  6c#61#74e#44e#63&#xD;&#xA;    &#xA;&#xA;I jeszcze końcówka pliku uwzględniając jego rozmiar:&#xA;    &#xA;    &#xD;&#xA;    16.kd  db %250xd2dc4d13 L-100&#xD;&#xA;    d2dc4c13  30 20 52 3e 3e 0d 0a 65-6e 64 6f 62 6a 0d 0a 37  0 R    ..endobj..7&#xD;&#xA;    d2dc4c23  38 37 20 30 20 6f 62 6a-0d 0a 3c 3c 2f 43 6f 75  87 0 obj..&lt;&lt;/Cou&#xD;&#xA;    d2dc4c33  6e 74 20 31 2f 54 79 70-65 2f 50 61 67 65 73 2f  nt 1/Type/Pages/&#xD;&#xA;    d2dc4c43  4b 69 64 73 5b 31 38 34-37 20 30 20 52 5d 3e 3e  Kids[1847 0 R]    d2dc4c53  0d 0a 65 6e 64 6f 62 6a-0d 0a 31 31 20 30 20 6f  ..endobj..11 0 o&#xD;&#xA;    d2dc4c63  62 6a 0d 0a 3c 3c 2f 53-2f 4a 61 76 61 53 63 72  bj..&lt;&lt;/S/JavaScr&#xD;&#xA;    d2dc4c73  69 70 74 2f 4a 53 20 31-30 35 34 20 30 20 52 3e  ipt/JS 1054 0 R  d2dc4c83  3e 0d 0a 65 6e 64 6f 62-6a 0d 0a 31 38 34 37 20    ..endobj..1847 &#xD;&#xA;    d2dc4c93  30 20 6f 62 6a 0d 0a 3c-3c 2f 50 61 72 65 6e 74  0 obj..&lt;&lt;/Parent&#xD;&#xA;    d2dc4ca3  20 37 38 37 20 30 20 52-2f 52 65 73 6f 75 72 63   787 0 R/Resourc&#xD;&#xA;    d2dc4cb3  65 73 20 31 38 34 37 20-30 20 52 2f 54 79 70 65  es 1847 0 R/Type&#xD;&#xA;    d2dc4cc3  2f 50 61 67 65 2f 41 41-3c 3c 2f 4f 20 31 31 20  /Page/AA&lt;&lt;/O 11 &#xD;&#xA;    d2dc4cd3  30 20 52 3e 3e 3e 3e 0d-0a 65 6e 64 6f 62 6a 0d  0 R        ..endobj.&#xD;&#xA;    d2dc4ce3  0a 78 72 65 66 0d 0a 74-72 61 69 6c 65 72 0d 0a  .xref..trailer..&#xD;&#xA;    d2dc4cf3  3c 3c 2f 52 6f 6f 74 20-31 31 32 20 30 20 52 3e  &lt;/Root 112 0 R&#xD;&#xA;    d2dc4d03  3e 0d 0a 64 4c 4e 57 45-49 4f 46 39 33 66 30 6e    ..dLNWEIOF93f0n&#xD;&#xA;    &#xA;&#xA;Jak widać - w coś trafiłem, a poszukiwane dane znajdują się pomiędzy 0xd2dc0000 a 0xd2dc4d13, plik można odzyskać korzystając z .writemem. Rezultaty Virustotal na odzyskanym pliku można znaleźć tu: http://www.virustotal.com/analisis/551147a39bc439f46421a994fdbe6c5bafed90bf3b79121722d95bfa1ea435a1-1273748929.&#xA;&#xA;Warto zwrócić uwagę, że pliki odzyskane przez uczestników wyzwania nieco różniły się od pliku, który został odzyskany przeze mnie. Między innymi różniły się wielkością, być może carver jako plik potraktował zbyt wiele. W każdym razie również w odzyskanym przeze mnie pliku można znaleźć &#34;interesujący&#34; fragment obfuskowango kodu, dokładnie taki sam, jak został przedstawiony w nagrodzonych rozwiązaniach. Warto też zwrócić uwagę na jedno z rozwiązań (autor: Carl Pulley), w którym plik został odzyskany w inny sposób i jest identyczny z tym odzyskanym przeze mnie, patrz http://www.virustotal.com/analisis/551147a39bc439f46421a994fdbe6c5bafed90bf3b79121722d95bfa1ea435a1-1269936720.&#xA;&#xA;Kto odzyskał bardziej prawdziwy plik wykorzystany do ataku? Wydaje mi się, że mój sposób odzyskania pliku dość dobrze się broni, jeśli uwzględni się sposób działania systemu Windows, ale sam temat jest bardzo interesujący. Może trzeba będzie poświęcić mu więcej czasu w przyszłości.&#xA;&#xD;&#xA;&#xD;&#xA;Oryginał tego wpisu dostępny jest pod adresem Rozwiązanie wyzwania: Forensic Challenge 2010 - Banking Troubles&#xA;&#xA;smallAutor: Paweł Goleń/small]]&gt;</description>
      <content:encoded><![CDATA[<p>Opublikowane zostało rozwiązanie wyzwania <a href="https://www.honeynet.org/challenges/2010_3_banking_troubles">Forensic Challenge 2010 – Banking Troubles</a>. Choć nie uczestniczę w tego typu wyzwaniach (nie wysyłam odpowiedzi), to zadaniom się przyglądam i część z nich, te ciekawsze, rozwiązuję. Czytam również zgłaszane odpowiedzi, po to by popatrzeć, jak z problemem poradzili sobie inni. W tym przypadku dla mnie najbardziej ciekawe były odpowiedzi udzielone na poniższe pytanie:</p>

<blockquote><p>5. Were there any files that were able to be extracted from the initial process? How were these files extracted? (6pts)</p></blockquote>

<p>Rozwiązania opierały się tutaj zwykle na zrzucie pamięci wirtualnej wybranych procesów i odzyskanie z nich plików PDF, na przykład przy użyciu narzędzia <a href="http://foremost.sourceforge.net/">Foremost</a> lub <a href="http://www.digitalforensicssolutions.com/Scalpel/">Scalpel</a>. Ja do tego zadania podszedłem w nieco inny sposób, wspominałem o tym we wpisie <a href="//wampir.mroczna-zaloga.org/archives/835-odczytywanie-plikow-z-filecache.html">Odczytywanie plików z filecache</a>.</p>

<p>Fakt, wybrana przeze mnie metoda nie do końca może jest zgodna z pytaniem, szczególnie następującym jego fragmentem: <em>from the initial process</em> , ale jest ciekawsza :) Przy okazji można było nauczyć się czegoś o działaniu systemu od środka.</p>



<h3 id="odzyskanie-pliku-z-filecache">Odzyskanie pliku z filecache</h3>

<p>Stosowane podejście opisałem już wcześniej we wspominanym wpisie, tutaj pokażę jego zastosowanie konkretnie w odniesieniu do zrzutu pamięci udostępnionego w ramach <em>forensic challenge</em>. Przypominam, że udostępniony zrzut jest w formacie <em>raw</em> i przed załadowaniem go do Windbg konieczna była konwersja do odpowiedniego formatu. Konwersja ta może być wykonana przy pomocy Volatility lub przy pomocy narzędzi z pakietu <a href="http://moonsols.com/blog/2-blog/9-moonsols-windows-memory-toolkit">MoonSols Windows Memory Toolkit</a>.</p>

<p>W pierwszym kroku poszukamy obiektu FILE_OBJECT, który będziemy odzyskiwać. Ponieważ atakowanym obiektem jest proces Acrobat Reader, właśnie od niego można zacząć:</p>

<p>    16.kd&gt; !process 0 0
    (...)
    PROCESS 820618c8  SessionId: 0  Cid: 06d8    Peb: 7ffd6000  ParentCid: 0378
        DirBase: 04040300  ObjectTable: e1ec4558  HandleCount: 184.
        Image: AcroRd32.exe</p>

<p>    16.kd&gt; .process /0 820618c8
    Unknown option &#39;0&#39;
    Implicit process is now 820618c8</p>

<p>    16.kd&gt; !handle
    (...)
    01d4: Object: 81dfadf0  GrantedAccess: 00120089 Entry: e110e3a8
    Object: 81dfadf0  Type: (823eb040) File
        ObjectHeader: 81dfadd8 (old version)
            HandleCount: 1  PointerCount: 3
            Directory Object: 00000000  Name: \DOCUME~1\ADMINI~1\LOCALS~1\Temp\plugtmp\PDF.php {HarddiskVolume1}
    (...)</p>

<p>    16.kd&gt; dt nt!<em>FILE</em>OBJECT 81dfadf0
       +0x000 Type             : 5
       +0x002 Size             : 112
       +0x004 DeviceObject     : 0x81dbf2d0 <em>DEVICE</em>OBJECT
       +0x008 Vpb              : 0x823e5c50 _VPB
       +0x00c FsContext        : 0xe10d2d90
       +0x010 FsContext2       : 0xe1eb67d0
       +0x014 SectionObjectPointer : 0x820cbeec <em>SECTION</em>OBJECT_POINTERS
       +0x018 PrivateCacheMap  : 0x820c1ca8
       +0x01c FinalStatus      : 0
       +0x020 RelatedFileObject : (null)
       +0x024 LockOperation    : 0 &#39;&#39;
       +0x025 DeletePending    : 0 &#39;&#39;
       +0x026 ReadAccess       : 0x1 &#39;&#39;
       +0x027 WriteAccess      : 0 &#39;&#39;
       +0x028 DeleteAccess     : 0 &#39;&#39;
       +0x029 SharedRead       : 0x1 &#39;&#39;
       +0x02a SharedWrite      : 0 &#39;&#39;
       +0x02b SharedDelete     : 0 &#39;&#39;
       +0x02c Flags            : 0x1c0042
       +0x030 FileName         : <em>UNICODE</em>STRING “\DOCUME~1\ADMINI~1\LOCALS~1\Temp\plugtmp\PDF.php”
       +0x038 CurrentByteOffset : <em>LARGE</em>INTEGER 0x4d13
       +0x040 Waiters          : 0
       +0x044 Busy             : 0
       +0x048 LastLock         : (null)
       +0x04c Lock             : _KEVENT
       +0x05c Event            : _KEVENT
       +0x06c CompletionContext : (null)</p>

<p>Ten sam rezultat można również uzyskać w nieco inny sposób:</p>

<p>    16.kd&gt; !filecache
    ***** Dump file cache******
      Reading and sorting VACBs ...
      Removed 1746 nonactive VACBs, processing 292 active VACBs ...
    File Cache Information
      Current size 44764 kb
      Peak size    69144 kb
      292 Control Areas
    Skipping view @ c1240000 – no VACB, but PTE is valid!
      Loading file cache database (100%25 of 130560 PTEs)
      SkippedPageTableReads = 130
      File cache has 5974 valid pages</p>

<p>      Usage Summary (in Kb):
    Control Valid Standby/Dirty Shared Locked FsContext Name
    (...)
    82091008    20      0     0     0 e10d2d90  PDF.php
    (...)</p>

<p>    16.kd&gt; !ca 82091008</p>

<p>    ControlArea  @ 82091008
      Segment      e1713588  Flink      00000000  Blink        00000000
      Section Ref         1  Pfn Ref           5  Mapped Views        1
      User Ref            0  WaitForDel        0  Flush Count         0
      File Object  81dfadf0  ModWriteCount     0  System Views        1</p>

<p>      Flags (8008080) File WasPurged Accessed</p>

<p>          File: \DOCUME~1\ADMINI~1\LOCALS~1\Temp\plugtmp\PDF.php</p>

<p>    Segment @ e1713588
    Type nt!<em>MAPPED</em>FILE_SEGMENT not found.</p>

<p>Jak widać w ten sposób też znaleziony został FILE_OBJECT 81dfadf0.</p>

<p>Posiadając adres FILE_OBJECT można uzyskać dodatkowe informacje na jego temat:</p>

<p>    16.kd&gt; !fileobj 81dfadf0</p>

<p>    \DOCUME~1\ADMINI~1\LOCALS~1\Temp\plugtmp\PDF.php</p>

<p>    Device Object: 0x81dbf2d0   \Driver\Ftdisk
    Vpb: 0x823e5c50
    Event signalled
    Access: Read SharedRead</p>

<p>    Flags:  0x1c0042
        Synchronous IO
        Cache Supported
        Handle Created
        Fast IO Read
        Random Access</p>

<p>    FsContext: 0xe10d2d90   FsContext2: 0xe1eb67d0
    Private Cache Map: 0x820c1ca8
    CurrentByteOffset: 4d13
    Cache Data:
      Section Object Pointers: 820cbeec
      Shared Cache Map: 820c1bd0         File Offset: 4d13 in VACB number 0
      Vacb: 823b78c8
      Your data is at: d2dc4d13</p>

<p>Interesuje nas informacja o adresie SHARED<em>CACHE</em>MAP, w tym wypadku jest to 820c1bd0:</p>

<p>    16.kd&gt; dt nt!<em>SHARED</em>CACHE_MAP 820c1bd0
       +0x000 NodeTypeCode     : 767
       +0x002 NodeByteSize     : 304
       +0x004 OpenCount        : 1
       +0x008 FileSize         : <em>LARGE</em>INTEGER 0x4d13
       +0x010 BcbList          : <em>LIST</em>ENTRY [ 0x820c1be0 – 0x820c1be0 ]
       +0x018 SectionSize      : <em>LARGE</em>INTEGER 0x40000
       +0x020 ValidDataLength  : <em>LARGE</em>INTEGER 0x4d13
       +0x028 ValidDataGoal    : <em>LARGE</em>INTEGER 0x4d13
       +0x030 InitialVacbs     : [4] 0x823b78c8 _VACB
       +0x040 Vacbs            : 0x820c1c00  –&gt; 0x823b78c8 _VACB
       +0x044 FileObject       : 0x81dfadf0 <em>FILE</em>OBJECT
       +0x048 ActiveVacb       : (null)
       +0x04c NeedToZero       : (null)
       +0x050 ActivePage       : 0
       +0x054 NeedToZeroPage   : 0
       +0x058 ActiveVacbSpinLock : 0
       +0x05c VacbActiveCount  : 0
       +0x060 DirtyPages       : 0
       +0x064 SharedCacheMapLinks : <em>LIST</em>ENTRY [ 0x81c6706c – 0x81c6a404 ]
       +0x06c Flags            : 0x1000
       +0x070 Status           : 0
       +0x074 Mbcb             : (null)
       +0x078 Section          : 0xe1646158
       +0x07c CreateEvent      : (null)
       +0x080 WaitOnActiveCount : (null)
       +0x084 PagesToWrite     : 0
       +0x088 BeyondLastFlush  : 0
       +0x090 Callbacks        : 0xf84300ac <em>CACHE</em>MANAGER_CALLBACKS
       +0x094 LazyWriteContext : 0xe10d2d90
       +0x098 PrivateList      : <em>LIST</em>ENTRY [ 0x820c1cf4 – 0x820c1cf4 ]
       +0x0a0 LogHandle        : (null)
       +0x0a4 FlushToLsnRoutine : (null)
       +0x0a8 DirtyPageThreshold : 0
       +0x0ac LazyWritePassCount : 0
       +0x0b0 UninitializeEvent : (null)
       +0x0b4 NeedToZeroVacb   : (null)
       +0x0b8 BcbSpinLock      : 0
       +0x0bc Reserved         : (null)
       +0x0c0 Event            : _KEVENT
       +0x0d0 VacbPushLock     : <em>EX</em>PUSH_LOCK
       +0x0d8 PrivateCacheMap  : <em>PRIVATE</em>CACHE_MAP</p>

<p>W tym miejscu pojawia się nieco magii. Sposób organizacji file cache zawiera różne optymalizacje, może pojawić się struktura “drzewiasta”. Tu na szczęście tak się nie dzieje, bo plik jest stosunkowo mały (patrz FileSize oraz SectionSize). W tym wypadku można popatrzeć na wskaźniki do VACB umieszczone w InitialVacbs:</p>

<p>    16.kd&gt; dp %25820c1bd0+0x030
    820c1c00  823b78c8 00000000 00000000 00000000</p>

<p>Pozostaje tylko odczytać zawartość:</p>

<p>    16.kd&gt; dt nt!_VACB 823b78c8
       +0x000 BaseAddress      : 0xd2dc0000
       +0x004 SharedCacheMap   : 0x820c1bd0 <em>SHARED</em>CACHE_MAP
       +0x008 Overlay          : __unnamed
       +0x010 LruList          : <em>LIST</em>ENTRY [ 0x823b58f8 – 0x823b7140 ]</p>

<p>    16.kd&gt; db %250xd2dc0000
    d2dc0000  25 57 4e 49 46 49 4c 53-4e 46 49 45 4f 57 4e 53  %25WNIFILSNFIEOWNS
    d2dc0010  44 46 0d 0a 25 44 4b 4b-4b 53 44 46 4e 49 45 0d  DF..%25DKKKSDFNIE.
    d2dc0020  0a 25 50 44 46 2d 31 2e-33 0d 0a 25 4d 4d 57 49  .%25PDF-1.3..%25MMWI
    d2dc0030  45 4e 4f 46 0d 0a 25 57-4e 49 46 49 4c 53 4e 46  ENOF..%25WNIFILSNF
    d2dc0040  49 45 4f 57 4e 53 44 46-0d 0a 31 30 35 34 20 30  IEOWNSDF..1054 0
    d2dc0050  20 6f 62 6a 0d 0a 3c 3c-2f 4c 65 6e 67 74 68 20   obj..&lt;&lt;/Length
    d2dc0060  30 30 30 30 2f 46 69 6c-74 65 72 20 5b 2f 46 23  0000/Filter [/F#
    d2dc0070  36 63 23 36 31 23 37 34-65 23 34 34 65 23 36 33  6c#61<a href="https://wampir.mroczna-zaloga.org/tag:74e" class="hashtag"><span>#</span><span class="p-category">74e</span></a><a href="https://wampir.mroczna-zaloga.org/tag:44e" class="hashtag"><span>#</span><span class="p-category">44e</span></a>#63</p>

<p>I jeszcze końcówka pliku uwzględniając jego rozmiar:</p>

<p>    16.kd&gt; db %250xd2dc4d13 L-100
    d2dc4c13  30 20 52 3e 3e 0d 0a 65-6e 64 6f 62 6a 0d 0a 37  0 R&gt;&gt;..endobj..7
    d2dc4c23  38 37 20 30 20 6f 62 6a-0d 0a 3c 3c 2f 43 6f 75  87 0 obj..&lt;&gt;
    d2dc4c53  0d 0a 65 6e 64 6f 62 6a-0d 0a 31 31 20 30 20 6f  ..endobj..11 0 o
    d2dc4c63  62 6a 0d 0a 3c 3c 2f 53-2f 4a 61 76 61 53 63 72  bj..&lt;</s>
    d2dc4c83  3e 0d 0a 65 6e 64 6f 62-6a 0d 0a 31 38 34 37 20  &gt;..endobj..1847
    d2dc4c93  30 20 6f 62 6a 0d 0a 3c-3c 2f 50 61 72 65 6e 74  0 obj..&lt;&gt;&gt;&gt;..endobj.
    d2dc4ce3  0a 78 72 65 66 0d 0a 74-72 61 69 6c 65 72 0d 0a  .xref..trailer..
    d2dc4cf3  3c 3c 2f 52 6f 6f 74 20-31 31 32 20 30 20 52 3e  &lt;
    d2dc4d03  3e 0d 0a 64 4c 4e 57 45-49 4f 46 39 33 66 30 6e  &gt;..dLNWEIOF93f0n</p>

<p>Jak widać – w coś trafiłem, a poszukiwane dane znajdują się pomiędzy 0xd2dc0000 a 0xd2dc4d13, plik można odzyskać korzystając z .writemem. Rezultaty Virustotal na odzyskanym pliku można znaleźć tu: <a href="http://www.virustotal.com/analisis/551147a39bc439f46421a994fdbe6c5bafed90bf3b79121722d95bfa1ea435a1-1273748929">http://www.virustotal.com/analisis/551147a39bc439f46421a994fdbe6c5bafed90bf3b79121722d95bfa1ea435a1-1273748929</a>.</p>

<p>Warto zwrócić uwagę, że pliki odzyskane przez uczestników wyzwania nieco różniły się od pliku, który został odzyskany przeze mnie. Między innymi różniły się wielkością, być może <em>carver</em> jako plik potraktował zbyt wiele. W każdym razie również w odzyskanym przeze mnie pliku można znaleźć “interesujący” fragment obfuskowango kodu, dokładnie taki sam, jak został przedstawiony w nagrodzonych rozwiązaniach. Warto też zwrócić uwagę na jedno z rozwiązań (<a href="https://www.honeynet.org/files/Carl_Pulley_Forensic_Challenge_2010_-_Challenge_3_-_Submission.pdf">autor: Carl Pulley</a>), w którym plik został odzyskany w inny sposób i jest identyczny z tym odzyskanym przeze mnie, patrz <a href="http://www.virustotal.com/analisis/551147a39bc439f46421a994fdbe6c5bafed90bf3b79121722d95bfa1ea435a1-1269936720">http://www.virustotal.com/analisis/551147a39bc439f46421a994fdbe6c5bafed90bf3b79121722d95bfa1ea435a1-1269936720</a>.</p>

<p>Kto odzyskał <em>bardziej prawdziwy</em> plik wykorzystany do ataku? Wydaje mi się, że mój sposób odzyskania pliku dość dobrze się broni, jeśli uwzględni się sposób działania systemu Windows, ale sam temat jest bardzo interesujący. Może trzeba będzie poświęcić mu więcej czasu w przyszłości.</p>

<p><em>Oryginał tego wpisu dostępny jest pod adresem <a href="https://archive.mroczna-zaloga.org/archives/859-rozwizanie-wyzwania-forensic-challenge-2010-banking-troubles.html">Rozwiązanie wyzwania: Forensic Challenge 2010 – Banking Troubles</a></em></p>

<p><small>Autor: <a href="https://wampir.mroczna-zaloga.org/o-mnie">Paweł Goleń</a></small></p>
]]></content:encoded>
      <guid>https://wampir.mroczna-zaloga.org/rozwiazanie-wyzwania-forensic-challenge-2010-banking-troubles</guid>
      <pubDate>Thu, 13 May 2010 13:52:00 +0000</pubDate>
    </item>
  </channel>
</rss>