얼마 전 'RC3 2016' CTF에서 재밌는 메모리 포렌식 문제가 나왔다. 


500pt로 포렌식 분야에서 배점이 가장 높았고 유일하게 못 푼 문제였다.


'TrueCrypt'에 관한 문제였는데, 목표를 잘 못 잡아 결국 풀지 못했다.



ddddh@siftworkstation:~/Desktop/CTF/rc3/forensics$ vol.py -f memdump.raw imageinfo

Volatility Foundation Volatility Framework 2.4

Determining profile based on KDBG search...


          Suggested Profile(s) : Win7SP0x64, Win7SP1x64, Win2008R2SP0x64, Win2008R2SP1x64

                     AS Layer1 : AMD64PagedMemory (Kernel AS)

                     AS Layer2 : FileAddressSpace (/home/sansforensics/Desktop/CTF/rc3/forensics/memdump.raw)

                      PAE type : No PAE

                           DTB : 0x187000L

                          KDBG : 0xf80002c0a0a0

          Number of Processors : 4

     Image Type (Service Pack) : 1

                KPCR for CPU 0 : 0xfffff80002c0bd00L

                KPCR for CPU 1 : 0xfffff880009ef000L

                KPCR for CPU 2 : 0xfffff88003169000L

                KPCR for CPU 3 : 0xfffff880031df000L

             KUSER_SHARED_DATA : 0xfffff78000000000L

           Image date and time : 2016-11-16 11:24:51 UTC+0000

     Image local date and time : 2016-11-16 06:24:51 -0500




메모리 포렌식을 할 때 가장 먼저 해야될 일은 'imageinfo'를 통해 KDBG 스캔을 하는 것이다.


결과를 통해 나온 Profile 중 하나를 지정해줘서 셋팅 해준다.



ddddh@siftworkstation:~/Desktop/CTF/rc3/forensics$ vol.py -f memdump.raw --profile=Win7SP0x64 pslist

Volatility Foundation Volatility Framework 2.4

Offset(V)          Name                    PID   PPID   Thds     Hnds   Sess  Wow64 Start                          Exit                          

------------------ -------------------- ------ ------ ------ -------- ------ ------ ------------------------------ ------------------------

0xfffffa8003c78b30 System                    4      0    111      531 ------      0 2016-11-16 11:00:14 UTC+0000                                 

0xfffffa8006239040 smss.exe                316      4      2       32 ------      0 2016-11-16 11:00:14 UTC+0000                                 

0xfffffa80058f95f0 csrss.exe               396    380      9      477      0      0 2016-11-16 11:00:15 UTC+0000                                 

0xfffffa800662d780 wininit.exe             440    380      3       78      0      0 2016-11-16 11:00:15 UTC+0000                                 

0xfffffa80066342e0 csrss.exe               464    452     12      409      1      0 2016-11-16 11:00:15 UTC+0000                                 

0xfffffa800677f5f0 services.exe            508    440      9      225      0      0 2016-11-16 11:00:15 UTC+0000                                 

0xfffffa80067819d0 lsass.exe               524    440      7      608      0      0 2016-11-16 11:00:15 UTC+0000                                 

0xfffffa8006787b30 lsm.exe                 532    440     10      159      0      0 2016-11-16 11:00:15 UTC+0000                                 

0xfffffa80067d2260 winlogon.exe            588    452      5      118      1      0 2016-11-16 11:00:15 UTC+0000                                 

0xfffffa8006790b30 svchost.exe             680    508      9      371      0      0 2016-11-16 11:00:15 UTC+0000                                 

0xfffffa800672e650 vmacthlp.exe            740    508      3       60      0      0 2016-11-16 11:00:16 UTC+0000                                 

0xfffffa8006865b30 svchost.exe             780    508      9      293      0      0 2016-11-16 11:00:16 UTC+0000                                 

0xfffffa80068a2060 svchost.exe             848    508     20      509      0      0 2016-11-16 11:00:16 UTC+0000                                 

0xfffffa80068c0b30 svchost.exe             900    508     20      458      0      0 2016-11-16 11:00:16 UTC+0000                                 

0xfffffa80068deb30 svchost.exe             944    508     40     1063      0      0 2016-11-16 11:00:16 UTC+0000                                 

