pdf를 분석하여 Flag를 얻으라는 문제입니다.



파일을 내려받으면 pdf의 내용은 다음과 같습니다. 


별다른 정보를 얻을 수 없으니 다른 방법을 사용해야 할 것 같습니다.



HxD를 이용해서 확인해보니 매우 의심스러운 문자열들이 존재합니다.


해당 내용을 확인하기 위해 notepad로 열어 확인해보니 스크립트 문이 존재했습니다.



아래와 같은 javascript로 base64 decoder를 구현한 내용으로 보입니다. 


스크립트는 base64 decode를 한번만 수행하니 온라인 디코더로 아래 payload값을 여러번 수행하다보면


I am sorry, This is not key~!! 라고 나옵니다. fake 였던 겁니다..


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
var Base64={
    _keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
    decode:function(input){
        for(var ah=0; ah<(input.length); ah++){
            input = input.replace("'+'","");
        }
        var rlLwarzv="";
        var chr1,chr2,chr3;
        var enc1,enc2,enc3,enc4;
        var i=0;
        input = input.replace(/[^A-Za-z0-9\+\/\=]/g,"");
        while(i<input.length){
            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));
            chr1 = (enc1<<2)|(enc2>>4);
            chr2 = ((enc2&15)<<4)|(enc3>>2);
            chr3 = ((enc3&3)<<6)|enc4;
            rlLwarzv = rlLwarzv + String.fromCharCode(chr1);
            if(enc3!=64){
                rlLwarzv = rlLwarzv + String.fromCharCode(chr2);
            }
            if(enc4!=64){
                rlLwarzv = rlLwarzv + String.fromCharCode(chr3);
            }
        }
        eval(rlLwarzv);
    }
}
Base64.decode("'Vm0'+'wd2Qy'+'UXlW'+'a1pP'+'VldS'+'WFYw'+'ZG9WV'+'ll3W'+'kc5V'+'01Wb'
            +'DNXa2    +'1JIV'+'mtsa'+'QpSb'+'VJPW'+'W14R'+'00x'+'WnR'+'NWH'+'BsU'+'m1S'+'SVZ'+'tdF'+'dVZ'+'3Bp'
            +'Umx'+'wd1'+'ZXM'+'TRkM'+'VZX'+'WkZ'+'kYV'+'JGS'+'lVU'+'V3N'+'4Tk'+'ZaS'+'E5V'+'OVhR'+'WEJ'
            +'wVW'+'01Q'+'1dW'+'ZHNa'+'RFJa'+'ClYx'+'WlhWM'+'jVLVm1'+'FeVVtR'+'ldh'+'a1p'+'MVj'+'BaV'
            +'2RF'+'NVZ'+'PV2'+'hSV'+'0VK'+'VVd'+'XeG'+'FTM'+'VpX'+'V2t'+'kVm'+'EwN'+'VVD'+'azF'+'XV2'
            +'xoV'+'01X'+'aHZ'+'WMG'+'RLU'+'jJO'+'SVR'+'sWm'+'kKV'+'0do'+'NlZ'+'HeG'+'FZV'+'k5I'+'VWt'
            +'oU2'+'JXa'+'FdW'+'MFZ'+'LVl'+'ZkW'+'E1U'+'QlR'+'NV1'+'JYV'+'jI1'+'U2Fs'+'SllV'+'bkJEY'
            +'XpGV1'+'kwWm'+'9XR0'+'V4Y'+'0hK'+'V01'+'uTjN'+'aVmR'+'HUjJ'+'GRwp'+'WbGN'+'LWW'+'toQm'
            +'VsZH'+'NaR'+'FJa'+'Vms1'+'R1R'+'sWm'+'tZV'+'kp1U'+'WxkV'+'01GW'+'kxWb'+'FprV'+'0Ux'+'VVF'
            +'sUk'+'5WbH'+'BJVm'+'pKMG'+'ExZH'+'RWbk'+'pYYm'+'tKRV'+'lYcE'+'dWMW'+'t3Cl'+'dtOV'+'hSMF'
            +'Y1WV'+'VWN'+'FYw'+'MUh'+'Va3'+'hXT'+'VZw'+'WFl'+'6Rm'+'Fjd3'+'BqUj'+'J0T'+'FZXM'+'DFRM'
            +'kl4W'+'khOY'+'VJGS'+'mFWa'+'kZLU'+'1ZadG'+'RHOV'+'ZSbH'+'AxV'+'Vd4'+'a1Y'+'wMU'+'cKV'+'2t4'
            +'V2J'+'GcH'+'JWMG'+'RTU'+'jFw'+'SGR'+'FNV'+'diS'+'EJK'+'Vmp'+'KMF'+'lXS'+'XlS'+'WGh'+'UV0'
            +'dSW'+'Vlt'+'dGF'+'SVm'+'xzV'+'m5k'+'WFJ'+'sbD'+'VDb'+'VJI'+'T1Z'+'oU0'+'1GW'+'TFX'+'VlZ'
            +'hVT'+'FZeA'+'pTWH'+'BoU0'+'VwV1'+'lsaE'+'5lRl'+'pxUm'+'xkam'+'QzQn'+'FVak'+'owVE'+'ZaWE'
            +'1UUm'+'tNa'+'2w0'+'VjJ'+'4a1'+'ZtR'+'XlV'+'bGh'+'VVm'+'xae'+'lRr'+'WmF'+'kR1'+'ZJV'+'Gxw'
            +'V2E'+'zQj'+'VWa'+'ko0'+'CmE'+'xWX'+'lTb'+'lVL'+'VVc'+'1V1'+'ZXS'+'kZW'+'VFZ'+'WUm'+'tVN'
            +'VVG'+'RTl'+'QUT'+'09'");

cs



열심히 HxD로 확인하고 notepad로 열어서 일일이 확인해도 전혀 감이 안 왔습니다.


그래서 약간의 도움을 얻어 다른 방법으로 해보기로 했습니다.


"PDFStreamDumper" 라는 툴은 pdf 구조대로 나눠서 깔끔하게 보여주는 툴입니다.


pdf는 여러 object로 나눠져 있고 각각이 정보를 담고있습니다.


obj 39번을 보시면 "%PDF-1.7" 인 Header값이 존재합니다. pdf 속에 pdf를 숨겨놓은 스테가노그래피 기법으로 문제를 만든거 같습니다.



39번 object아래 값을 보시면 /Encrypt라고 되어 있고 어떤 값이 암호화 되어있는 것을 보실 수 있습니다.


아마 해당 값이 키 값이겠죠?


39번 object를 따로 저장하여 열어보면 아무 내용도 존재하지 않습니다.



그래서 다시 "PDFStreamDumper"를 이용해서 열어보면 pdf가 암호화 되어있다고 나와있습니다.


https://smallpdf.com/kr/unlock-pdf 에서 pdf 잠금을 해지하실 수 있습니다.

(해지할 때 저작권 때문에 열어도 되는지 동의를 구합니다. 불법으로 열어보시면 안됩니다.)


잠금해지하고 다시 열어보면 키 값을 얻을 수 있습니다.


이 값을 MD5 해쉬 시켜주면 됩니다.







[pdfdot]를 이용


pdfdot라는 프로그램을 통해서도 할 수 있습니다.


'-r' 옵션으로 처음 시작 위치를 알아낼 수 있습니다.


처음은 object 2번에서 시작합니다.



'-o' 옵션을 통해 해당 object를 확인할 수 있습니다.


Referencing은 현재 object가 참조하고 있는 다른 object를 가르칩니다.



"Contains stream" 은 스트림 데이터가 존재합니다. 이런 곳에서 원하는 정보를 얻을 수 있습니다.


"-d" 옵션으로 23번 object를 dump 할 수 있습니다.


만약 해당 내용이 encoding되어 있으면 "-f" 옵션으로 decode할 수 있습니다.



해당 dump파일을 열어보시면 다음과 같이 잘 나오게 됩니다.


이 정보는 HxD에서도 얻은 정보랑 같습니다.



"pdfdot"는 pdf가 어떤 식으로 동작하는지 구조를 알 수 있는 유용한 프로그램입니다.


"pdfdot"을 통해 object 다이어그램을 그려보면 아래와 같습니다.


하늘색으로 칠해져 있는 부분이 "Contains stream"이 있는 부분이고, 빨간색 부분이 PDF가 숨겨진 부분입니다.






[참고]

PDF Unlock: https://smallpdf.com/kr/unlock-pdf

PDF 파일 포맷: http://nakyungpapa.tistory.com/142

PDF 파일 포맷: http://panda2122.tistory.com/10

'WarGame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS_16 [SYSTEM]  (0) 2018.09.14
SuNiNaTaS_5 [WEB]  (0) 2018.09.13
SuNiNaTaS_17 [MISC]  (0) 2018.09.12
SuNiNaTaS_28 [FORENSIC]  (0) 2018.09.12
SuNiNaTaS_13 [MISC]  (0) 2018.09.11

+ Recent posts