pdf를 분석하여 Flag를 얻으라는 문제입니다.
![](https://t1.daumcdn.net/cfile/tistory/99D914465B99EECF0D)
파일을 내려받으면 pdf의 내용은 다음과 같습니다.
별다른 정보를 얻을 수 없으니 다른 방법을 사용해야 할 것 같습니다.
![](https://t1.daumcdn.net/cfile/tistory/995B51465B99EED019)
HxD를 이용해서 확인해보니 매우 의심스러운 문자열들이 존재합니다.
해당 내용을 확인하기 위해 notepad로 열어 확인해보니 스크립트 문이 존재했습니다.
![](https://t1.daumcdn.net/cfile/tistory/9929DE465B99EED11D)
아래와 같은 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를 숨겨놓은 스테가노그래피 기법으로 문제를 만든거 같습니다.
![](https://t1.daumcdn.net/cfile/tistory/999D62465B99EED313)
39번 object아래 값을 보시면 /Encrypt라고 되어 있고 어떤 값이 암호화 되어있는 것을 보실 수 있습니다.
아마 해당 값이 키 값이겠죠?
39번 object를 따로 저장하여 열어보면 아무 내용도 존재하지 않습니다.
![](https://t1.daumcdn.net/cfile/tistory/99384C465B99EED41C)
그래서 다시 "PDFStreamDumper"를 이용해서 열어보면 pdf가 암호화 되어있다고 나와있습니다.
https://smallpdf.com/kr/unlock-pdf 에서 pdf 잠금을 해지하실 수 있습니다.
(해지할 때 저작권 때문에 열어도 되는지 동의를 구합니다. 불법으로 열어보시면 안됩니다.)
잠금해지하고 다시 열어보면 키 값을 얻을 수 있습니다.
이 값을 MD5 해쉬 시켜주면 됩니다.
![](https://t1.daumcdn.net/cfile/tistory/99C98F465B99EED40F)
![](https://t1.daumcdn.net/cfile/tistory/99A3DF4B5B99F29720)
[pdfdot]를 이용
pdfdot라는 프로그램을 통해서도 할 수 있습니다.
'-r' 옵션으로 처음 시작 위치를 알아낼 수 있습니다.
처음은 object 2번에서 시작합니다.
![](https://t1.daumcdn.net/cfile/tistory/99EBCB455B99EED524)
'-o' 옵션을 통해 해당 object를 확인할 수 있습니다.
Referencing은 현재 object가 참조하고 있는 다른 object를 가르칩니다.
![](https://t1.daumcdn.net/cfile/tistory/999485455B99EED614)
"Contains stream" 은 스트림 데이터가 존재합니다. 이런 곳에서 원하는 정보를 얻을 수 있습니다.
![](https://t1.daumcdn.net/cfile/tistory/992501455B99EED704)
"-d" 옵션으로 23번 object를 dump 할 수 있습니다.
만약 해당 내용이 encoding되어 있으면 "-f" 옵션으로 decode할 수 있습니다.
![](https://t1.daumcdn.net/cfile/tistory/99F298455B99EED80A)
해당 dump파일을 열어보시면 다음과 같이 잘 나오게 됩니다.
이 정보는 HxD에서도 얻은 정보랑 같습니다.
![](https://t1.daumcdn.net/cfile/tistory/99A090455B99EED913)
"pdfdot"는 pdf가 어떤 식으로 동작하는지 구조를 알 수 있는 유용한 프로그램입니다.
"pdfdot"을 통해 object 다이어그램을 그려보면 아래와 같습니다.
하늘색으로 칠해져 있는 부분이 "Contains stream"이 있는 부분이고, 빨간색 부분이 PDF가 숨겨진 부분입니다.
![](https://t1.daumcdn.net/cfile/tistory/992FB8485B99FEA638)
[참고]
PDF Unlock: https://smallpdf.com/kr/unlock-pdf
PDF 파일 포맷: http://nakyungpapa.tistory.com/142
PDF 파일 포맷: http://panda2122.tistory.com/10