0xfffffa800695b320 svchost.exe             340    508      9      535      0      0 2016-11-16 11:00:16 UTC+0000                                 

0xfffffa800698ab30 svchost.exe            1032    508     16      385      0      0 2016-11-16 11:00:16 UTC+0000                                 

0xfffffa8006a47380 spoolsv.exe            1212    508     12      356      0      0 2016-11-16 11:00:16 UTC+0000                                 

0xfffffa8006abb890 svchost.exe            1252    508     17      323      0      0 2016-11-16 11:00:16 UTC+0000                                 

0xfffffa8006a1bb30 VGAuthService.         1404    508      3       89      0      0 2016-11-16 11:00:16 UTC+0000                                 

0xfffffa8006c1f780 vmtoolsd.exe           1464    508      9      307      0      0 2016-11-16 11:00:16 UTC+0000                                 

0xfffffa8006d0bb30 WmiPrvSE.exe           1724    680     12      226      0      0 2016-11-16 11:00:16 UTC+0000                                 

0xfffffa8006c43060 dllhost.exe            1920    508     13      198      0      0 2016-11-16 11:00:16 UTC+0000                                 

0xfffffa8006dc0b30 msdtc.exe              2040    508     12      147      0      0 2016-11-16 11:00:17 UTC+0000                                 

0xfffffa8006d616c0 svchost.exe            1312    508      6       96      0      0 2016-11-16 11:00:17 UTC+0000                                 

0xfffffa8004c924f0 taskhost.exe           2324    508      8      194      1      0 2016-11-16 11:00:30 UTC+0000                                 

0xfffffa8005218890 GoogleCrashHan         2472   2448      5      103      0      1 2016-11-16 11:00:31 UTC+0000                                 

0xfffffa8005221b30 GoogleCrashHan         2480   2448      5       97      0      0 2016-11-16 11:00:31 UTC+0000                                 

0xfffffa800526db30 dwm.exe                2604    900      3       78      1      0 2016-11-16 11:00:32 UTC+0000                                 

0xfffffa8005284780 explorer.exe           2628   2592     34      947      1      0 2016-11-16 11:00:32 UTC+0000                                 

0xfffffa800528db30 vmtoolsd.exe           2716   2628      6      251      1      0 2016-11-16 11:00:32 UTC+0000                                 

0xfffffa8005289b30 StikyNot.exe           2724   2628     11      145      1      0 2016-11-16 11:00:32 UTC+0000                                 

0xfffffa8006ec7060 SearchIndexer.         2784    508     15      693      0      0 2016-11-16 11:00:32 UTC+0000                                 

0xfffffa8006ecbb30 RAMDisk.exe            2956   2628     25      729      1      0 2016-11-16 11:01:44 UTC+0000                                 

0xfffffa8005798430 svchost.exe            1044    508     10      158      0      0 2016-11-16 11:01:50 UTC+0000                                 

0xfffffa8006db2b30 wisptis.exe             704   2956      6      132      1      0 2016-11-16 11:01:52 UTC+0000                                 

0xfffffa8006fa5060 MappedDrives.e         1508   2956      0 --------      1      0 2016-11-16 11:01:54 UTC+0000   2016-11-16 11:01:54 UTC+0000  

0xfffffa8003eb4b30 chrome.exe              748   2628     28     1069      1      0 2016-11-16 11:01:59 UTC+0000                                 

0xfffffa8003ec3200 chrome.exe              936    748      6       85      1      0 2016-11-16 11:01:59 UTC+0000                                 

0xfffffa8003f93060 chrome.exe             1148    748      5      182      1      0 2016-11-16 11:01:59 UTC+0000                                 

0xfffffa8003f3a250 chrome.exe             1168    748     10      172      1      0 2016-11-16 11:01:59 UTC+0000                                 

0xfffffa80040449c0 chrome.exe             2672    748     16      214      1      0 2016-11-16 11:01:59 UTC+0000                                 

0xfffffa8006b4a060 chrome.exe             2952    748     10      154      1      0 2016-11-16 11:01:59 UTC+0000                                 

0xfffffa80041b9360 chrome.exe             3188    748     10      308      1      0 2016-11-16 11:02:00 UTC+0000                                 

0xfffffa800613d540 mscorsvw.exe           3620    508      7       90      0      1 2016-11-16 11:02:17 UTC+0000                                 

0xfffffa8004280780 mscorsvw.exe           3664    508      7       83      0      0 2016-11-16 11:02:17 UTC+0000                                 

0xfffffa8003fbab30 sppsvc.exe             3808    508      4      153      0      0 2016-11-16 11:02:17 UTC+0000                                 

0xfffffa8003fc3b30 svchost.exe            3848    508     12      333      0      0 2016-11-16 11:02:17 UTC+0000                                 

0xfffffa80041e2b30 chrome.exe             1068    748     13      261      1      0 2016-11-16 11:04:23 UTC+0000                                 

0xfffffa80068beaa0 audiodg.exe            3476    848      7      137      0      0 2016-11-16 11:17:42 UTC+0000                                 

0xfffffa8006af31b0 taskmgr.exe            3368   3760      8      131      1      0 2016-11-16 11:22:07 UTC+0000                                 

0xfffffa8006aec270 SearchProtocol         2032   2784      7      215      1      0 2016-11-16 11:24:31 UTC+0000                                 

0xfffffa8004252600 SearchFilterHo         3268   2784      5       97      0      0 2016-11-16 11:24:31 UTC+0000                                 

0xfffffa8006b0c450 DumpIt.exe             1536   2628      5       53      1      1 2016-11-16 11:24:41 UTC+0000                                 

0xfffffa8006ab81d0 conhost.exe            1220    464      2       51      1      0 2016-11-16 11:24:41 UTC+0000                                 




현재 실행 중인 프로세스 리스트를 출력해주는 플러그인이다.


우리가 평소에 흔히 접할 수 있는 'StikyNot.exe', 'chrome.exe'이 보이고 덤프는 'DumpIt.exe'으로 만든 것을 확인할 수 있다.



ddddh@siftworkstation:~/Desktop/CTF/rc3/forensics$ vol.py -f memdump.raw --profile=Win7SP0x64 screenshot -D ./Screenshot/

Volatility Foundation Volatility Framework 2.4

Wrote ./Screenshot/session_0.msswindowstation.mssrestricteddesk.png

Wrote ./Screenshot/session_0.Service-0x0-3e4$.Default.png

Wrote ./Screenshot/session_0.Service-0x0-3e5$.Default.png

Wrote ./Screenshot/session_0.WinSta0.Default.png

Wrote ./Screenshot/session_0.WinSta0.Disconnect.png

Wrote ./Screenshot/session_0.WinSta0.Winlogon.png

Wrote ./Screenshot/session_0.Service-0x0-3e7$.Default.png

Wrote ./Screenshot/session_1.WinSta0.Default.png

Wrote ./Screenshot/session_1.WinSta0.Disconnect.png

Wrote ./Screenshot/session_1.WinSta0.Winlogon.png

Wrote ./Screenshot/session_1.Service-0x0-63bca$.sbox_alternate_desktop_0x2EC.png







'screenshot' 플로그인은 덤프를 만들고 있던 당시의 화면을 확인할 수 있다. 


pslist의 결과에서 보았듯이, Stickynote와 chrome을 확인할 수 있다.




sansforensics@siftworkstation:~/Desktop/CTF/rc3/forensics$ vol.py -f memdump.raw --profile=Win7SP0x64 filescan




filescan 플러그 인으로 메모리 덤프안의 파일들을 리스트 형식으로 출력할 수 있다.


출력된 결과물을 확인하면 Sticknote를 확인할 수 있고, 'dumpfiles' 플러그인으로 뽑아내어 내용을 확인할 수 있다.


 0x000000013ceb23a0     17      1 RW-r-- \Device\HarddiskVolume2\Users\Donald Trump\AppData\Roaming\Microsoft\Sticky Notes\StickyNotes.snt'




ddddh@siftworkstation:~/Desktop/CTF/rc3/forensics$ vol.py -f memdump.raw --profile=Win7SP0x64 dumpfiles -Q 0x000000013ceb23a0 -D ./

Volatility Foundation Volatility Framework 2.4

DataSectionObject 0x13ceb23a0   None   \Device\HarddiskVolume2\Users\Donald Trump\AppData\Roaming\Microsoft\Sticky Notes\StickyNotes.snt



'True crypt container in evidence drive(E) and password in Lastpass'


라는 글을 확인할 수 있다.


또 한, 'chromesearchterms' 플러그인을 사용하여 크롬에 대한 정보를 얻을 수 있다.


ddddh@siftworkstation:~/Desktop/CTF/rc3/forensics$ vol.py -f memdump.raw --profile=Win7SP0x64 --plugins=/home/ddddh/v-plugins/ chromesearchterms

Volatility Foundation Volatility Framework 2.4

Row ID Keyword ID URL ID Lowercase                                                        Entered Text                                                    

------ ---------- ------ ---------------------------------------------------------------- ----------------------------------------------------------------

     9       5135     13 

                                                                

                                                               

    11          2     47 facebook                                                         facebook                                                        

    10          2     43 .net framework 4.5 offline installer                             .net framework 4.5 offline installer                            

     9          2     42 .net framework 4.5                                               .net framework 4.5                                              

     8          2     31 lastpass extension                                               lastpass extension                                              

     7          2     30 ramdisk filehippo                                                ramdisk filehippo                                               

     6          2     29 truecrypt                                                        truecrypt                                                       

     5          2     26 lastpass                                                         lastpass                                                        

     4          2     21 wireshark                                                        wireshark                                                       

     3          2     18 winrar                                                           winrar                                                          

     2          2     15 atom                                                             atom                                                            

     1          2     14 sysinternals                                                     sysinternals                                                    



출력된 결과를 보면 'lasspass', 'truecrypt' 두 가지를 발견할 수 있다.



lastpass 라는 플러그인으로 추출 후 복호화 하면 flag가 나온다. 

'# write-up > - ctf' 카테고리의 다른 글

[Plaid CTF 2017] no_mo_flo  (0) 2017.04.27
[ALEX CTF] RE5: packed movement  (0) 2017.02.07
[RC3 2016] - Reversing 200pt  (0) 2016.11.21
[RC3 2016] - Reversing 350pt  (0) 2016.11.21
[RC3 2016] - Reversing 100pt  (0) 2016.11.21


http://blog.naver.com/yheekeun/220867134574


같은 팀 yokkkkk님의 풀이




Reversing

 -f1ay.yokkkkk



[그림 1] main

 

main은 이렇게나 간단하다.. memcpy(flag, enc(입력값), 0x23) 해서 일치하면 정답이다.



 

[그림 2] enc 내부

 

내가 입력한 값을 d,a,d,?로 차례대로 암호화 시키는 것이다.

 

복호화 소스를 짜보자

 

[그림 3] 복호화 소스

 

 

[그림 4] sol

내가 찾고자하는 플레그가 아니라고 한다...

 

엄청난 삽질 끝에,

 

 

 

[그림 5] 바이너리 끝

 

FLAG가 뒤집혀 들어가있는 것을 알 수 있다그리고 문제이름도 elf의 반대인 fle이다.

바이너리를 뒤집어보자

 

[그림 6] 뒤집기

 

 

 

[그림 7] 수정

 

fix_fle 파일 내부인데 ELF 헤더 시그니쳐를 입력해주자

 

 

 

 

 

[그림 8] 정상 실행

 

제대로 된 바이너리 파일을 찾았단다.

 

 

[그림 9] syscall

syscall로 값을 입력을 받고 0x1F 길이를 비교한다즉 입력값이 0x1f

 

 

 

[그림 10] 연산 루틴

 

byte_8048000-0x8048000 부분에 내가 어떠한 바이너리와 내가 입력한 값을 xor연산하여 넣는다.

 

 

 

 

[그림 11] 체크 루틴

[그림 10]에서의 루틴이 완료 되면 왼쪽으로 넘어와서 체크루틴 sub_804804c 가 실행되고,

eax가 0이라면 offset word_80481c2 부분의 바이너리를 0x55와 xor하여 완성된 성공 구문을 출력 시켜준다.

 


[그림 12] sub_804804c 체크루틴

 

설명하자면 [그림 10]에서의 연산루틴을 거친 것과 비교를 하는 것을 알 수 있다.

동적분석을 통해 확인해보면 0x1d만큼 반복문을 돌리며 sub bl, [edx]에 의해 값이 같으면 eax에 0이 더해지고 다르면 eax의 값이 올라가므로 전부 일치하게되면 eax가 0이되어 correct문을 띄우게 된다.




[그림 13] 내가 입력한값과 연산

빨간색과 내가입력한 값이 xor연산되어 나중에 어떠한 바이너리값과 비교하게된다.

 



어떠한 바이너리값은 아래와 같다.(그림 11. 0x8049bcc-0x8048000의 file offset)


[그림 14] 바이너리

 

 

 

[그림 15] 복호화 소스

[출처] RC3 CTF - FLE (200)|작성자 헤헤

[출처] RC3 CTF - FLE (200)|작성자 헤헤

'# write-up > - ctf' 카테고리의 다른 글

[Plaid CTF 2017] no_mo_flo  (0) 2017.04.27
[ALEX CTF] RE5: packed movement  (0) 2017.02.07
[RC3 2016] 메모리 포렌식 - 500pt  (0) 2016.11.27
[RC3 2016] - Reversing 350pt  (0) 2016.11.21
[RC3 2016] - Reversing 100pt  (0) 2016.11.21

대회기간 : 토요일, 19 11월 2016, 02:00 UTC — 월요일, 21 11월 2016, 07:00 UTC 

대회명 : RC3

문제 : RC3Ciper - Reversing [350pt]

RC3Cipher



제일 고득점이지만 제일 쉬운 문제. 

아마 출제자의 의도는 이렇게 푸는게 아니였지 싶다...

CTF는 푸는 속도가 생명이기 때문에 풀이의 질이 다소 떨어질 수 있습니다.  <- 변명



1. 흐름 파악





바이너리를 IDA로 열어서 String 값을 확인 해보면 어떠한 Hash값과 "Your ciphertext is %s"가 보인다.

입력 값을 통해 연산된 cipher text를 출력해주는 것 같다.



  


flay_ddddh 를 인자로 넘겨 주었을 때 암호화 된 결과 값은 입력 길이의 2배다.

그리고 "Generic response one."을 출력 해준다. 아마  "Generic response two."를 출력해주도록 하는게 답일 것 같아 보인다.




2. 동적 분석


정적 분석은 생략한다. 동적 분석 짱짱맨





친절하게 functionone, functiontwo가 보인다. 물론 그 전에도 어떠한 연산이 있지만 푸는데 지장 없으므로 생략 합니다.







eax의 0x79 ('y')의 값을 rbp-44에 넣고 밑에서 0x79만큼 반복한다.







??????

-1 을 해주면서 00까지 채운다. 근데 왜 하필 0x79 ('y') 였을까 ....

파라미타 값이 'f1ay_ddddh'였다 ?!


그렇다... 파라미타 값 중 ASCII 값이 가장 큰 값 'y'가 들어간 것이다.






3. 노가다


딴 거 다 필요 없다... 입력 값 중 가장 큰 값을 통해서 연산을 하는 것을 확인한 이상 답은 쉽게 구할 수 있다.


문제를 풀면서 알아 낸 RC3의 FLAG FORMAT은 "RC3-2016-????"이다. 그러면 입력 해 보자.




음... IDA string값으로 확인 한 hash값이랑 맞지 않는다.


비교 값 : 1b65380f084b59016875513c6373131d2a6a327172753a2918243d7b181a051e5f1e104c32331c0842777b375f100113


즉, 이 다음부터 나의 ciphertext가 1b6538.. 이 되게 가장 큰 ASCII를 찾아주면 된다.




  

가장 큰 값은 'Y'인 걸 확인했고, 그다음 문자도 운이 좋게 'Y'다.

입력 가능 값은 '0x59' 보다 작아야되므로 수동으로 해도 빠르게 알아낼 수 있다.





FLAG : RC3-2016-Y0UR-KSA-IS-BAD-@ND-Y0U-SH0ULD-F33L-BAD



'# write-up > - ctf' 카테고리의 다른 글

[Plaid CTF 2017] no_mo_flo  (0) 2017.04.27
[ALEX CTF] RE5: packed movement  (0) 2017.02.07
[RC3 2016] 메모리 포렌식 - 500pt  (0) 2016.11.27
[RC3 2016] - Reversing 200pt  (0) 2016.11.21
[RC3 2016] - Reversing 100pt  (0) 2016.11.21

대회기간 : 토요일, 19 11월 2016, 02:00 UTC — 월요일, 21 11월 2016, 07:00 UTC 

대회명 : RC3

문제 : logmein - Reversing [100pt]

logmein






1. 흐름 파악




바이너리를 다운 받고 HxD로 열어보면 ELF파일임을 알 수 있다. 

64 bit ELF파일이었고 IDA를 통해서 정적 분석을 먼저 시도하였다. (RC3의 모든 Reversing는 64 bit / ELF 바이너리였다.)





String 값들을 확인해 보면 "Enter your guess"에서 Data를 넘겨주면 어떠한 연산을 거쳐 성공 분기점이 나눠지는 걸 알 수 있다.








2. 정적 분석




scanf로 입력 값을 받은 뒤 strlen으로 입력 길이를 체크 후 분기점으로 나뉘게 된다.

또 한, 중간중간 연산 결과값이 틀리면 INCORRECT 분기점으로 넘어가게 된다.






모든 연산을 정상적으로 마치면 CORRECT 문자열을 뛰어주는 콜 문을 실행해주게 된다.




3. 동적 분석





입력 값은 "f1ay_ddddh", 길이는 0xA 다.

즉, 입력 값 길이는 0x11이 되어야 한다. 일단 강제 패치 후 연산 부분으로 넘어간다.






[rbp - 0x32] - 0x3A, 0x22, 0x41, 0x4C, 0x5F, 0x52, 0x54, 0x5E, 0x4C, 0x2A, 0x2E, 0x3F, 0x2B, 0x36, 0x2F, 0x34, 0x36

[rbp - 0x40] - 0x68, 0x61, 0x72, 0x61, 0x6D, 0x62, 0x65


두 주소에서 값을 하나씩 가져와서 xor 연산을 해준 뒤, 밑의 cmp에서 입력했던 값이랑 비교하는 걸 확인할 수 있다.






4. 플래그 도출








'# write-up > - ctf' 카테고리의 다른 글

[Plaid CTF 2017] no_mo_flo  (0) 2017.04.27
[ALEX CTF] RE5: packed movement  (0) 2017.02.07
[RC3 2016] 메모리 포렌식 - 500pt  (0) 2016.11.27
[RC3 2016] - Reversing 200pt  (0) 2016.11.21
[RC3 2016] - Reversing 350pt  (0) 2016.11.21

#메모리 포렌식 #볼라틸리티 #Volatility #라이브 포렌식


파란색 - 입력 값

빨간색 - 플러그인



1. python vol.py -f <dump_file> --profile=<profile> <plugin> [args]


다음은 볼라틸리티(volatility)의 기본 명령어 형태이다.

프로파일을 지정하지 않을 경우 기본 프로파일인 WinXPSP2x86으로 동작한다.



2. python vol.py <plugin> --help

플러그인의 명령어를 보기 위해서는 플러그인의 이름과 -h/--help를 추가하면 된다.



3. python vol.py -f <dump_file> imageinfo 

각 시스템마다 사용해야 할 데이터 구조, 알고리즘, 심볼들이 다르기 때문에 메모리 덤프가 어느 시스템에서 수집되었는지 프로파일을 알려주는 명령어다.



4. python vol.py -f <dump_file> kdbgscan



5. python vol.py -f <dump_file> filescan



5. python vol.py -f <dump_file> dumpfiles -Q 0x0000~~~ -D ./






지속적인 업데이트 예정입니다.

'# technic > - forensics' 카테고리의 다른 글

컴퓨터 발전과정 및 프로세스 구조  (0) 2016.10.12
디지털 포렌식의 일반원칙과 전자적 증거의 진정성  (0) 2016.10.12
[디포2급] 정선문제 필기 정리  (0) 2016.05.06
..  (0) 2016.04.21
잡지식  (0) 2016.04.20

+ Recent posts